2010-04-28 20 views
20

Ho un'applicazione Java con la seguente struttura del progetto:Come escludere il file delle proprietà dal file jar?

myProject 
    | 
    |----src 
    |  | 
    |  |--main 
    |  | 
    |  |--resources 
    |   | 
    |   |--userConfig.properties 
    |   |--log4j.properties 
    | 
    |---target 

Sto usando Maven per costruire il mio progetto. Sto usando maven comando per creare file jar come segue:

mvn package -DMaven.test.skip=true 

voglio escludere userConfig.properties file dal mio file JAR così ho aggiornato il mio pom.xml come segue:

<excludes> 
    <exclude>**/userConfig.properties</exclude> 
</excludes> 

ma esclude dal cartella di destinazione in cui risiede il codice compilato. E l'applicazione non verrà eseguita perché non è in grado di trovare il file userConfig.properties.

Qualcuno può aiutarmi?

+0

La tua domanda non ha alcun senso. Dici che vuoi escludere un file, ma poi dici che la tua app non funziona perché il file è escluso. Quindi, perché hai voluto escluderlo in primo luogo? –

+0

Stai usando il framework Spring? –

+0

Sì, Chris Sto usando Spring Framework. –

risposta

9

Dare un'occhiata a this.

<project> 
    ... 
    <build> 
    <plugins> 
     ... 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <version>2.3</version> 
     <configuration> 
      <excludes> 
      <exclude>**/userConfig.properties</exclude> 
      </excludes> 
     </configuration> 
     </plugin> 
     ... 
    </plugins> 
    </build> 
    ... 
</project> 
1

Penso che probabilmente stai già facendo in modo corretto, a seconda di dove si è configurato che escludono (verificare con jar tf quali file sono davvero nel vostro vaso). Molto probabilmente, stai incontrando problemi perché il file non si trova sul classpath e quindi la tua app non riesce a trovarlo. Prova ad aggiungere la directory con il file delle risorse in esso al classpath.

Si potrebbe voler inserire alcune impostazioni predefinite e lasciare che l'applicazione legga nella sua configurazione da un percorso predefinito, per evitare di dover incasinare con il classpath.

38

Ho riscontrato anche questo scenario. In sostanza, si desidera essere in grado di eseguire il codice localmente da Eclipse utilizzando un file userConfig.properties facilmente accessibile, ad esempio all'interno di /src/main/resources. Inoltre, si desidera fornire un JAR eseguibile compilato con un utente esterno userConfig.properties che consente all'utente di configurare l'applicazione senza danneggiare il JAR.

mia implementazione è la seguente: in esecuzione mvn clean install sarà:

  • creare JAR eseguibile con il specificato mainClass
  • esclude tutti .properties file che si trovano nella src/main/resources dalla JAR
  • progetto copia dipendenze in una cartella lib nella radice del progetto
  • copia tutti i file .properties situati in src/main/resources in unCartellanella root del progetto. Nota che questo passaggio è una comodità opzionale per i tuoi utenti del JAR. È possibile richiedere la creazione esplicita di questo file nella directory conf. Questa directory conf viene effettivamente aggiunta al percorso di classe runtime tramite manifest.
  • aggiungere questa cartella conf al manifesto, che fornisce l'accesso ad esso dal vostro JAR eseguibile

Usando questi plugin Maven in congiunzione con l'altro nella configurazione POM vi darà ciò che vi serve. Per quanto riguarda le "migliori pratiche" di questa soluzione; Non ne sono sicuro.

Utilizzando Maven-dipendenza-plugin come segue:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <executions> 
    <execution> 
     <id>copy-dependencies</id> 
     <phase>prepare-package</phase> 
     <goals> 
     <goal>copy-dependencies</goal> 
     </goals> 
     <configuration> 
     <outputDirectory>${project.build.directory}/lib</outputDirectory> 
     <overWriteReleases>false</overWriteReleases> 
     <overWriteSnapshots>false</overWriteSnapshots> 
     <overWriteIfNewer>true</overWriteIfNewer> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

Utilizzando Maven-jar-plugin come segue:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.3</version> 
    <configuration> 
    <excludes> 
     <exclude>**/*.properties</exclude> 
    </excludes>      
    <archive> 
     <manifest> 
     <addClasspath>true</addClasspath> 
     <classpathPrefix>lib/</classpathPrefix> 
     <mainClass>package.path.to.your.main.class.MainClass</mainClass> 
     </manifest> 
     <manifestEntries> 
     <Class-Path>conf/</Class-Path> 
     </manifestEntries> 
    </archive> 
    </configuration> 
</plugin> 

Utilizzando Maven-risorse-plugin come segue:

Utilizzando questa configurazione di progetto, posso eseguire in Eclipse utilizzando una configurazione e fornire ai miei utenti un file di proprietà da configurare, senza che le proprietà passino l'una sull'altra.

+1

Grazie per la soluzione! Mi hai salvato la vita !!! –

+0

Mi piace l'idea del jar eseguibile con classpath correttamente impostato. Forse puoi anche controllare [Maven Assembly Plugin] (http://maven.apache.org/plugins/maven-assembly-plugin/) - L'ho usato per creare zip deliverable con la stessa struttura che hai (con l'eccezione che il mio jar non è eseguibile..yet (-;) - così puoi ottenere lo stesso, sostituendo le risorse e i plugin di dipendenza con l'assembly ... – Betlista

+0

THIS.IS.A.LIFESAVER. – jmcg

Problemi correlati