webentwicklung-frage-antwort-db.com.de

Wie verweise ich korrekt auf eine Ressourcendatei für JAR und Debugging

Ich habe ein böses Problem beim Referenzieren von Ressourcen, wenn ein Maven-Projekt und Jar-Dateien verwendet werden.

Ich habe alle meine Ressourcen in einem dedizierten Ordner/src/main/resources, der Teil des Erstellungspfads in Eclipse ist. Auf Dateien wird mit verwiesen 

getClass().getResource("/filename.txt")

Dies funktioniert gut in Eclipse, aber es schlägt in der Jar-Datei fehl. Dort befinden sich die Ressourcen in einem Ordner direkt unter dem Jar-Stammverzeichnis.

Kennt jemand eine "bewährte Methode", um auf eine Datei in JAR und (!) In Eclipse zu verweisen?

Bearbeiten:Das Problem ist, dass, während sich die Ressourcen tatsächlich in der JAR in einem Ordner "resources" auf der obersten Ebene befinden, die obige Methode die Datei nicht finden kann ...

37
Patrick

Der Inhalt der Maven-Ressourcenordner wird in Ziel/Klassen und von dort in das Stammverzeichnis der resultierenden Jar-Datei kopiert. Das ist das erwartete Verhalten.

Was ich nicht verstehe, ist das Problem in Ihrem Szenario. Die Referenzierung einer Ressource über getClass().getResource("/filename.txt") beginnt am Stamm des Klassenpfads, unabhängig davon, ob dies (oder ein Element davon) target/classes oder der Stamm der JAR ist. Der einzige mögliche Fehler, den ich sehe, ist, dass Sie die falsche ClassLoader verwenden.

Stellen Sie sicher, dass sich die Klasse, die die Ressource verwendet, im selben Artefakt (JAR) befindet wie die Ressource, und führen Sie ThatClass.class.getResource("/path/with/slash") oder ThatClass.class.getClassLoader().getResource("path/without/slash") aus.

Aber abgesehen davon: Wenn es nicht funktioniert, machen Sie wahrscheinlich irgendwo im Build-Prozess etwas falsch. Können Sie überprüfen, ob sich die Ressource im JAR befindet?

16

Ich hatte ein ähnliches Problem ... Nach einem ganzen Tag, an dem ich jede Kombination ausprobierte und debugging, probierte ich getClass (). GetResourceAsStream ("resources/filename.txt") und brachte es endlich zum Laufen.

18
andjelko

Sobald Sie die JAR-Datei gepackt haben, sind Ihre Ressourcendateien keine Dateien mehr, sondern Streams, sodass getResource nicht funktioniert!

Verwenden Sie getResourceAsStream.

Um den Inhalt der Datei zu erhalten, verwenden Sie https://commons.Apache.org/proper/commons-io/javadocs/api-release/org/Apache/commons/io/IOUtils.html :

static public String getFile(String fileName)
{
        //Get file from resources folder
        ClassLoader classLoader = (new A_CLASS()).getClass().getClassLoader();

        InputStream stream = classLoader.getResourceAsStream(fileName);

        try
        {
            if (stream == null)
            {
                throw new Exception("Cannot find file " + fileName);
            }

            return IOUtils.toString(stream);
        }
        catch (Exception e) {
            e.printStackTrace();

            System.exit(1);
        }

        return null;
}
16
Thomas Decaux

Vielleicht kann diese Methode in manchen Situationen hilfreich sein.

public static File getResourceFile(String relativePath)
{
    File file = null;
    URL location = <Class>.class.getProtectionDomain().getCodeSource().getLocation();
    String codeLoaction = location.toString();
    try{
        if (codeLocation.endsWith(".jar"){
            //Call from jar
            Path path = Paths.get(location.toURI()).resolve("../classes/" + relativePath).normalize();
            file = path.toFile();
        }else{
            //Call from IDE
            file = new File(<Class>.class.getClassLoader().getResource(relativePath).getPath());
        }
    }catch(URISyntaxException ex){
        ex.printStackTrace();
    }
    return file;
}
0
gbii