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:
... e tam, w IntelliJ IDEA 7.0.4 nie mam żadnych problemów z Maven 2.0.9 ;-)
Trzeba używać odpowiedniego środowiska :P
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.
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ę...
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 ;)
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...
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.
Coś jest nie tak, zjadło mój poprzedni komentarz... :-(
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.
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.
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ć ;-)
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
Prześlij komentarz