Java-JAR-Datei: Ressourcenfehler verwenden: URI ist nicht hierarchisch

Lesezeit: 4 Minuten

Java JAR Datei Ressourcenfehler verwenden URI ist nicht hierarchisch
hqt

Ich habe meine App in einer JAR-Datei bereitgestellt. Wenn ich Daten aus einer Ressourcendatei außerhalb der JAR-Datei kopieren muss, mache ich diesen Code:

URL resourceUrl = getClass().getResource("/resource/data.sav");
File src = new File(resourceUrl.toURI()); //ERROR HERE
File dst = new File(CurrentPath()+"data.sav");  //CurrentPath: path of jar file don't include jar file name
FileInputStream in = new FileInputStream(src);
FileOutputStream out = new FileOutputStream(dst);
 // some excute code here

Der Fehler, den ich getroffen habe, ist: URI is not hierarchical. Dieser Fehler tritt nicht auf, wenn er in IDE ausgeführt wird.

Wenn ich den obigen Code als Hilfe zu einem anderen Beitrag auf StackOverFlow ändere:

InputStream in = Model.class.getClassLoader().getResourceAsStream("/resource/data.sav");
File dst = new File(CurrentPath() + "data.sav");
FileOutputStream out = new FileOutputStream(dst);
//....
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) { //NULL POINTER EXCEPTION
  //....
}

Java JAR Datei Ressourcenfehler verwenden URI ist nicht hierarchisch
Strich1e

Du kannst das nicht machen

File src = new File(resourceUrl.toURI()); //ERROR HERE

es ist keine Datei! Wenn Sie von der IDE aus ausführen, haben Sie keinen Fehler, da Sie keine JAR-Datei ausführen. In der IDE werden Klassen und Ressourcen auf das Dateisystem extrahiert.

Aber Sie können eine öffnen InputStream auf diese Weise:

InputStream in = Model.class.getClassLoader().getResourceAsStream("/data.sav");

Entfernen "/resource". Generell trennen die IDEs nach Dateisystemklassen und Ressourcen. Aber wenn das Glas erstellt wird, werden sie alle zusammengefügt. Also die Ordnerebene "/resource" wird nur zur Trennung von Klassen und Ressourcen verwendet.

Wenn Sie eine Ressource vom Classloader erhalten, müssen Sie den Pfad angeben, den die Ressource im JAR hat, das ist die echte Pakethierarchie.

  • Posten Sie die Hierarchie Ihres Projekts

    – Bindestrich1e

    13. April 12 um 17:18 Uhr

  • Aber was ist, wenn ich wirklich ein “File”-Objekt BRAUCHE … ?

    – Tek Timmy

    16. November 12 um 10:46 Uhr

  • @Daniel, es hängt davon ab, wo Sie Ihre Ressource platzieren. Sie können verwenden data.sav ohne Start / wenn Sie Ihre Ressourcendatei in dasselbe Paket wie Ihre Klassendatei einfügen. Aber in der Frage der data.sav befindet sich im Root-Paket, also muss er in diesem Fall vorangestellt werden /.

    – Bindestrich1e

    9. Mai 15 um 19:06 Uhr

  • Genau wie TekTimmy: Aber was ist, wenn ich WIRKLICH eine Datei BRAUCHE? Ich befinde mich in einem E-Mail-Versandprozess und wir möchten ein Bild einer Logodatei per E-Mail versenden. Das Bild ist im Glas und ich muss es der Datenquelle als Datei geben, nicht als InputStream …

    – JN Gerbaux

    20. Januar 17 um 13:25 Uhr


  • @JNGerbaux ich wollte auch eine File Objekt, also habe ich temp erstellt File und kopierte Inhalte von InputStream zum Dateiobjekt. verwenden FileUtils.copyInputStreamToFile(inputStream, file);

    – Vishal Patel

    27. Juli 21 um 6:25 Uhr

1643908628 242 Java JAR Datei Ressourcenfehler verwenden URI ist nicht hierarchisch
Mario

Wenn Sie aus irgendeinem Grund wirklich eine erstellen müssen java.io.File Objekt auf eine Ressource innerhalb einer Jar-Datei verweisen soll, ist die Antwort hier: https://stackoverflow.com/a/27149287/155167

File f = new File(getClass().getResource("/MyResource").toExternalForm());

1643908628 693 Java JAR Datei Ressourcenfehler verwenden URI ist nicht hierarchisch
Ilja Buziuk

Hier ist eine Lösung für Eclipse RCP / Plugin-Entwickler:

Bundle bundle = Platform.getBundle("resource_from_some_plugin");
URL fileURL = bundle.getEntry("files/test.txt");
File file = null;
try {
   URL resolvedFileURL = FileLocator.toFileURL(fileURL);

   // We need to use the 3-arg constructor of URI in order to properly escape file system chars
   URI resolvedURI = new URI(resolvedFileURL.getProtocol(), resolvedFileURL.getPath(), null);
   File file = new File(resolvedURI);
} catch (URISyntaxException e1) {
    e1.printStackTrace();
} catch (IOException e1) {
    e1.printStackTrace();
}

Es ist sehr wichtig zu verwenden FileLocator.toFileURL(fileURL) eher, als resolve(fileURL)
, denn wenn das Plugin in eine JAR-Datei gepackt wird, erstellt Eclipse eine entpackte Version an einem temporären Speicherort, sodass auf das Objekt mit File zugegriffen werden kann. Ich vermute zum Beispiel, dass Lars Vogel einen Fehler in seinem Artikel hat – http://blog.vogella.com/2010/07/06/reading-resources-from-plugin/

  • Was ist die Plattformklasse? Eine Nicht-RT-Bibliothek benötigt?

    – Andrej

    27. April 15 um 15:44 Uhr

  • @AndreyP Diese Lösung ist für Eclipse-RCP-Plugin-Entwickler. Ich würde empfehlen, den getResourceAsStream(…)-Ansatz auszuprobieren

    – Ilja Buziuk

    27. April 15 um 15:48 Uhr

  • In meiner von Maven erstellten RCP E4-Anwendung müssen jar-gebündelte Binärdateien extrahiert und geöffnet werden. Ihre Lösung hat es mir endlich ermöglicht, dies zu tun und zu öffnen file.getAbsolutePath() im Standardbrowser des Betriebssystems.

    – J. Katzwinkel

    30. März 16 um 15:02 Uhr

  • Danke ! Diese Antwort war sehr hilfreich, da ich einen Fehler mit FileLocator.resolve bekam. Ich könnte das File-Objekt direkt erstellen mit: File f = new File(FileLocator.toFileURL(resolvedFileURL).toURI());

    – Remi

    9. März 21 um 19:30 Uhr


Ich hatte vorher ein ähnliches Problem und habe den Code verwendet:

new File(new URI(url.toString().replace(" ","%20")).getSchemeSpecificPart());

Anstelle des Codes:

new File(new URI(url.toURI())

um das Problem zu lösen

Während ich selbst auf dieses Problem gestoßen bin, möchte ich eine weitere Option hinzufügen (zu der ansonsten perfekten Erklärung von @dash1e):

Exportieren Sie das Plugin als Ordner (nicht als JAR-Datei), indem Sie Folgendes hinzufügen:

Eclipse-BundleShape: dir

zu deinem MANIFEST.MF.

Spätestens wenn Sie Ihre RCP-App mit dem Exportassistenten (basierend auf einer *.product)-Datei wird dies respektiert und erzeugt einen Ordner.

1643908629 313 Java JAR Datei Ressourcenfehler verwenden URI ist nicht hierarchisch
jediz

Zusätzlich zu den allgemeinen Antworten können Sie “URI ist nicht hierarchisch” von erhalten Einheiten Bibliothek versucht zu laden a Datensatz aus a .jar Datei. Dies kann passieren, wenn Sie Datensätze in einem Maven-Submodul aufbewahren, tatsächliche Tests jedoch in einem anderen.

Es gibt sogar eine Fehler UNI-197 abgelegt.

.

757960cookie-checkJava-JAR-Datei: Ressourcenfehler verwenden: URI ist nicht hierarchisch

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy