Fragen zu JAR mit Bildern

Status
Nicht offen für weitere Antworten.

Blurry

Mitglied
Hoi,

ja, ich hab die FAQ zu JARs usw. gelesen. Trotzdem hänge ich an einer wohl ziemlich einfachen Sache fest. ich hab folgendes kleines Testprogramm, mit dessen Hilfe ich versuche, diesen Kram zu verstehen:

Code:
public class Bildertest
{
	public static void main(String[] args)
	{
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    ImageIcon icon1 = new ImageIcon( Bildertest.class.getResource( "Bilder/testbild.gif" ) );
    JLabel l1 = new JLabel( icon1 );
    frame.add( l1, BorderLayout.LINE_START );

    frame.pack();
    frame.setVisible( true );
	}
}


Das Verzeichnis "Bilder", in dem das Beispielbild liegt, befindet sich im selben Ordner wie nach der Kompilierung die .class-Datei. Funktioniert auch, das Bild wird in einem JFrame angezeigt. Die erste, allerdings zweitrangige, Frage, die ich mir stelle, ist, wie ich den Standard-JAR-Export-Assistenten von Eclipse dazu überreden kann, das Bild mit ins JAR zu packen. Tut er bisher nämlich nicht, im Gegensatz zum Fat-Jar-Plugin.

Die hauptsächliche Frage, die ich mir stelle, ist jedoch die folgende: Angenommen, das Bild liegt so:

Code:
bin
  klassen
    blabla
      [.class-Files]
src
  klassen
    blabla
      [.java-Files]
Bilder
  testbild.gif

Wie greife ich dann darauf zu, ohne einen absoluten Pfad zu verwenden? Das Ding muss später ja auch innerhalb des JARs referenziert werden. Darum geht es hauptsächlich. Die Verwendung von ".." im Pfadnamen schlägt fehl, und mehr fällt mir echt nicht ein...
 
WEnn das Bild nicht in der selben JAR bzw. Im classpath des Projekts liegt, kann es nicht über den Classloader geladen werden. Das Bild muss unter Eclipse also mit in den Bin. Ansonsten musst du ImageIO verwenden.
 
Campino hat gesagt.:
WEnn das Bild nicht in der selben JAR bzw. Im classpath des Projekts liegt, kann es nicht über den Classloader geladen werden. Das Bild muss unter Eclipse also mit in den Bin. Ansonsten musst du ImageIO verwenden.

Das Bild liegt ja mit im selben JAR. Oben erwähnte Dateistruktur ist die des JARs. Öffnet man das JAR mit einem Zip-Programm, sieht man also diese drei Ordner:

bin
src (oder auch nicht, ist ja wurscht)
Bilder


Es muss doch möglich sein, dann sozusagen aus "bin" heraus auf den Bilder-Ordner zuzugreifen. Ich habe hier den Quellcode eines ziemlich großen Projekts, in dem das mit der Ordnerstruktur genauso gemacht wurde. Ich krieg das Ding in Eclipse zwar kompiliert, aber es semmelt dann sowohl aus Eclipse als auch aus einem JAR heraus jedes Mal mit 'ner NullPointerException ab - Bild nicht gefunden... Das fertige, funzende JAR habe ich ebenfalls hier. Da sind die Bilder in 'nem Unterverzeichnis des "Roots" und die .class-Files sonst wo verstreut - und das läuft.

Im für das fertige JAR verwendeten Code wird so vorgegangen:

Code:
logo.setIcon(new javax.swing.ImageIcon(getClass().getResource("pics/logos/logo.gif")));


Innerhalb des JARs sieht's so aus:

Code:
ressourcen
  pics
    logos
      logo.gif hier
bin
  bla
    bla
      Logos aufrufende Klasse hier

Ich kapier nicht, wieso das in der vorkompilierten Fassung geht, zumal bei "getResource" ja noch nicht mal das Oberverzeichnis "ressourcen" angegeben ist. Aber selbst dann dürfte das scheitern, da auf diese Art und Weise im Unterverzeichnis "pics" der aufrufenden .class-Datei nachgesehen wird - das es natürlich nicht gibt.
 
Und was soll der Krempel in deinem JAR?

Da gehört nur der Inhalt des bin-Ordners rein, d.h. die Package-Struktur mit den enthaltenen class-Dateien und Ressourcen.
 
AlArenal hat gesagt.:
Und was soll der Krempel in deinem JAR?

Da gehört nur der Inhalt des bin-Ordners rein, d.h. die Package-Struktur mit den enthaltenen class-Dateien und Ressourcen.

Ich muss aber leider mit dem zurechtkommen, was mir so gegeben wurde. Ehrlich gesagt weiß ich auch gar nicht, was du meinst: die überflüssigen Quelldateien? Dass die normalerweise nicht da reinmüssen, ist mir klar und habe ich oben ja auch schon angedeutet. Ob sie nun da sind oder nicht, spielt ja auch gar keine Rolle. Ich komme der Lösung des Problems übrigens langsam näher. Wie ich festgestellt habe, ist der Pfad in dem fertig gepackten JAR, das ich bekommen habe, anders als in dem Eclipse-Projekt. Das heißt, irgendwie haben die Herren das gleich beim Kompilieren so packen lassen, dass es passte - so weit ich das sehe, mit 'nem Ant-Skript, wovon ich nebenbei bemerkt überhaupt keinen Plan habe. Macht aber auch nichts, inzwischen habe ich immerhin Grundlegendes gecheckt:

Referenziert man eine Ressource mit /Ordner/bla.gif, dann wird von oberster Verzeichnisebene im JAR an geguckt. Lässt man den führenden Slash weg, einfach unterhalb der aufrufenden .class-Datei. Äh, ja, trivial? Mehr wollte ich eigentlich nicht mal wissen, von dem sich jetzt auch aufgeklärt habenden Kuriosum mit den vermeintlich völlig verkehrten und dann trotzdem funktionierenden Pfadangaben im mir an die Hand gegebenen Quellcode abgesehen.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben