2015-10-22 33 views
6

Mam projekt o nazwie Parent. Jego typ to POM. Jest biblioteka (ojdbc6.jar), który nie jest dostępny w repozytorium publicznych tak mam dostępu do niego poprzez <SystemPath> jak widać poniżej pom.xml:Nie można uzyskać dostępu do nadrzędnej biblioteki projektu (jar) w module podrzędnym - Maven

<project> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.Parent</groupId> 
    <artifactId>Parent</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>pom</packaging> 

    <modules> 
     <module>childModule</module> 
    </modules> 

    <dependencies> 
     <dependency> 
      <groupId>com.oracle</groupId> 
      <artifactId>ojdbc</artifactId> 
      <version>6</version> 
      <scope>system</scope> 
      <systemPath>${basedir}/lib/ojdbc6.jar</systemPath> 
     </dependency> 
    </dependencies> 

    <repositories> 
     <repository> 
      <id>in-project</id> 
      <name>In Project Repo</name> 
      <url>file://${basedir}/lib</url> 
     </repository> 
    </repositories> 

Teraz nazwy projektu dziecko są dzieci Module1 i dzieci Module2 użycie tego (ojdbc6.jar) biblioteka to POM jest wymienione poniżej:

<project> 
    <modelVersion>4.0.0</modelVersion> 

    <artifactId>testApp</artifactId> 
    <version>1.14.5.1-SNAPSHOT</version> 
    <packaging>war</packaging> 
    <name>APP1</name> 
    <description>Application</description> 

    <parent> 
     <groupId>com.Parent</groupId> 
     <artifactId>Parent</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
    </parent> 
</project> 

Kiedy buduję używając Mavena, pojawia się błąd:

Description Resource Path Location Type 
The container 'Maven Dependencies' references non existing library 
'C:\Users\ABCCOMPUTER_NAME\.m2\repository\com\oracle\ojdbc\6\ojdbc-6.jar' 
testApp Build path Problem. 

Dlaczego wygląda w lokalnym repozytorium? Dzieje się tak tylko wtedy, gdy projekt nadrzędny zawiera bibliotekę (jar) zawierającą ścieżkę systemową. Nie dzieje się tak, gdy biblioteka ścieżek dostępu do systemu (jar) w tym samym projekcie, np. Rodzic odnoszący się do ojdbc6.jar, jest w porządku.

+0

Gdzie znajduje się słoik względem dzieci? Właściwość basedir ma inną wartość w rodzicu i dzieciach. –

+0

Jar znajduje się w folderze lib w stosunku do projektu nadrzędnego i maven trasfer słoiczki zależności do swojego modułu. Zakładam, że konwersja maven w stosunku do ścieżki bezwzględnej, gdy zawiera słoik zależności do modułu potomnego. –

Odpowiedz

4

I rozwiązany przez aktualizację SystemPath w macierzystej pom.xml jak pokazano poniżej:

<systemPath>${main.basedir}/lib/ojdbc6.jar</systemPath> 

a następnie dodając właściwość main.basedir w rodzica pom.xml i repozytorium

<properties> 
     <main.basedir>${project.basedir}</main.basedir> 
    </properties> 
<repositories> 
     <repository> 
      <id>in-project</id> 
      <name>In Project Repo</name> 
      <url>file://${main.basedir}/lib</url> 
     </repository> 
</repositories> 

następnie dodanie poniżej elementu właściwości i repozytoriów w module podrzędnym (Dodaje się "/ ..", ponieważ folder modułu podrzędnego znajduje się w folderze nadrzędnym, a więc przejdź do jednego katalogu, a reszta ścieżki bezwzględnej do folderu folderu nadrzędnego będzie generowana zgodnie z oczekiwaniami):

<properties> 
     <main.basedir>${project.basedir}/..</main.basedir> 
    </properties> 
<repositories> 
      <repository> 
       <id>in-project</id> 
       <name>In Project Repo</name> 
       <url>file://${main.basedir}/lib</url> 
      </repository> 
    </repositories> 
+0

[Ta odpowiedź] (http://stackoverflow.com/questions/1012402/maven2-property-that-indicates-to -parent-directory) pomógł mi rozwiązać problem, ale jego odpowiedź nie rozwiązała mojego problemu, więc zrobiłem trochę badań i rozwiązań i wymyśliłem rozwiązanie opisane powyżej. –

0

Od: https://stackoverflow.com/a/2230464/1490322

Finally, declare it like any other dependency (but without the system scope):

<dependency> 
    <groupId>your.group.id</groupId> 
    <artifactId>3rdparty</artifactId> 
    <version>X.Y.Z</version> 
</dependency> 
+0

Odpowiedź, którą wymieniłeś ma swoją wadę i zastanawiam się, dlaczego ludzie ją doceniają. Kiedy powierzysz projekt dowolnemu repozytorium SVN, aby inni programiści mogli uzyskać dostęp do projektu itp. Muszą uruchomić polecenie svn install bla bla .. (w celu dokonania zatwierdzenia w lokalnym repozytorium) i jeśli istnieje wiele słoików o repozytorium innym niż globalny, zadanie to jest czasochłonne. –

+0

To nie działa z wielomodułowymi kompilacjami, a pytanie OP sugeruje już zrozumienie tej strategii. –