# .getClass().getResource()



## AmunRa (29. Apr 2009)

Hallo 
ich hab ein kleines Problem mit einem jar-Archiv.

Ich hab in meinem Jar Archiv einige Bilder. Die möchte ich laden
dazu verfwende ich dann
dann folgende Code-Zeile


```
Toolkit.getDefaultToolkit().createImage(this.getClass().getResource("/Icon5.jpg")
```

das klapp auch bei mir unter Linux ganz gut nur unter sonst keinem anderen Betriebsystem.
Hab das ganze unter Windows Vist/XP, Mac OsX, Knoppix geteste 

bekomme ich bei folgendem Code null zurück nur bei Linux Ubuntu nicht
URL url= this.getClass().getResource("/Icon2.jpg");
Die Fehlermeldung die ich bekomme ist eine NullPointerException.


liegt wahrscheinlich daran, dass alle zuvor genannten Os einen anderen File.Separator verwenden
hab dann auch versucht einfach den Slash am Anfang weg zulassen, dann hat das ganze aber unter Ubuntu nicht funktioniert. und konnte dies leider unter den anderen nicht testen.

wenn ich den Slash mit System.getProperty(file.separator) ersetzen wollte ging das zwar unter Linux nur unter Windows wieder nicht. 
Ich muss leider das Archiv unter allen Os zum laufen kriegen. 

Wie muss ich das ändern?
Oder was mache ich falsch?

Danke


----------



## faetzminator (29. Apr 2009)

versuchs mal ohne den Slash


----------



## AmunRa (29. Apr 2009)

AmunRa hat gesagt.:


> liegt wahrscheinlich daran, dass alle zuvor genannten Os einen anderen File.Separator verwenden
> hab dann auch versucht einfach den Slash am Anfang weg zulassen, dann hat das ganze aber unter Ubuntu nicht funktioniert. und konnte dies leider unter den anderen nicht testen.



Wie ich bereits geschrieben hab hab ich das bereits versucht
nur da gings dann unter Linux (Ubuntu 8.10) nicht


----------



## Leroy42 (29. Apr 2009)

Nein! Es liegt daran, daß es unter sämtlichen Unix(es) und Linux
genau ein root-Verzeichnis gibt, das mit "/" am Anfang angesprochen wird,
unter Windoof jedoch merere


----------



## AmunRa (29. Apr 2009)

Kann ich jetzt nicht nachvoll ziehen
die  Bilder liegen nicht im root verzeichnis, sondern in meinem jar-Archiv und und das wiederum liegt in irgend einem Ordner


----------



## Wildcard (29. Apr 2009)

Wo liegt die Datei denn im jar (auspacken)?


----------



## AmunRa (29. Apr 2009)

Okey im Jar archiv  liegen die jpeg-files in keinem weiteren Ordner, die class Datei liegt im Ordner dayRider/Menu

hat aber brav oben die 
die Klausel 

package dayRider.Menu

im Manifest des Jar Archivs steht folgendes.

Manifest-Version: 1.0

Main-Class: dayRider.Menu.Start



Start ist die Klasse mit der Main-Methode


----------



## Antoras (29. Apr 2009)

Abend, 

ich hab gerade das gleiche Problem. Das Image wird einfach nicht geladen. Der Code:

```
private Image image = null;
```


```
String imagePath = "/pic/pic.png";
image = getToolkit().getImage(getClass().getResource(imagePath));
```

Und auf ein Panel möchte ich das dann zeichnen:

```
private JPanel createPanel_Logo() {
	if (pnlLogo == null) {
		pnlLogo = new JPanel() {
			@Override
			protected void paintComponent(Graphics g) {
				super.paintComponent(g);
				g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
			}
		};
	}
	return pnlLogo;
}
```

Ich bekomme nur einen bescheuerten NullPointer. Dabei wird _image_ definitiv beschrieben, hab extra im Debugger nachgeguckt. Genaue Fehlermeldung:

```
Uncaught error fetching image:
java.lang.NullPointerException
	at sun.awt.image.URLImageSource.getConnection(URLImageSource.java:99)
	at sun.awt.image.URLImageSource.getDecoder(URLImageSource.java:113)
	at sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.java:240)
	at sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:172)
	at sun.awt.image.ImageFetcher.run(ImageFetcher.java:136)
```
Mir ist einfach schleierhaft wo der Fehler liegt. ???:L


----------



## faetzminator (29. Apr 2009)

Könnt ihr mal mit Zip oä verifizieren, dass die datei wirlich im jar ist? Dieser Weg - immer mit / am Anfang und überall im Pfad - sollte auf jedem OS funktionieren. :bahnhof:


----------



## Antoras (29. Apr 2009)

Ich bekomme den Nullpointer schon beim Compilieren. Ich hab also noch nicht einmal ein Jar-Archiv.

Und ja, die Bilder wären bei mir im Archiv gewesen. Ich hatte die nämlich normal geladen, also über ein neues File. Dann wird im Archiv aber bekanntlich ja nichts angezeigt. Aber hatte extra nachgeguckt. Die Bilder waren drin.


----------



## AmunRa (29. Apr 2009)

wie ich ja bereits geschrieben hab funktioniert der Code ja bei mir unter meinem Ubuntu

das bedeutet er findet die Bilder im Archiv und bekommt ach die richtige URL von der getResource Methode.

Meine Frage ist nun wie kann man den Fehler umgehen, oder wie müsste das ganze Lauten für Windows denn wenn man da etwas anderes schreiben muss kann ich ja mit ner If Anweisung zuerst das Betriebsystem abfragen und dann jeweils darau reagieren. 

Hab jetzt mal das entsprechende JarArchiv drangehängt damit ihr sehen könnt das die file richtig sind, wenn ihr wollt kann ich dann auch nocht den Sourcecode auch hochladen.


----------



## faetzminator (29. Apr 2009)

> Ich bekomme den Nullpointer schon beim Compilieren. Ich hab also noch nicht einmal ein Jar-Archiv.


und welches Kompilieren schmeisst NPE's  ?



> Hab jetzt mal das entsprechende JarArchiv drangehängt damit ihr sehen könnt das die file richtig sind, wenn ihr wollt kann ich dann auch nocht den Sourcecode auch hochladen.


funktioniert bei mir auch wunderbar mit folgendem Output (und den fünf Bildern):

```
[faetzminator@fkaros ~]$ java -jar Desktop/Menu.jar
jar:file:/home/faetzminator/Desktop/Menu.jar!/Icon2.jpg
```


----------



## AmunRa (29. Apr 2009)

@faetzminator: welches BS verwendest du ?


----------



## faetzminator (29. Apr 2009)

das sollte man doch erkennen  (Arch) Linux

aber versuch mal statt getClass(). ... getClass().getClassloader(). ...


----------



## AmunRa (29. Apr 2009)

Du hast recht ich hab mir den output nicht ganz angeshen 
aber zumindest weis ich dass das ganze also allgemein in Linux geht 

was ist den der unterschied zu getClassloader()  ?

kanns leider erst morgen wieder prüfen, da ich kein Windows zur hand habe. 

Ich schreib dann morgen wies gelaufen ist


----------



## faetzminator (29. Apr 2009)

Ach ja, Class.getResource() ruft laut Javadoc intern entweder getClassLoader().getSystemResource() oder getClassLoader().getResource() auf, probier einfach mal beide Varianten von Hand aus


----------



## Antoras (29. Apr 2009)

@AmunRa
Die Bilder deines Archives werden bei mir sowohl unter Windows, als auch unter Linux angezeigt.

@faetzminator
Die unterschiedlichen Methoden bringen bei mir keine Änderung...


----------



## faetzminator (29. Apr 2009)

Ich bezweifle, dass hier ein Problem von deinem Code vorliegt... /dir/dir2/file.ex funktioniert grundsätzlich im Jar...

EDIT: @Antoras, poste doch einmal deine gesamte Klasse


----------



## AmunRa (29. Apr 2009)

Antoras hat gesagt.:


> @AmunRa
> Die Bilder deines Archives werden bei mir sowohl unter Windows, als auch unter Linux angezeigt.




Okey wenn das stimmt dann wirds bei mir schwer sein den Fehler zu finden denn , dann ist der Fehler nicht direkt reproduzier bar, denn bei mir hat das Archiv nur im Linux funktioniert und auf den Computern in meiner FH nicht 
ich werds morgen noch einmal alles Testen.


----------



## Antoras (29. Apr 2009)

Minimalbeispiel, gleicher Fehler:

```
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;

import javax.swing.JFrame;
import javax.swing.JPanel;


public class PictureTest
extends JFrame {
	
	private JPanel pnlPic = null;
	private Image image = null;
	
	public static void main(String[] args) {
		new PictureTest();
	}
	
	public PictureTest() {
		createWindow(400, 400, 300, 300);
	}
	
	
	public void createWindow(int w, int h, int x, int y) {
		try {
			setPreferredSize(new Dimension(w, h));
			setLocation(x, y);
			setDefaultCloseOperation(EXIT_ON_CLOSE);
			
			try {
				String imagePath = "/pic/phoenix.jpg";
				image = getToolkit().getImage(getClass().getResource(imagePath));
			} catch (Exception e) {
				System.err.println("Picture could not be showed: " + e);
			}
			
			add(createPanel_Pic());
			pack();
			setVisible(true);
		} catch (Exception e) {
			System.err.println("LoginManager could not be created: " + e);
		}
	}
	
	private JPanel createPanel_Pic() {
		if (pnlPic == null) {
			pnlPic = new JPanel() {
				@Override
				protected void paintComponent(Graphics g) {
					super.paintComponent(g);
					g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
				}
			};
		}
		return pnlPic;
	}

}
```

EDIT: Sry, Bild vergessen. Hab es angehängt...oder nimm irgend eines


----------



## faetzminator (29. Apr 2009)

gibt denn getClass().getResource(imagePath) wirklich null zurück?


----------



## Antoras (29. Apr 2009)

Hm, ja gibt es. Leider. Hab im Debugger nicht weit genug geguckt. Das Toolkit ist nicht null, die url aber schon.
Würde ja bedeuten, dass der Pfad nicht gefunden wird, was aber nicht sein kann...

EDIT:
Wenn ich das Bild zum Bytecode tue und diesen Pfad setze, dann wird das Bild angezeigt:

```
String imagePath = "./phoenix.jpg";
```
Leider funktioniert das nicht noch immer nicht wenn das bild in einem anderen Ordner ist...


EDIT2: Verdammt:


> Aber dein "data" Ordner muss in dem Ordern sein, in dem sich dein "bin" Verzeichnis befindet (also die .class Dateien).
> 
> 'tschuldige, hab ich total vergessen zu erwähnen.


Quelle

Jetzt geht es. Hab für diesen Sch*** bestimmt 4h gebraucht, bis ich das jetzt raushatte. Wenigstens geht es jetzt. Selbst im jar-Archiv werden die Bilder angezeigt. Möchte nur wissen welcher "tolle" Java-Entwickler auf die Idee kam den Bytecode-Ursprungspfad als root-Directory zu missbrauchen.


----------



## AmunRa (4. Mai 2009)

Hab nun endlich eine Lösung für mein Problem gefunden. 

Es war doch nicht die Methode getResource() sondern das problem lag an der Methode createImage
der klasse Toolkit 

also einfach diese Zeile 


```
Toolkit.getDefaultToolkit().createImage(this.getClass().getResource("/Icon5.jpg")
```
.                                            
mit dieser erstzen

```
Toolkit.getDefaultToolkit().getImage(this.getClass().getResource("/Icon5.jpg")
```
.


----------

