Hallo, ich verwende eine Konfigurationsdatei von src/main/resources in meiner Java-Anwendung. Ich lese es in meiner Klasse so:
new BufferedReader(new FileReader(new File("src/main/resources/config.txt")));
Jetzt baue ich das mit maven mit mvn Assembly:assembly
. Hier ist das bisschen dafür in meiner pom.xml:
<plugin>
<artifactId>maven-Assembly-plugin</artifactId>
<version>2.3</version>
<configuration>
<finalName>TestSuite</finalName>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.some.package.Test</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
Wenn ich meine App starte, erhalte ich diesen Fehler:
src\main\resources\config.txt (The system cannot find the path specified)
Aber wenn ich mit der rechten Maustaste auf mein zusammengebautes Glas klicke, kann ich es darin sehen. Weiß jemand, was ich falsch mache?
Ressourcen aus src/main/resources
werden in die Wurzel des Klassenpfads gestellt, daher müssen Sie die Ressource folgendermaßen erhalten:
new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/config.txt")));
Sie können dies überprüfen, indem Sie sich die von maven erstellte JAR/WAR-Datei ansehen, da Sie config.txt
im Stammverzeichnis Ihres Archivs finden.
FileReader liest aus Dateien im Dateisystem.
Vielleicht haben Sie vor, so etwas zu verwenden, um eine Datei aus dem Klassenpfad zu laden
// this will look in src/main/resources before building and myjar.jar! after building.
InputStream is = MyClass.class.getClassloader()
.getResourceAsStream("config.txt");
Oder Sie können die Datei aus dem Glas extrahieren, bevor Sie sie lesen.
Die Ressourcen, die Sie in "src/main/resources" ablegen, werden während des Erstellungsprozesses in target/classes kopiert.
...this.getClass().getResourceAsStream("/config.txt");
Ich denke, dass das Assembly-Plugin die Datei auf den Klassenpfad setzt. Die Position in der JAR-Datei ist anders als auf der Festplatte. Entpacken Sie das resultierende JAR und suchen Sie nach, wo sich die Datei dort befindet.
Sobald wir das JAR erstellt haben, werden die Ressourcendateien unter BOOT-INF/classes oder target/classes abgelegt sein Klassenpfad, benutze die folgende Methode und übergebe die Datei unter src/main/resources als Methodenaufruf getAbsolutePath ( "certs/uat_staging_private.ppk") , selbst wenn wir diese Methode in die Utility-Klasse einfügen, wird die aufrufende Thread-Instanz verwendet, um den ClassLoader zu laden und die Ressource aus der Klasse abzurufen Pfad.
public String getAbsolutePath(String fileName) throws IOException {
return Thread.currentThread().getContextClassLoader().getResource(fileName).getFile();
}
wir können das folgende Tag zum Tag in pom.xml hinzufügen, um diese Ressourcendateien zum Erstellen des Ziel-/Klassenordners einzuschließen
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.ppk</include>
</includes>
</resource>
</resources>
Sie können den src/main/resources/
direkt durch classpath:
ersetzen.
Für Ihr Beispiel ersetzen Sie also diese Zeile:
new BufferedReader(new FileReader(new File("src/main/resources/config.txt")));
In dieser Zeile:
new BufferedReader(new FileReader(new File("classpath:config.txt")));