2011-09-22 13 views
6

ho il seguente scenario:progetto Maven con la dipendenza originaria e la copia di file

mylib è una libreria (per il quale ho le fonti, quindi mi piacerebbe metterli in un progetto mylib Maven: mylib per esempio). Questa libreria ha una dipendenza jar per cui ho solo il jar, e non si trova nel repository Maven (e NON voglio installarlo neanche lì). Per farlo compilare, qualcosa di simile funzionerebbe: aggiungi il file jar al progetto mylib in una cartella "lib", ad es. "lib/thirdpartylib.jar" e in pom.xml di mylib, aggiungi una dipendenza con gruppo/artefatto/versione auto scelti e una voce "<scope>system</scope><systemPath>${project.basedir}/lib/thirdpartylib.jar</systemPath>". Il progetto mylib verrà compilato correttamente.

Nota che mylib ha anche una dipendenza runtime da un file dll, ad esempio thirdparty.dll. Ma per la compilazione questo non è importante.

Tuttavia, ora Quello che mi chiedo come realizzare i seguenti:

Eventuali altri progetti, ad esempio, progetto "X", che utilizza mylib, avrà bisogno del

- mylib.jar 
- thirdpartylib.jar 
- thirdpartylib.dll 

,

e dovrete impostare il java.library.path nella directory (ad esempio "") tale che il vaso di terze parti e la DLL vengono trovati dalla VM in esecuzione.

La mia preoccupazione è questa: vorrei che le cose di jar/dll di terze parti fossero responsabilità del progetto mylib. Cioè Voglio definire la conoscenza, che è necessario copiare il jar e la DLL di terze parti nella cartella di destinazione e che java.library.path si riferisce a loro, per far parte del progetto mylib (mylib pom sa come deve essere utilizzato in altri progetti). Tuttavia, voglio questa conoscenza (ad esempio, le istruzioni di copia, indipendentemente da come sono fatte esattamente in Maven) per essere passivamente trasferite a qualsiasi altro progetto usando mylib, come ad esempio X. È in qualche modo possibile?

[La mia soluzione di hacking per ora sarebbe che ho una copia delle cose di terze parti in X, ma anche allora non so come copiare/gestire il file dll, quindi dovrei scrivere un readme che dice che il file dll deve essere copiato nella cartella bin della VM in esecuzione).

Qualsiasi suggerimento è apprezzato!

risposta

2

L'idea di base è la seguente:

  • Maven è buono nella gestione con un risultato per Maven POM.
  • È possibile avere librerie e dipendenze di queste librerie solo nei repository locali.

Così si hanno a che fare le seguenti operazioni:

  1. Definire per la libreria aggiuntiva un progetto separato (o un modulo nel progetto) e definire la biblioteca come risultato.
  2. Modifica il tuo POM in modo che questo POM abbia ora una dipendenza dal nuovo progetto.
  3. Eseguire gli stessi passaggi per la DLL (vedere il post Managing DLL dependencies with Maven) come farlo).
  4. Distribuire la libreria aggiuntiva e la DLL nel repository locale.

Ora dovresti essere in grado di utilizzare nuovamente Maven per il processo di generazione e utilizzando plug-in aggiuntivi come lo maven-assembly-plugin, puoi riunire tutti insieme.

13

Io suggerirei di trasformare i file in moduli Maven, installandoli nel repository locale utilizzando il Maven install plug-in

mvn install:install-file \ 
    -DgroupId=com.demo \ 
    -DartifactId=thirdpartylib \ 
    -Dversion=1.0 \ 
    -Dfile=thirdpartylib.jar 

mvn install:install-file \ 
    -DgroupId=com.demo \ 
    -DartifactId=thirdpartylib-runtime \ 
    -Dversion=1.0 \ 
    -Dpackaging=dll 
    -Dfile=thirdpartylib.dll 

Una delle cose meravigliose di questo approccio è che il Maven POM verrà generato automaticamente.

Il mylib progetto ora dichiara i moduli di terze parti come dipendenze normali nel suo file di POM:

<dependencies> 
    <dependency> 
     <groupId>com.demo</groupId> 
     <artifactId>thirdpartylib</artifactId> 
     <version>1.0</version> 
    </dependency> 
    <dependency> 
     <groupId>com.demo</groupId> 
     <artifactId>thirdpartylib-runtime</artifactId> 
     <version>1.0</version> 
     <scope>runtime</scope> 
    </dependency> 
</dependencies> 

Ora, quando il modulo mylib è referenziato da altri moduli (come dipendenza) i moduli di terze parti sarà anche essere scaricato come dipendenze transitive.

+0

I stick with you're solution, grazie amico. – mtrovo