2010-01-14 11 views
50

sto utilizzando plugin di Maven-assemblaggio per creare un vaso della mia applicazione, comprese le sue dipendenze come segue:Maven 2 montaggio con dipendenze: vaso in ambito "sistema" non incluso

<assembly> 
    <id>macosx</id> 
    <formats> 
     <format>tar.gz</format> 
     <format>dir</format> 
    </formats> 
    <dependencySets> 
     <dependencySet> 
      <includes> 
       <include>*:jar</include> 
      </includes> 
      <outputDirectory>lib</outputDirectory> 
     </dependencySet> 
    </dependencySets> 
</assembly> 

(ho omesso qualche altro roba non correlata alla domanda)

Finora questo ha funzionato bene perché crea una directory lib con tutte le dipendenze. Tuttavia, di recente ho aggiunto una nuova dipendenza il cui ambito è system e non la copia nella directory di output lib. devo mancare qualcosa di semplice qui, quindi chiedo aiuto.

La dipendenza che ho appena aggiunto è:

<dependency> 
    <groupId>sourceforge.jchart2d</groupId> 
    <artifactId>jchart2d</artifactId> 
    <version>3.1.0</version> 
    <scope>system</scope> 
    <systemPath>${project.basedir}/external/jchart2d-3.1.0.jar</systemPath> 
</dependency> 

L'unico modo ho potuto includere questa dipendenza è aggiungendo la seguente all'elemento di montaggio:

<files> 
    <file> 
     <source>external/jchart2d-3.1.0.jar</source> 
     <outputDirectory>lib</outputDirectory> 
    </file> 
</files> 

Tuttavia, questo forze per cambiare il pom e il file di assemblaggio ogni volta che questo barattolo viene rinominato, se mai. Inoltre, sembra solo sbagliato.

Ho provato con <scope>runtime</scope> nel dependencySets e <include>sourceforge.jchart2d:jchart2d</include> senza fortuna.

Quindi, come includere un vaso con scope system nel file assembly in Maven 2?

Grazie mille

+0

L'ambito "runtime" non cambierebbe il risultato, perché è il default. – khmarbaise

+0

ho solo spinto jchart2d a Maven centrale! http://sourceforge.net/news/?group_id=50440 - buon divertimento! – halfdan

risposta

68

Non mi sorprende che le dipendenze portata di un sistema non vengono aggiunti (dopo tutto, le dipendenze con un campo di applicazione del sistema devono essere espressamente previste per definizione). In realtà, se proprio non si vuole mettere che la dipendenza nel repository locale (ad esempio perché si vuole distribuirlo come parte del progetto), questo è quello che vorrei fare:

  • vorrei mettere il dipendenza in un "repository di file system" locale per il progetto.
  • mi dichiaro che repository nel mio pom.xml come questo:

    <repositories> 
        <repository> 
        <id>my</id> 
        <url>file://${basedir}/my-repo</url> 
        </repository> 
    </repositories> 
    
  • vorrei solo dichiarare il manufatto, senza la portata system, questa è solo una fonte di guai:

    <dependency> 
        <groupId>sourceforge.jchart2d</groupId> 
        <artifactId>jchart2d</artifactId> 
        <version>3.1.0</version> 
    </dependency> 
    

Non sono sicuro al 100% che soddisfi le tue esigenze, ma penso che sia una soluzione migliore rispetto all'utilizzo del sistema.

Aggiornamento: Avrei dovuto menzionarlo nella mia risposta originale e lo sto aggiustando ora. Per installare una libreria di terze parti nel repository basato su file, utilizzare install:install-file con il parametro localRepositoryPath:

mvn install:install-file -Dfile=<path-to-file> \ 
         -DgroupId=<myGroup> \ 
         -DartifactId=<myArtifactId> \ 
         -Dversion=<myVersion> \ 
         -Dpackaging=<myPackaging> \ 
         -DlocalRepositoryPath=<path-to-my-repo> 

è possibile incollare questo come è in un guscio * nix. Su Windows, rimuovere "\" e mettere tutto su una sola riga.

+0

Ottima idea, ci proverò. – YuppieNetworking

+1

Funzionava, ma non era un compito banale installare il file in un repository locale diverso da $ HOME/.m2/repository. Ho dovuto installare mvn: install-file [... install-file options ...] -Dmaven.repo.local = path_to_my_local_repo che ha costretto Maven a scaricare i suoi plugin di base. Potresti suggerire come installare i file su questo repository locale? – YuppieNetworking

+0

Avrei dovuto dire che :) avrei installato l'artefatto nel repository locale ('~ /.m2/repository') con 'install: install-file' e quindi spostato l'albero delle directory su' $ {basedir}/my-repo'. Dovrei solo eliminare le cose indesiderate da $ {basedir}/my-repo' nel tuo caso. –

19

Btw è possibile automatizzare e renderlo parte della vostra generazione Maven. Quanto segue installerà il vostro vaso in repository locale prima della compilazione:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-install-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>hack-binary</id> 
        <phase>validate</phase> 
        <configuration> 
         <file>${basedir}/lib/your-lib.jar</file> 
         <repositoryLayout>default</repositoryLayout> 
         <groupId>your-group</groupId> 
         <artifactId>your-artifact</artifactId> 
         <version>0.1</version> 
         <packaging>jar</packaging> 
         <generatePom>true</generatePom> 
        </configuration> 
        <goals> 
         <goal>install-file</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
+0

Non supporta l'installazione di più file contemporaneamente? –

+0

Wow, questo è molto bello! grazie mille! @Tuukka Mustonen devi copiare la parte ... per ogni file – timaschew

+5

Purtroppo questo non funziona. Anch'io sono arrivato a questa soluzione, pensando che sembrasse la più semplice, tuttavia Maven richiede che tutte le dipendenze siano risolte _prima_ esecuzione dei plugin legati alla fase 'validate' (che precede' compile', ecc ...). Quindi, una volta installato l'artefatto, lo reinstallerà, ma non eseguirà un'installazione iniziale: si tratta di un problema di pollo/uova. Uno potrebbe collegare questo alla fase 'clean' (poiché non richiede prima la risoluzione delle dipendenze) e dire agli sviluppatori di eseguire prima' mvn clean', ma poi non funziona più usando "procedure standard" immediatamente. – Chadwick

14

trovo facile soluzione nel caso in cui la creazione di vaso

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>2.1.1</version> 
    <configuration> 
    <webResources> 
    <resource> 
     <directory>dependencies/mydep</directory> 
     <targetPath>WEB-INF/lib</targetPath> 
     <filtering>true</filtering> 
     <includes> 
      <include>**/*.jar</include> 
     </includes> 
    </resource> 
    </webResources> 
</configuration> 
</plugin> 
+3

Questo è molto più semplice ... Perché aggiungere al repository locale ecc.? –

+0

Questo è un modo veloce e sporco di fare le cose. Grazie. Una volta al giorno il mondo sarà in buona fede, ma fino ad allora, questo ci salva la vita. – Jacob

+0

IMHO sarebbe più sicuro con il filtraggio: false – ATorras

4

È inoltre possibile gestire questo tramite l'aggiunta di un dependencySet supplementare nelle vostre dependencySets.

<dependencySet> 
    <scope>system</scope> 
    <includes> 
    <include>*:jar</include> 
    </includes> 
    <outputDirectory>lib</outputDirectory> 
</dependencySet> 

La cosa migliore sarebbe quella di utilizzare un Repository Manager (come Nexus, Artifactory, Archiva) e installare questo tipo di dipendenza in un particolare repository. Dopodiché puoi usare cose come una semplice dipendenza. Questo ti semplificherà la vita.

Documenti: https://maven.apache.org/plugins/maven-assembly-plugin/assembly.html

1

Modificato: Mi dispiace che non mi rendevo conto alx accennato anche la soluzione ciclo di vita pulita.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-install-plugin</artifactId> 
    <executions> 
     <execution> 
      <id>hack-binary</id> 
      <phase>clean</phase> 
      <configuration> 
       <file>${basedir}/lib/your-lib.jar</file> 
       <repositoryLayout>default</repositoryLayout> 
       <groupId>your-group</groupId> 
       <artifactId>your-artifact</artifactId> 
       <version>0.1</version> 
       <packaging>jar</packaging> 
       <generatePom>true</generatePom> 
      </configuration> 
      <goals> 
       <goal>install-file</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

Sulla base della soluzione fornita da alx, è possibile eseguire il passaggio del file di installazione in fase di pulizia. ma dal momento che la fase di pulizia non è nel ciclo di vita di default, è necessario eseguire mvn clean alla prima volta al fine di garantire il vaso è pronto nel repository locale.

es: mvn clean; pacchetto mvn

2

Una soluzione semplice per questo è di aggiungere in repository Maven locale

Un modo per farlo è attraverso mvn installare i comandi come suggerito nel post precedente.

Un altro modo semplice è, 1) Nella tua eclissi ide fai clic destro sul progetto seleziona l'opzione Maven. 2) Selezionare installare o distribuire un artefatto a un'opzione repository Maven e cliccare su Avanti. 3) Fare clic su Sfoglia accanto alla casella di controllo file di Artefatto & selezionare il file jar 4) Inserire il GroupId e artifactId e la versione garantire generare pom & creare checksum vengono controllati & confezione è vaso

fare clic su Fine, Wallah !! ! il vostro lavoro è fatto il vaso viene aggiunto nel repository locale, che è possibile definire nella directory setting.xml o m2

Ora basta aggiungere il semplice dipendenza Maven come da GroupId, artifactId & versione vaso di aver immesso come per il importa e questo è il tuo barattolo esterno sarà confezionato da Maven.

+0

Grazie per l'aiuto. Ha funzionato benissimo per me ed è decisamente più semplice rispetto agli altri modi forniti qui. Saluti :) –

Problemi correlati