Ho un file app.properties
nel mio progetto Maven nella cartella resources
come mostrato qui (semplificato):.properties carico da IDE e anche al di fuori dei JAR
myApp |----src | | | |--main | |--java | | |--ApplicationInitializer.java | | | |--resources | |--app.properties | |---target |--myApp.jar |--app.properties
In ApplicationInitializer
classe voglio caricare oggetti di il file con i seguenti app.properties
pezzo di codice:
Properties props = new Properties();
String path = "/app.properties";
try {
props.load(ApplicationInitializer.class.getResourceAsStream(path));
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(props.getProperty("property"));
Questo pezzo di codice carica proprietà in modo corretto quando l'eseguo da dentro la mia IDE, ma non riesce ad eccezione
Exception in thread "main" java.lang.NullPointerException
at java.util.Properties$LineReader.readLine(Properties.java:434)
at java.util.Properties.load0(Properties.java:353)
at java.util.Properties.load(Properties.java:341)
at cz.muni.fi.fits.ApplicationInitializer.main(ApplicationInitializer.java:18)
quando si cerca di eseguire come file JAR.
Per la creazione di un file jar Sto usando combinazione di maven-shade-plugin
, maven-jar-plugin
(per l'esclusione file di proprietà al di fuori della JAR) e maven-resources-plugin
(per la copia di file di proprietà di cartella specifica) in pom.xml
file come mostrato qui :
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>cz.muni.fi.fits.ApplicationInitializer</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.5</version>
<configuration>
<excludes>
<exclude>**/*.properties</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<executions>
<execution>
<id>copy-resource</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target</outputDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
ho poi acceso il codice nel metodo principale per questo:
Properties props = new Properties();
String path = "./app.properties";
try (FileInputStream file = new FileInputStream(path)) {
props.load(file);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(props.getProperty("property"));
ed è riuscito a caricare le proprietà dal file durante l'esecuzione di JAR ma questa volta non ero in grado di caricarle durante l'esecuzione in IDE, si è conclusa con la stessa eccezione di cui sopra.
Quindi la mia domanda è: Come impostare il filepath (o il file pom.xml
?) Che sarò in grado di caricare le proprietà in esecuzione sia dal file IDE che da quello JAR?
Grazie in anticipo :)
vedo nel 'target' hai' myApp.jar' e 'app.properties'. Puoi controllare se 'app.properties' si trova nel file' .jar'? – Kuba
No, non è così, è per questo che sto usando 'maven-jar-plugin' per escluderlo dal jar –
Perché stai cercando di mettere il file delle proprietà al di fuori del file jar? Se lo fai, non puoi usare 'getResourcesAsStream()'. – khmarbaise