2009-08-31 3 views
57

Se dovessi utilizzare una libreria di terze parti che non era nel repository pubblico di Maven, qual è il modo migliore per includerlo come dipendenza per il mio progetto in modo che quando qualcun altro esegue il check out il mio codice sarà ancora in grado di costruire?Maven: Incluso jar non trovato nel repository pubblico

cioè

My Application "A" dipende jar "B" che non esiste nel repository pubblico. Tuttavia, desidero aggiungere "B" come dipendenza a "A" in modo tale che una persona dall'altra parte del mondo possa verificare il codice ed essere ancora in grado di creare "A"

+0

possibile duplicato di [Posso aggiungere jar a maven 2 build classpath senza installarli?] (Http://stackoverflow.com/questions/364114/can-i-add-jars-to-maven-2-build- classpath-senza-installarli) –

risposta

55

È possibile installare il progetto te stesso.

oppure è possibile utilizzare l'ambito system come la seguente:

<dependency> 
    <groupId>org.group.project</groupId> 
    <artifactId>Project</artifactId> 
    <version>1.0.0</version> 
    <scope>system</scope> 
    <systemPath>${basedir}/lib/project-1.0.0.jar</systemPath> 
</dependency> 

systemPath richiede il percorso assoluto del progetto. Per semplificare, se il file jar si trova all'interno del repository/progetto, è possibile utilizzare la proprietà ${basedir}, che è associata alla radice del progetto.

+0

Questo funziona bene per l'uso di proofing di un jar se non è disponibile in un gestore di repository. – ekillaby

+1

Perché utilizzo questo progetto nel mio progetto web maven, Il progetto non può essere distribuito su tomcat, ma compilato ok. Qualche consiglio? (Non dirmi di installarlo nel repository di Maven), grazie – janwen

+0

Mi hai salvato la giornata, grazie, notnoop. L'aggiunta di jar esterni per proprietà del progetto non funziona in qualche modo. – oohtj

14

L'utilizzo dell'ambito di sistema può funzionare ma non è consigliato nemmeno nelle specifiche Maven. non è portatile.

da Maven libro:

System- Il campo di applicazione del sistema è simile a condizione, tranne che si necessario fornire un percorso esplicito alla JAR sul file system locale. Questo ha lo scopo di consentire la compilazione contro gli oggetti nativi che potrebbero far parte delle librerie di sistema. Si presume che l'artefatto sia sempre disponibile e non sia cercato in un repository. Se si dichiara l'ambito a come sistema, è necessario fornire anche l'elemento systemPath. Si noti che questo ambito non è raccomandato (si dovrebbe sempre provare a fare riferimento alle dipendenze in un repository Maven pubblico o personalizzato ).

L'approccio migliore è installare sul repository locale o sul repository aziendale per essere accessibili a tutti i colleghi.

questo è molto facile se si utilizza un gestore di repository come Nexus.

+0

Se dovessi installarlo nel mio repository locale, in che modo gli altri svilupperebbero il progetto se non avessero accesso al mio repository locale?per esempio, se avessi un'applicazione che ho reso disponibile pubblicamente online e poi tu (rperez) volevi scaricare quel progetto e costruirlo, come accederai al mio repository locale per costruirlo? – digiarnie

+4

è per questo che ho suggerito di utilizzare un repository aziendale. quando hai un ent. repository come Nexus che stiamo usando, funziona in due modi: 1) proxy per gli archivi pubblici - scarica tutte le necessarie librerie di terze parti e memorizzale per l'uso uter 2) archivia tutti gli artefatti della tua organizzazione in aggiunta a te può anche memorizzare librerie che non sono di dominio pubblico. questo repository è accessibile a chiunque tu voglia. puoi metterlo nella rete aziendale o dare un URL pubblico - la tua scelta. – rperez

16

Se si dispone di un progetto padre con un modulo che si trova in questa situazione (richiede una dipendenza non in un repository) è possibile configurare il progetto padre per utilizzare il plugin exec-maven-plug-in per l'installazione automatica del file dipendente. Ad esempio, ho dovuto farlo con il file jar authorize.net poiché non è disponibile pubblicamente.

Parent POM:

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>exec-maven-plugin</artifactId> 
      <version>1.2.1</version> 
      <inherited>false</inherited> 
      <executions> 
       <execution> 
        <id>install-anet</id> 
        <phase>validate</phase> 
        <goals> 
         <goal>exec</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <executable>mvn</executable> 
       <arguments> 
        <argument>install:install-file</argument> 
        <argument>-Dfile=service/lib/anet-java-sdk-1.4.6.jar</argument> 
        <argument>-DgroupId=net.authorize</argument> 
        <argument>-DartifactId=anet-java-sdk</argument> 
        <argument>-Dversion=1.4.6</argument> 
        <argument>-Dpackaging=jar</argument> 
       </arguments> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

Nell'esempio precedente, la posizione del vaso è nella cartella lib del modulo "service".

Quando il modulo del servizio entra nella fase di convalida, il jar sarà disponibile nel repository locale. Basta fare un riferimento nel modo in cui si imposta il groupid, l'artefatto, ecc. Nel genitore principale.Per esempio:

<dependency> 
    <groupId>net.authorize</groupId> 
    <artifactId>anet-java-sdk</artifactId> 
    <version>1.4.6</version> 
</dependency> 
+0

Questa sembra essere la risposta giusta. C'è un modo per installare più dipendenze nell'esempio sopra? – javydreamercsw

+0

Dovresti essere in grado di avere più elementi nel plugin. –

+1

Sono stato in grado di capirlo. Ho spostato la configurazione all'interno della parte di esecuzione e ho avuto più esecuzioni, una per ogni dipendenza. Grazie! – javydreamercsw

0

Se si sta utilizzando Groovy/suite di strumenti Graal (GGTS) allora si può direttamente importare tale terzo dipendenza (ma essere sicuri di avere che la dipendenza di terze parti nel repository locale) usando sotto passaggi:

  1. Passare a Gestione progetti e fare clic con il tasto destro del mouse sul progetto.
  2. Fare clic su importazione opzione.
  3. spendono l'opzione Maven e selezionare installare o distribuire un artefatto in un repository Maven e cliccare su Avanti.
  4. sopracciglia e selezionare che la dipendenza di terze parti utilizzando Artefatto file opzione ed inserire il dettaglio di ID gruppo, Artefatto Id e versione usando pom.xml di file e cliccare su finire

Aspetta un momento e probabilmente l'errore sarebbe andato per quel problema.

1

In generale, è necessario innanzitutto inserire il contenitore di terze parti nel repository locale. Dopodiché puoi usarlo aggiungendo la dipendenza in pom.xml.

Ad esempio.

1.put il barattolo sul suo repository locale prima:

mvn install:install-file -Dfile=<path-to-file> 

Nota: questo comando richiede Maven-install-plugin versione 2.5 o successiva. In caso contrario, è possibile fare riferimento a Here

2. Utilizzare il contenitore aggiungendo la dipendenza nel pom.xml del progetto.
Basta aggiungere questo nel pom.xml del progetto:

<dependency> 
    <groupId>${the groupId in the jar's pom.xml}</groupId> 
    <artifactId>${the artifactId in the jar's pom.xml}</artifactId> 
    <version>${the version in the jar's pom.xml}</version> 
</dependency> 

3.you può allora pacchetto o distribuire il vostro progetto eseguendo mvn package o mvn deploy

Il 3 ° vaso partito apparirà anche nel pacchetto.

+0

In che modo la 'mvn install' riprende i nomi di versione/pacchetto giusti qui? – monojohnny

+0

maven troverà i nomi di versione/pacchetto in pom.xml del jar da installare. @monojohnny –

+0

ah ok - quindi si presume che il JAR che viene aggiunto sia stato generato da Maven (e include anche 'pom.xml') - Penso? – monojohnny