Mam plik app.properties
w moim projekcie maven pod resources
folderze jak pokazano tutaj (uproszczony):.properties ładunek z IDE, a także spoza JAR
myApp |----src | | | |--main | |--java | | |--ApplicationInitializer.java | | | |--resources | |--app.properties | |---target |--myApp.jar |--app.properties
W ApplicationInitializer
klasy I chcesz załadować właściwości z plik app.properties
z poniższego fragmentu kodu:
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"));
Ten kawałek kod ładuje właściwości poprawnie, gdy uruchomię go od wewnątrz mojego IDE, ale nie z wyjątkiem
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)
podczas próby uruchomienia jako plik JAR.
Do tworzenia pliku jar używam kombinacji maven-shade-plugin
, maven-jar-plugin
(za wyjątkiem właściwości pliku poza JAR) i maven-resources-plugin
(do kopiowania właściwości pliku do określonego folderu) w pom.xml
pliku jak pokazano tutaj :
<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>
następnie włącza się kod w sposób głównego do tego:
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"));
i udało się załadować właściwości z pliku podczas uruchamiania JAR, ale tym razem nie mogłem załadować ich podczas pracy w IDE, zakończyło się z tym samym wyjątkiem, co powyżej.
Moje pytanie brzmi: Jak ustawić plik w filepath (lub pom.xml
?), Że będę mógł załadować właściwości uruchomione zarówno z pliku IDE, jak i JAR?
góry dzięki :)
widzę w 'target' masz' myApp.jar' i 'app.properties'. Czy możesz sprawdzić, czy 'app.properties' znajduje się w pliku' .jar'? – Kuba
Nie, nie jest, dlatego używam 'maven-jar-plugin', aby wykluczyć go ze słownika –
Dlaczego próbujesz umieścić plik właściwości poza plikiem jar? Jeśli to zrobisz, nie możesz użyć 'getResourcesAsStream()'. – khmarbaise