2009-10-15 15 views
12

Mam trzy moduły w moim projekcie Maven (to nieco uproszczona):Dlaczego zależność z zakresem "pod warunkiem" ukryć zależności przechodnie w Maven?

  • modelowych zawiera WZP odnotowany klas encji
  • wytrwałość instancję EntityManager i wywołuje metody na nim
  • Aplikacja tworzy wystąpienia klas w model, ustawia pewne wartości i przekazuje je do wytrwałość

modelowe i wytrwałość oczywiście zależą javax.persistence, ale aplikacyjne nie należy, jak sądzę.

Zależność zostaje przeniesiona do sekcji najwyższego poziomu POM w sekcji dependencyManagement, ponieważ występuje w wielu podmodulach, w których odwołuję się tylko do tego wpisu.

Co mnie zaskakuje, muszę odnieść się do zależności w application, gdy ustawię jej zakres na provided, podczas gdy ja nie muszę, gdy jego zasięg to compile.

Z zakresu provided, jeśli nie zostanie ona umieszczona w dependencies dla aplikacji, kompilacja zakończy się niepowodzeniem z komunikatem o błędzie z javac:

com.sun.tools.javac.code .Symbol $ CompletionFailure: nie znaleziono pliku klasy dla javax.persistence.InheritanceType

Co się dzieje?

+0

Przykro mi, ale ten tytuł wprowadza w błąd. Nie ma nic złego w "dostarczonym" zasięgu i przejściowych zależnościach, niczego nie psuje. –

+0

@Pascal - Nie, nie ma nic * źle * z tym, ale użycie 'provided' powoduje" zerwanie "(lub raczej wyłączenie) przechodniego rozdzielczości, jak ty i james wskazaliście poprawnie. –

+0

@Hanno Nie, nie ma. Zakres wpływa na zależności przechodnie, ale go nie niszczy. –

Odpowiedz

12

modelu i wytrwałości oczywiście zależą javax.persistence, ale aplikacja nie powinna , Myślę.

To prawda. Ale rozwiązywanie zależności przechodnich nie ma nic wspólnego z twoim problemem (i w rzeczywistości, javax.persistence jest zależny od zakresu , application z zasięgiem compile, więc jest pominięty, jak udokumentowano w 3.4.4. Transitive Dependencies).

Moim zdaniem, jesteś ofiarą tego błędu: http://bugs.sun.com/view_bug.do?bug_id=6550655

mam te same problemy z EJB3 podmiot, który korzysta z adnotacji dziedziczenia: @Inheritance(strategy=InheritanceType.SINGLE_TABLE)

Klasa klient za pomocą tego podmiotu nie będzie kompilować , gdy oznaczenia ejb3 są nie w ścieżce klas, ale ulegną awarii z następującym komunikatem: com.sun.tools.javac.code.Symbol$CompletionFailure: class file for javax.persistence.InheritanceType not found

[...]

Należy zauważyć, że jest to szczególny przypadek błędu 6365854 (który jest opisany jako naprawiony); problemem wydaje się być to, że adnotacja używa wyliczenia jako wartości.

Obecne obejście polega na dodaniu brakującego wyliczenia do zmiennej CLASSPATH.

W twoim przypadku "gorszym" sposobem na to byłoby dodanie zależności javax.persistence jako provided do modułu application. Ale to obejście błędu JVM, application nie powinno wymagać tej zależności do kompilacji.

+0

Czy jesteś pewien, że moim problemem nie jest to, że nie przeczytałem poprawnie instrukcji Maven? Może jest błąd, że komunikat o błędzie powinien być inny, ale w każdym razie wymagane pliki klas są ukryte, ponieważ Maven * celowo * nie umieszcza ich w ścieżce klasy. –

+1

Chodzi mi o to, że nie potrzebujesz 'javax.persistence. *' Do kompilowania modułu aplikacji i nie powinien on mieć błędu kompilacji. –

+0

Cóż, jestem zdezorientowany. :) Masz rację, że nie powinienem dostać błędu kompilacji, tak myślę. Przynajmniej to byłoby moje przeczucie. Ale muszę się trochę zastanowić, w jaki sposób moje zasięgi wpływają na siebie nawzajem i czy naprawdę groguję przy stole, z którym się łączyłeś. –

1

Sekcja dependencyManagement deklaruje co Zależności będzie wyglądać jeśli ich używać, a nie, że będzie z nich korzystać. Nadal musisz zadeklarować minimalną deklarację zależności, aby konfiguracja została zastosowana w twoim projekcie podrzędnym. Aby uzyskać szczegółowe informacje, zapoznaj się z dependency management section książki Maven.

Wymagane minimum to zazwyczaj ID grupy i ID artefaktu.

Jeśli chcesz dziedziczą konfigurację bez deklarowania go w ogóle, należy je określić w dependencies sekcji rodzica zamiast dependencyManagement

+0

Tak, wiem o tym. Zastanawiam się tylko, dlaczego ten moduł jest w ogóle zależny od 'javax.persistence', skoro jest to tak naprawdę przejściowa zależność, którą powinien rozwiązać Maven? Spróbuję trochę wyjaśnić mój post. –

+0

@Hanno Nie, nie powinno. Zobacz moją odpowiedź. –

2

umm, ponieważ dostarczone zależności nie są przechodnie? to wbudowane zachowanie dla maven'a.

+0

umm - masz rację. duh. –

+1

To nie jest absolutnie dokładne. Jeśli 'projekt-a' zawiera zależność od określonego projektu na podstawie' projektu-b', która zawiera zależność od określonego projektu na podstawie 'projektu-c', to' projekt-c' byłby zależnością przechodzącą od predykatu 'projekt-a'. Ponownie zobacz http://www.sonatype.com/books/maven-book/reference/pom-relationships-sect-transitive.html#pom-relationships-sect-transitive-scope –

+0

@Pascal - wow, nauczysz się czegoś nowego codziennie! nie sądzę jednak, abym kiedykolwiek napotkał ten mały samorodek w rzeczywistym projekcie. – james

Powiązane problemy