2015-10-22 13 views
6

Ho un progetto chiamato Parent. Il suo tipo è POM. C'è una biblioteca (ojdbc6.jar) che non è disponibile nel repository pubblico così io sono l'accesso via <SystemPath> come si può vedere in seguito pom.xml:Impossibile accedere alla libreria di progetto padre (jar) nel modulo figlio - 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> 

Ora i nomi di progetto bambino sono Child-Module1 e Child-Module2 uso questo (ojdbc6.jar) biblioteca e 'POM è menzionato qui di seguito:

<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> 

Quando creo usando Maven mi dà errore:

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. 

Perché appare nel repository locale? Accade solo quando il progetto principale contiene una libreria (jar) che contiene il percorso di sistema. Non succede quando la libreria dei percorsi del sistema di accesso (jar) nello stesso progetto, come genitore che fa riferimento a ojdbc6.jar, va bene lì.

+0

Dove si trova il barattolo rispetto ai bambini? La proprietà basedir è un valore diverso in genitore e figli. –

+0

Jar si trova nella cartella lib relativa al progetto padre e maven trasferisce i gess della dipendenza al suo modulo. Presumo che maven converta relativo al percorso assoluto quando include il vaso di dipendenza al modulo figlio. –

risposta

4

Ho risolto il problema aggiornando SystemPath in pom.xml genitore come illustrato di seguito:

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

e quindi aggiungendo la proprietà main.basedir nel genitore pom.xml e repository

<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> 

quindi aggiungere sotto le proprietà e l'elemento repository nel modulo figlio (Il "/ .." viene aggiunto mentre la cartella del modulo figlio risiede nella cartella padre quindi andare su una directory quindi il percorso assoluto sulla cartella genitrice dovrà essere generato come previsto):

<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

[Questa risposta] (http://stackoverflow.com/questions/1012402/maven2-property-that-indicates-the -parent-directory) aiutami a capire il problema, ma la sua risposta non ha risolto il mio problema, quindi ho fatto un po 'di ricerca e sviluppo e ho trovato la soluzione sopra menzionata. –

0

Da: 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

La risposta che hai menzionato ha uno svantaggio e mi chiedo perché la gente lo apprezza. Quando impegni il progetto in un qualsiasi repository SVN in modo che altri sviluppatori possano ottenere e accedere al progetto ecc. Devono eseguire il comando svn install bla bla .. (in ordine di impegnarsi in un repository locale) e se ci sono molti jar non globali-repo, allora è un'attività che richiede tempo. –

+0

Questo non funziona con build multi-modulo, e la domanda dell'OP implica già una certa comprensione di questa strategia –

Problemi correlati