2012-02-21 18 views
22

Sto utilizzando una libreria che utilizza Maven per compilare e testare.
Sono stato in grado di compilare la libreria senza problemi. Durante la compilazione, sembrava come se avesse scaricato tutte le dipendenze della libreria.Raccolta delle dipendenze transitive della dipendenza basata su Maven su un percorso di classe del progetto non Maven

Ora, sto cercando di utilizzare la libreria nel mio progetto. Quando ho compilato la libreria, ho scoperto che una cartella denominata target è stata creata nella cartella della libreria e all'interno di quella cartella c'era un'altra cartella denominata classes. Ho aggiunto la cartella classes al mio classpath. Tuttavia, ogni volta che provo ad usare quella libreria nel mio progetto che non usa Maven, dice che non può trovare le dipendenze di quella libreria.

Come si aggiungono tutte le dipendenze di tale libreria al classpath?
Devo andare e scaricare manualmente tutte le dipendenze della libreria e aggiungerle al classpath?
C'è un modo in cui posso farmi fare da Maven per me?
Cosa devo fare per utilizzare la libreria nel mio progetto?

Il mio progetto si trova in una directory completamente separata rispetto alla libreria. In questo momento, il mio progetto sembra essere in grado di caricare correttamente i file della libreria, ma non solo le dipendenze della libreria.

+4

+1, domanda molto importante per i principianti. –

risposta

14

Quando è stato eseguito mvn install per quella libreria, è necessario aver creato un file jar e inserirlo in target/libaryname-version.jar. Sarebbe meglio dipendere da questo jar finale invece del contenuto della cartella classes. Maven ha anche l'obiettivo di scaricare tutte le dipendenze di un progetto. È possibile eseguire

mvn dependency:copy-dependencies 

all'interno della cartella delle librerie e sarà copiare tutti i barattoli di dipendenza a target/dependency. Per impostazione predefinita, verranno inclusi anche i jar necessari solo per i test, per escluderli è possibile utilizzare

mvn dependency:copy-dependencies -DincludeScope=runtime 
+2

Cool hack!Ha funzionato per me, ma il mio bisogno era leggermente diverso. Nel mio caso, è stato sufficiente per ottenere il classpath. È possibile generare classpath e inviarlo a un file in risorse, che è possibile utilizzare in un secondo momento. il codice è qui ' \t \t \t \t org.apache.maven.plugins \t \t \t \t Maven-dipendenza-plugin \t \t \t \t generare sorgenti accumulo classpath \t \t \t $ {project.basedir}/src/main/resourc es/classpath ' – raxith

+0

@raxith invia questa come risposta personale, la sezione codice è troppo lunga per essere interpretata. –

+0

@ Jörn Horstmann Quindi, dopo aver eseguito l'obiettivo di dipendenza dalla copia, per eseguire il codice dobbiamo eseguire il target 'java -cp" \ *; target \ dependency \ * "com.myCompany.App' dalla cartella del progetto? –

4

Beh, ci sono un paio di problemi al lavoro qui. Maven fa il duro lavoro di capire tutte le dipendenze necessarie per la tua biblioteca da costruire e scaricarle. Queste dipendenze vengono archiviate localmente nel repository Maven (<user home>/.m2/repository), ma a meno che non siano necessarie come parte di un assembly, non le troverai nella cartella target. Almeno, non di default. Quello che dovete fare prima è ottenere Maven per memorizzare tutte le dipendenze nella cartella build (questo estratto POM è stato cribbed da another SO post):

<project> 
... 
    <profiles> 
     <profile> 
      <id>qa</id> 
      <build> 
       <plugins> 
        <plugin> 
         <artifactId>maven-dependency-plugin</artifactId> 
          <executions> 
           <execution> 
            <phase>install</phase> 
            <goals> 
             <goal>copy-dependencies</goal> 
            </goals> 
            <configuration> 
             <outputDirectory>${project.build.directory}/lib</outputDirectory> 
            </configuration> 
           </execution> 
          </executions> 
        </plugin> 
       </plugins> 
      </build> 
     </profile> 
    </profiles> 
</project> 

Con i cambiamenti POM sopra indicati si dovrebbe ora essere in grado di ottenere tutti i JAR dipendenze richieste dalla libreria e includerle nel percorso di classe (da target/lib). Suggerirei di copiarli in un'altra cartella sulla workstation, poiché la cartella target verrà aggiunta a zero ogni volta che si esegue l'obiettivo clean per le librerie Maven build.

Detto questo, perché non adattare il progetto anche a Maven? Quindi tutto quello che dovresti fare è includere il JAR di primo livello come dipendenza dal tuo POM, e Maven gestirà tutte le sue dipendenze secondarie? Questo è il potere di Maven dopo tutto - sarebbe a tuo vantaggio sfruttarlo.

In ogni caso, buona fortuna con qualsiasi dei due approcci selezionati.

Problemi correlati