2011-02-05 11 views
12

Ho bisogno di utilizzare una libreria JAR di terze parti nel mio progetto (in realtà è Dresden OCL for Eclipse) che non è fornito come un artefatto Maven. Invece, è solo un file JAR scaricabile. Posso istruire Maven a usare questo file JAR nello stesso modo in cui sto usando <dependencies>? Suppongo che ci dovrebbe essere qualche plugin per questo scopo?C'è qualche plugin che abilita il caricamento/utilizzo delle dipendenze non Maven?

ps. Non voglio aggiungere 35Mb di binari di terze parti nel mio repository SVN.

sarebbe bello averlo configurato in questo modo:

<build> 
    <plugins> 
    <plugin> 
     <groupId>com.example</groupId> 
     <artifactId>non-maven-dependencies-injector</artifactId> 
     <configuration> 
     <libraries> 
      <library>http://www.example.com/something*.jar</library> 
      <library>http://www.example.com/something-else*.jar</library> 
     </libraries> 
     </configuration> 
    </plugin> 
    <plugins> 
</build> 

E questo plugin sarebbe 1) scaricare questi file JAR, e 2) aggiungerli come dipendenze in pom.xml. Forse questo plugin potrebbe memorizzarli da qualche parte in ~/.m2/temp/ ...

risposta

4

Sì. Questo (usando dipendenze non Mavenized) è supportato dal maven-external-dependency-plugin.

Esempio:

<artifactItem> 
    <groupId>jwbroek.cuelib</groupId> 
    <artifactId>cuelib</artifactId> 
    <version>${cuelib-version}</version> 
    <packaging>jar</packaging> 
    <downloadUrl>http://cuelib.googlecode.com/files/cuelib-${cuelib-version}.jar</downloadUrl> 
    <checksum>d03b6b960b3b83a2a419e8b5f07b6ba4bd18387b</checksum> 
</artifactItem> 

Può anche extract artifacts from zip files:

<artifactItem> 
    <groupId>mediautil</groupId> 
    <artifactId>mediautil</artifactId> 
    <version>${mediautil-version}</version> 
    <packaging>jar</packaging> 
    <install>true</install> 
    <force>false</force> 
    <downloadUrl>http://downloads.sourceforge.net/project/mediachest/MediaUtil/Version%201.0/mediautil-1.zip</downloadUrl> 
    <checksum>aa7ae51bb24a9268a8e57c6afe478c4293f84fda</checksum> 
    <extractFile>mediautil-${mediautil-version}/mediautil-${mediautil-version}.jar</extractFile> 
    <extractFileChecksum>e843cd55def75dce57123c79b7f36caca4841466</extractFileChecksum> 
</artifactItem> 
+0

Come faresti funzionare in Android Studio utilizzando l'esempio precedente? – zoonosis

12

sì è possibile installarlo nel vostro repository locale con Maven-installazione plug

mvn install:install-file -Dfile=your-artifact-1.0.jar \ 
         -DgroupId=org.some.group \ 
         -DartifactId=your-artifact \ 
         -Dversion=1.0 \ 
         -Dpackaging=jar \ 
         -DgeneratePom=true 

Se volete che i vostri altri membri del team siano in grado di scaricare dipendenza senza doverli installare, è necessario impostare il proprio repository di risorse e distribuire l'artefatto con maven-deploy-plugin nello stesso modo in cui lo si è installato localmente.

+0

Grande, io non conoscevo generatePom = true fino ad ora. Questo ti fa risparmiare il messaggio informativo che il tecnico non è riuscito a trovare. – Boris

+0

@ Boris quindi non esitate a votare per la mia risposta – lweller

+0

Hai ragione. Fatto. – Boris

0

È possibile installarlo localmente o distribuirlo nell'archivio locale (ad esempio in tutta l'azienda). Se si utilizza un esperto di dipendenza non riesce a trovare nei repository configurati, ma anche ti dà i comandi necessari:

Quindi, installare con il comando: mvn installare: installare file -DgroupId = mygid -DartifactId = myaid -Dversion = 1.0 -Dpackaging = vaso -Dfile =/path/to/file

In alternativa, se si ospita il proprio repository È possibile distribuire il file c'è: mvn deploy: distribuire file -DgroupId = mygid -DartifactId = myaid -Dversion = 1.0 -Dpackaging = jar -Dfile =/percorso/to/file -Durl = [url] -DrepositoryId = [id]

Nota: in questo modo si aggiunge solo .jar al repository, non ci sarà alcun pom insieme a esso per specificare le dipendenze dei transitori. Quindi, se la libreria di terze parti ha dipendenze proprie, dovrai aggiungerle manualmente al tuo pom.xml in quanto non ci sarà alcuna risoluzione automatica.

+0

BTW: Potrebbe essere stato trovato da una ricerca su Internet per "Maven third-party". – Boris

2

È possibile utilizzare il "sistema" -scope nella vostra pom.xml per dipendenze da librerie locali:

sistema
Questo ambito è simile a condizione, tranne che si deve fornire la JAR, che contiene in modo esplicito. L'artefatto è sempre disponibile e non è cercato in un repository .

systemPath
viene utilizzato solo se l'ambito di dipendenza è di sistema. Altrimenti, la compilazione fallirà se questo elemento è impostato. Il percorso deve essere assoluto, quindi è consigliabile utilizzare una proprietà per specificare il percorso specifico della macchina (più sulle proprietà di seguito), come $ {java.home}/lib. Poiché si presuppone che le dipendenze dell'ambito di sistema siano installate a priori, Maven non controllerà i repository per il progetto, ma controllerà invece che il file esista. In caso contrario, Maven fallirà la build e suggerirà di scaricarlo e installarlo manualmente.

<dependency> 
    <groupId>some.id</groupId> 
    <artifactId>artifact</artifactId> 
    <version>1.2.3</version> 
    <scope>system</scope> 
    <systemPath>${basedir}/path/to/jarFile.jar</systemPath> 
</dependency> 

per quanto ne so, è possibile utilizzare più o meno quello che vuoi per groupId, artifactId e la versione. Vedi domanda Maven System Depencies e this.

+0

dove si dovrebbe trovare il file 'jarFile.jar'? Chi dovrebbe metterlo lì? Eseguo il checkout di un progetto da SVN ed eseguo 'mvn package'. Da dove verrà questo file? – yegor256

+0

$ {basedir} in < systemPath> punti alla radice del progetto (dove è pom.xml). Non sicuro al 100% su questo, ma probabilmente è necessario posizionare i file in una "cartella di origine" (come sotto src/main/resources) affinché vengano rilevati da "pacchetto mvn". L'ho usato una volta forse sei mesi fa, quindi i dettagli sono già sfocati. Tuttavia, ha funzionato, ma poi abbiamo deciso di utilizzare semplicemente la route 'mvn install' per inserire le nostre librerie negli archivi locali, quindi non abbiamo avuto bisogno di copiare sempre nuove versioni della libreria sull'altro progetto. – esaj

0

"mvn install: install-file" menzionato qui ti aiuterà a installare i file nel tuo repository locale. Tuttavia, se si desidera rendere questi jar successivamente disponibili per gli sviluppatori sul progetto automaticamente, copiare i pezzi rilevanti in un repository disponibile a tutti nel progetto e rendere questo repository disponibile usando il tag, ad esempio controllando tutti i file nel SVN. Vedere http://code.google.com/p/codebistro/wiki/BuildNumber#Maven_Plugin_Example che si riferisce ad un repository ospitato SVN ad esempio.

P.S. Buon viaggio allo SV!

+0

Felice di vederti qui :) La procedura di "copiare i pezzi rilevanti in un repository disponibile per tutti" è fatta da chi? È automatizzato in qualche modo? Come ho detto nella domanda, ci sono più di 30 file nella libreria che userò. Dovrei copiarli tutti manualmente? E cosa succede quando vengono aggiornati? Chi li copierà di nuovo? :) Dai un'occhiata a (dependency-copy) (http://maven.apache.org/plugins/maven-dependency-plugin/copy-mojo.html), "copia un elenco di risorse dal repository in posizioni definite "Ho bisogno esattamente del contrario:" dalle posizioni al repository "... – yegor256

+0

@Yegor Avevo uno script con un po 'di installazione di mvn: install-file's che supera tutti gli artefatti esterni e li inserisce. specificare -DlocalRepositoryPath = per installarlo direttamente nel tuo repository.Fustosamente, non vedi un modo per automatizzarlo ulteriormente. –

2

Considerando che il tuo esempio Dresden OCL ha più di 20 file JAR e devi distribuirlo a molti sviluppatori, la soluzione migliore sarebbe installare un gestore di repository da qualche parte (come nexus o artifactory), prenditi il ​​tuo tempo per caricare questi 20 contenitori per quel repository e usarli. La cosa migliore sarebbe metterli in un groupId privato, quindi se verranno pubblicati in un repository m2 qualche volta, non si finirà con conflitti di nome.

Un altro punto, sarebbe chiedere ai manutentori OCL di Dresda, se possono offrire un deposito di m2. Ora che m2eclipse è un progetto di incubazione di eclissi, questo potrebbe interessare più persone.

0

Ecco un approccio diverso che consentirà di aggiungere un repository Maven all'interno della directory del progetto, utilizzarlo come repository in proprio pom.xml e condividere il repository su SVN con chiunque verifichi il progetto. Crosspost from here.

Nella directory del progetto, creare una cartella denominata repo, che verrà utilizzata come repository Maven basato su cartella.

Aggiungere il seguente repository di file al progetto pom.xml:

<repositories> 
    <repository> 
     <id>file.repo</id> 
     <url>file://${project.basedir}/repo</url> 
    </repository> 
</repositories> 

distribuire il vaso esterno (s) al repository di file con il seguente comando:

mvn deploy:deploy-file 
-Durl=file:///absolute/path/to/your-project/repo \ 
-DrepositoryId=file.repo \ 
-Dfile=path-to-your.jar \ 
-DgroupId=some.external.project.group \ 
-DartifactId=the-artifact-name \ 
-Dversion=1.0 \ 
-Dpackaging=jar; 

A seguito di questo si può solo aggiungere una normale dipendenza dal jar nel tuo progetto pom.xml, usando i valori per groupId, artifactId e la versione che hai passato sopra. È quindi possibile aggiungere la cartella Repo a SVN e confermare le modifiche al numero pom.xml. Qualsiasi sviluppatore che verifichi il tuo progetto sarà ora in grado di utilizzare la stessa dipendenza senza alcuno sforzo.

+0

"impacchetta le tue classi come un jar e distribuiscile" - chi lo farà? Io cambio la piattaforma di integrazione/build? – yegor256

+0

@ yegor256: Whoops, mi dispiace, quello era un errore di copia-incolla dal postare la stessa soluzione a due domande diverse. (Vedi la mia modifica sopra) Nel tuo caso basta distribuire il jar esterno al file repository con lo stesso comando. Non è necessario modificare o impacchettare nessuno dei tuoi proprio codice! – Tim

+0

Lo stesso problema: ho bisogno di "distribuire i vasi" manualmente. Sto cercando di trovare un meccanismo completamente automatico, che scaricherà, distribuirà, installerà e renderà disponibili i jar per la build di maven. – yegor256

0
I think the below answer will help you...just place jar files on your SVN and tell them all to e synch with SVN and here the ${lib.directory} will be t he local path 

<plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-install-plugin</artifactId> 
        <version>2.4</version> 
        <executions> 
         <execution> 
          <id>db2jcc9</id> 
          <phase>compile</phase> 
          <goals> 
           <goal>install-file</goal> 
          </goals> 
          <configuration> 
           <groupId>com.ibm</groupId> 
           <artifactId>db2jcc</artifactId> 
           <version>9</version> 
           <packaging>jar</packaging> 
           <file>${lib.directory}\db2jcc-9.jar</file> 
          </configuration> 
         </execution> 
         </executions> 
    <plugin> 
Problemi correlati