2014-10-31 17 views
9

Sto costruendo un file jar eseguibile con maven, il che significa che lo esegui con "java -jar file.jar".Maven: aggiungi risorse esterne

Voglio fare affidamento su proprietà definite dall'utente (solo un file contenente chiavi/valori), durante la fase di sviluppo stavo inserendo il mio file "user.properties" nella cartella maven/src/main/resources /.

Il mio file di proprietà viene caricato con:

final Properties p = new Properties(); 
final InputStream resource = IOParametres.class.getResourceAsStream("/user.properties"); 
p.load(resource); 

Ora, voglio mantenere quel file al di fuori del vaso e avere qualcosa di simile:

- execution_folder 
    |_ file.jar 
    |_ config 
     |_ user.properties 

Ho provato molte cose con Maven plugin come maven-jar-plugin, maven-surefire-plugin e maven-resources-plugin ma non riesco a farlo funzionare ...

Grazie in anticipo per il vostro aiuto!

+0

È user.properties solo un file di testo separato che si tiene accanto al jar e che si desidera leggere in fase di runtime? Perché se così fosse ...probabilmente dovresti trattare come qualsiasi altro file esterno. – Deltharis

+0

Sì, è solo un file separato, ma il fatto è 1- Non so dove verranno messi il jar ei file di configurazione dall'utente 2 - I avere altri file di risorse usati dalle dipendenze (connessione DB e altri) – GournaySylvain

+0

Se ti piace il file delle proprietà all'esterno devi impostare classpath in modo che punti alla cartella 'executon_folder/config /' altrimenti non sarai in grado di accedere all'utente '. properties'. Quindi un semplice 'java -jar file.jar' non funzionerà. – khmarbaise

risposta

13

ho trovato quello che mi serviva utilizzando solo la configurazione Maven.

Per prima cosa ho Aggiungi cartella config al percorso di classe:

<build> 
<plugins> 
<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.3.1</version> 
    <configuration> 
     <archive> 
      <manifestEntries> 
       <Class-Path>config/</Class-Path> 
      </manifestEntries> 
     </archive> 
    </configuration> 
</plugin> 
</plugins> 
</build> 

ho caricare le risorse allo stesso modo di prima:

final InputStream resource = IOParametres.class.getResourceAsStream("/user.properties"); 
p.load(resource); 

E se si desidera mantenere i file di risorse di esempio nella tua pronti contro termine e rimuoverli dalla build:

<build> 
    <resources> 
     <resource> 
      <directory>src/main/resources</directory> 
      <excludes> 
       <exclude>user.properties</exclude> 
       <exclude>conf/hibernate.cfg.xml</exclude> 
      </excludes> 
     </resource> 
    </resources> 
</build> 

Accanto al file jar, aggiungo una cartella di configurazione contenente tutti i file di risorse di cui ho bisogno.

Il risultato è:

  • user.properties possono essere caricate utilizzando getResourceAsStream
  • altre biblioteche basandosi su risorse specifiche (non voglio discutere, ma trovo ... non che buona) può caricare le loro risorse senza alcun problema.

Grazie per l'aiuto, e spero che possa aiutare qualcuno un giorno!

+0

Voglio fare lo stesso, ma prima ho bisogno di ottenere la directory di configurazione accanto al file jar. Come raggiungerlo? – SachiDangalla

+0

Non capisco la tua domanda qui ... Nel mio scenario, i file di configurazione non sono stati memorizzati nel file jar (escluso nel file pom.xml). La creazione e la copia dei file di configurazione devono essere gestite sul lato dell'implementazione – GournaySylvain

+0

Sì. Voglio un modo per ottenere la cartella di configurazione al di fuori del vaso senza copyng o incollare manualmente. Come lo hai gestito? – SachiDangalla

1

Come ho detto nel commento, sembra che tu voglia utilizzare il file user.properties semplicemente come un file di testo che si trova oltre al tuo barattolo. In questo caso, è piuttosto semplice utilizzarlo: la directory contenente il file jar è la directory corrente quando è selezionata durante il runtime. Ciò significa che tutto ciò che serve è:

properties.load(new FileInputStream("config/user.properties")); 

senza tentare di inserire nel classpath del progetto.

E se c'è qualcos'altro da fare, sarebbe solo copiando le proprietà dalla directory delle risorse al target per evitare il trambusto di farlo a mano. Ciò può essere ottenuto da Maven-antrun-plugin:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-antrun-plugin</artifactId> 
      <executions> 
       <execution> 
        <phase>generate-resources</phase> 
        <goals> 
         <goal>run</goal> 
        </goals> 
        <configuration> 
         <tasks> 
          <mkdir dir="${project.build.directory}" /> 
          <copy file="${basedir}/src/main/resources/user.properties" tofile="${project.build.directory}/config/user.properties" /> 
         </tasks> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
+0

Capisco la tua soluzione e potrei usarla per alcuni dei miei file, ma nelle mie risorse, Ho anche un "hibernate.cfg.xml" e alcuni altri file che vengono utilizzati da una libreria che chiamo. E questa libreria cerca solo i file di risorse (con una chiamata a _getResourceAsStream_) – GournaySylvain