Resourcen-Dateien im Jar-File verfügbar machen (Intellij 14)

Sherry

Aktives Mitglied
Hallo,

vorab, ich nutze die IDE von Intellij. Mein Problem ist, dass eine Klasse die Text- und HTML-Dateien nicht mehr finden kann, wenn ich ein Runable Jar-File generiert habe.
Ich stecke meine Resourcen (Bild-, Text-, HTML-Dateien) in einen Ordner "resources" auf direkter Ebene mit dem "src" Ordner eines Projektes und in der Java-Klasse greife so zu:
Java:
try {
            licenseEditor.setContentType("text/plain");
            licenseEditor.setPage("file:resources/license");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
Das Ausführen innerhalb der IDE funktioniert auch mit den Resourcen, sie werden gefunden, im Jar-File allerdings nicht.
Dabei habe ich unter Intellij in den Artifacts einen Ordner "resources" mit den zugehörigen Dateien angelegt. Die Struktur der Jar_files sieht so aus:
META-INF
- MANIFEST.MF
com
resources
- about.html
- license.txt

Wie muss ich die Resources in das JAR-File integrieren, dass die Dateien von der Klasse gefunden werden? Muss das vielleicht im Mainfest zusätzlich eingetragen werden? Bisher läuft es nur, wenn ich den Ordner mit den Resources neben die Jar-Datei seperat lege. Ziel ist es aber sie mit dem Jar auszuliefern.

Grüße

Sherry
 
Zuletzt bearbeitet:
Ok,

gibt es dazu Literatur oder Beispiele im Web, so dass ich das verstehen und nachvollziehen kann? das ist mir so noch zu allgemein gehalten.
 
Ich habe dazu was gefunden Ressourcen aus dem Klassenpfad und aus Jar, steht somit auch meinem Standardwerk drin.
Aber mal dumm gefragt:
Erzeugt Eclipse beim Exportieren in ein Runable Jar-File diese Klasse selber? Ich habe sie jetzt noch nicht entdeckt.
Somit ist Eclipse, was das Lernen angeht, recht wenig empfehlenswert, weil man durch die Automatismen vieles nicht lernt. Ich sehe das gerade mit den Layoutmanagern. Ohne Gui-Builder ist das ziemlich kompliziert.
 
Es zwingt dich niemand die ganzen Automatismen zu benutzen 😉

Die Klassen werden natürlich selber erzeugt oder willst du deinen Code in Bytecode übersetzen?

Du nimmst einfach irgendeine Klasse.getClass().getRessource...
 
Du nimmst einfach irgendeine Klasse.getClass().getRessource...

Das ist mir immer noch zu allgemein gehalten.
Wie bereits geschrieben
Java:
try {
            licenseEditor.setContentType("text/plain");
            licenseEditor.setPage("file:resources/license");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
funktioniert mit Intellij IDE und einem Jar-File unter Eclipse-Export.

Wo soll dieser Kladderadasch "Klasse.getClass().getRessource..." hin??
 
Ich gehe mal davon aus, dass der LicenceEditor eine Klasse von dir ist.
Du ließt Dateien momentan ganz normal ein. Und genau das funktioniert nicht, da ein JAR ZipKomprimiert ist.
Das heißt anstatt des aktuellen Einlesens musst du das mit getRessource... machen.
 
Das ist vom Typ JEditorPane. Aber heißt das, dass ich jede Datei (Bild, Plaintext, HTML) über einen InputStream einlesen muss, sobald ich das Programm als Jar-File verteilen will?
 
Wie willst du die Dateien denn sonst von der Festplatte ins Programm kriegen? Das ist mit Dateien, die daneben liegen nicht anders.
 
Die JEditorPane-Klasse erwartet allerdings, dass mit der Methode setpage() die Datei eingefügt wird. das klappt auch, wenn die IDE das Programm startet - die Dateien liegen auch hier auf der Festplatte.

Ich habe also diese zwei Code-Fragmente, die unter der IDE laufen:
Java:
 try {
            aboutEditor.setPage("resources/about.html");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
Java:
try {
            licenseEditor.setContentType("text/plain");
            licenseEditor.setPage("resources/license");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
Logischerweise setze ich jetzt in die setPage-Methoden
Java:
try {
            aboutEditor.setPage(getClass().getResource("resources/about.html"));
        } catch (Exception ex) {
            ex.printStackTrace();
        }

Java:
try {
            licenseEditor.setContentType("text/plain");
            licenseEditor.setPage(getClass().getResource("resources/license"));
        } catch (Exception ex) {
            ex.printStackTrace();
        }

Dann habe ich eine IOException "invalid url" und leere JEditorPanes.

Baue ich die Codes so
Java:
try {
            aboutEditor.getClass().getResource("resources/about.html");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
Java:
try {
            licenseEditor.setContentType("text/plain");
            licenseEditor.getClass().getResource("resources/license");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
entfallen die Exceptions, dafür sind die JEditorPanes immer noch leer.

Die setpage-Methode will einen Pfad (URI) haben, aber wie soll das mit der Methode getResource gehen?
 
Dann musst du die Dateien zuerst entpacken oder getRessourceAsStream(...) verwenden.
Das ist jetzt auch wieder so unspezifisch:
Wie soll ich Dateien entpacken, die erst wenn der Code steht ins Jar-File gepackt werden? Und wie wird das realisiert? So liefert deine Aussage noch nicht einmal eine Google-Startvorlage.
Also so komme ich nicht weiter. Ich komme mir hier wie in einem Rateteam vor.
 
Wenn du dir keine Mühe gibst meine Aussagen zu verstehen ist es klar, dass du nicht hinter ihren Sinn kommst. Mit dem Unterschied, dass du spezielle Methoden zum Einlesen verwenden musst und Schreiben überhaupt nicht geht, verhalten sich Dateien im JAR genauso, wie Dateien außerhalb des JARs.

Du könntest zum Beispiel nach "Dateien zur Laufzeit aus JAR entpacken" suchen.

Oder du benutzt gleich Files.copy(InputStream, Path).



Eine weitere Möglichkeit wäre ein Installer, der beim ersten Start alles entpackt und alle Ordner/Dateien erstellt und dein Programm greift einfach nur darauf zu.
 
Wenn du dir keine Mühe gibst meine Aussagen zu verstehen ist es klar, dass du nicht hinter ihren Sinn kommst.
Hiermit unterstellst du mir regelrecht etwas. Woher willst du das überhaupt wissen? Du knallst hier Aussagen hin und unterlegst sie nicht korrekt mit Nachweisen. Zweitens scheinst du zu erwarten, dass jeder gleich den Wissenssatnd wie du haben sollte.
Mit dem Unterschied, dass du spezielle Methoden zum Einlesen verwenden musst und Schreiben überhaupt nicht geht,
Das magst du noch verstehen, für Andere sind alle Wege offen zu Interpretation, was du sagen wolltest.
Du könntest zum Beispiel nach "Dateien zur Laufzeit aus JAR entpacken" suchen.
Wirklich? Da kommen aber ganz andere Ergebnisse:
1 Ergebnis (0,25 Sekunden)
Suchergebnisse

Resourcen-Dateien im Jar-File verfügbar machen (Intellij 14 ...
Java lernen, Java programmieren - Java-Forum.org › ... › Java Basics - Anfänger-Themen

13 Beiträge - ‎2 Autoren
... verhalten sich Dateien im JAR genauso, wie Dateien außerhalb des JARs. Du könntest zum Beispiel nach "Dateien zur Laufzeit aus JAR entpacken" suchen.

Ich habe ganz klar definitiv, dass ich den beiden Swing-Komponenten JEditorPane je ein Text-File und ein HTML-File über die setPage-Methode des JEditorPane übergeben will.
Wenn du so gut bist, wie du scheinen magst, bleibst du nicht so allgemein und gibst oberflächliche Ratschläge, die nicht weiterhelfen, sondern zeigst vielleicht doch konkret was du meinst. Offensichtlich bin ich im Lernprozeß bei Java.
Stattdessen erzeugst du mit deinen Ratschlägen das Gegenteil.

Oder du benutzt gleich Files.copy(InputStream, Path).



Eine weitere Möglichkeit wäre ein Installer, der beim ersten Start alles entpackt und alle Ordner/Dateien erstellt und dein Programm greift einfach nur darauf zu.[/QUOTE]
 
Suchen bei Google. Nicht im Forum. 😉

Du suchst offensichtlich eine Möglichkeit, um die Daten aus dem JAR in dein Programm zu bekommen.
Wie groß sind die Dateien?
Wird zur Laufzeit noch auf sie zugegriffen oder nur ein Mal beim Start?
 

Zurück
Oben