wake-up-neo.com

Ressource von src/main/resources nach dem Bauen mit Maven nicht gefunden

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?

44

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.

79
beny23

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.

11
Peter Lawrey

Die Ressourcen, die Sie in "src/main/resources" ablegen, werden während des Erstellungsprozesses in target/classes kopiert.

...this.getClass().getResourceAsStream("/config.txt");
5
khmarbaise

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.

1
Rostislav Matl

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();
  }

enter image description hereenter image description here

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>
1
vijay

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")));
0
Ahmed Elkoussy