Do you speak Java?

poniedziałek, 15 września 2008

Pakiety - maven swoje, java swoje

Ostatnio w pracy zaobserwowałem bardzo dziwną rzecz. W Eclipse miałem zaimportowany projekt zarządzany przez mavena2 którego wiele klas moje IDE oznaczało pięknym czerwonym krzyżykiem. Według Eclipse zadeklarowane w klasach pakiety (logiczne*) różniły się od katalogów w których były one umieszczone (pakiety fizyczne*). "Co jest" - pomyślałem -"przecież 3 minuty temu budowałem ten projekt i maven nie zgłosił mi żadnego >>ale<<".

Wszedłem więc ponownie do linii koment i wpisałem "mvn clean install". I co? Nic.. widzę na własne oczy "Success". Jak bym nie zobaczył, to bym nie uwierzył. Po krótkim zbadaniu sprawy i paru testach okazało się, że maven2 (a konkretnie 2.0.9 - innych nie sprawdzałem), kompletnie nie zwraca uwagi na pakiety fizyczne. i w katalugu "target" buduje po prostu ścieżke zgodnie z pakietem logicznym.

Dość frustrujący błąd, zwłaszcza gdy chcemy coś zdebudować, a tu nic z tego... można stracić kilka cennych chwil zastanawiając się nad tym co jest nie tak. Miejmy nadzieje, że w najbliższej wersji zostanie to naprawione!

Miejcie się na baczności :)

* to moje nazewnictwo. nie wiem czy ktoś przede mną go używał. jeśli uważacie że jest błędne to z chęcią wysłucham ciepłych słów krytyki :)

12 komentarzy:

Łukasz Lenart pisze...

... e tam, w IntelliJ IDEA 7.0.4 nie mam żadnych problemów z Maven 2.0.9 ;-)

Trzeba używać odpowiedniego środowiska :P

Michal Margiel pisze...

Akurat w tej sprawie IDE nie ma nic do gadania. Wszak to maven wykonuje swoje fazy a nie eclipse.
Zresztą, jak to zaznaczyłem w poście - polecenia wykonywałem z CMD nie zaś z pluginu.

Łukasz Lenart pisze...

U mnie, czy z linii komend, czy z poziomu IDE to nie ma znaczenia, działa jak trzeba, chociaż z ciekawości "podłubię", może coś znajdę...

Michal Margiel pisze...

Sprawdź!
Ale szczerze mówiąc to nie ma szans na inny wynik :) opisany przeze mnie błąd występuje niezależnie nie tylko u mnie i nie tylko w Polsce ;)

Łukasz Lenart pisze...

Po komendzie mvn clean install dostaję target/classes ze wszystkimi pakietami tak jak powinno być, w tym samym katalogu mam również wszystkie zasoby, które powinny być na classpath (*.properties, *.xml) więc wszystko ok, może masz jakieś dziwne ustawienia w pom.xml?

Przecież normalnie wszystko co jest poniżej src/main/java jest traktowane jako struktura pakietów, więc czegoś nie rozumiem...

Michal Margiel pisze...

No właśnie chyba nie zrozumiałeś o co chodziło w moim poście :) moze się po prostu niezbyt dokladnie wyraziłem.
jeszcze raz:

mam sobie projekt zarządzany przez mavena, a w nim niepoprawną "pakietowo" klase. która wygląda następująco:

package sierotka.marysia;
public class A{
}

czemu jest nieprawidłowa? ano bo znajduje się w katalogu:
src
.|-main
....|-java
........|-krolewna
.............|-sniezka
..................|-pakiet A.java

Jak widzisz klasa fizycznie znajduje się w innym katalogu niż pakiet który został zadeklarowany ("sierotka.marysia" vs "krolewna.sniezka")

teraz wywołujemy sobie
maven clean install

Build przechodzi prawidłowo - to pierwsze co kuje w oczy, zaś w katalogu target mamy:
target
..|-classes
.......|-sierotka
............|-marysia
.................|-A.class

Jak widzisz maven nie zwraca uwagi na strukture katalogów, tylko na definicje w klasie. i o to dokładnie mi chodziło w moim wpisie.

Łukasz Lenart pisze...

Coś jest nie tak, zjadło mój poprzedni komentarz... :-(

Łukasz Lenart pisze...

A więc...

Faktycznie chyba coś tu nie rozumiałem jak trzeba.

Jednak uważam zachowanie Mavena za prawidłowe, fakt że powinien zgłosić wcześniej, że pakiet fizyczny nie odpowiada logicznemu.

I tak samo Eclipse powinien to zgłosić, dziwne zachowanie.

Michal Margiel pisze...

Eclipse zachowuje się przwidłowo, czyli zgłasza w tych klasach błedy. a maven moim zdaniem bardzo źle. Powinien się wywalić podczas fazy compile.

Łukasz Lenart pisze...

Ciekawe skąd to wynika, Maven używa bezpośrednio tools.jar, Eclipse też, ale widocznie wpierw wykonuje walidację i stąd komunikat.

Ciekawe czy jest to w ogóle możliwe, wydaje mi się, że nie ale tu trzeba spojrzeć do źródeł Mavena, może trzeba spróbować ;-)

a pisze...

No i co? zgłosiłeś błąd? Jak maven jest rozwijany? zainteresowali się tym? Wszak quick fix nie powinien być jakiś trudny do wykonania ( Tak wygląda... )


Racjonalny Developer

Unknown pisze...
Ten komentarz został usunięty przez autora.