Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Datei-Pfade innerhalb von .JAR

Empfohlene Antworten

Veröffentlicht

Hallo,

Und zwar wollte ich mein Programm kompilieren und dann in ne .JAR packen, sodass man es einfach so ausführen kann.

Jetzt ist mir ein total unerklärliches Problem aufgetaucht bzw. sogar 2!:

Meine Klasse befindet in einem Package "chat" ... dieses Package enthält noch einen Ordner "smilies"...

So muss ich in meiner Klasse die Smilies aufrufen (wenn ich das Programm in Eclipse teste):


static String icon_path = "bin/chat/smilies/";


.

.

.

.


// Icons

		try{

			File dir = new File(icon_path);

			File[] fileList = dir.listFiles();


			i = 0;

			icons = new ImageIcon[fileList.length];


			for(File f : fileList) {

				try{

					icons[i] = new ImageIcon(icon_path+f.getName());


				}catch(IndexOutOfBoundsException df){	

				}

			    i++;

			}

		}catch(NullPointerException npe){


		}

In einem Beispiel File jedoch sieht der Pfad folgendermaßen aus, OBWOHL dort die Klasse ebenfalls sich in einem Package befindet und der Ordner für die Grafiken sich ebenfalls in diesem Package befindet:

("images/Pig.gif", "a cute pig")

Jetzt als erstes mal, wieso brauche ich zum ausführen bei meinem File noch das "bin" und den Packagename im Pfad?

Als zweites und wichtigeres: wieso funktioniert das 2. Beispiel wenn ich es in ein .JAR Packe und das 1. nicht? auch wenn ich beim 1. Beispiel vorher den Pfad dem 2. Beispiel angleiche???

Das ist äußerst rätselhaft...

Ich hoffe einer hat eventuell ne Idee....

Gruß

Bearbeitet von dommes89

bin - Verzeichnis:

Deine Klassen werden aus dem src - Verzeichnis compiliert und die compilierten .class Dateien werden im "bin" abgelegt. Nun kannst du die Klasse im "bin" ausführen.

Wenn du eine Datei mit in den src Ordner legst, dann wird diese natürlich nicht kompiliert und kommt auch nicht in den "bin" Ordner.

Einfachste Weg: einen neuen Orderner in dem projekt erstellen, auf der selben Ebene wie src und bin.

Dann im Quellcode: z.b. "data/smilies/images/Pig.gif"

src - .java dateien

bin - .class dateien

data - alle möglichen anderen Ressourcen

*Ordnername frei wählbar, data ist nur ein Beispiel

Edit: du kannst den data Ordner dann auch mit in die JAR Datei packen lassen, wobei man es lieber nicht mit rein packt und den data Ordner dann mit in das Verzeichnis kopiert wo die JAR ist

Bearbeitet von zui2000

Okay nach reichlichem Suchen etc. habe ich herausgefunden, dass File() nicht in .jar dateien funktioniert bzw. man nur bestimmte dateien aufrufen kann...

Weiss einer wie ich in .jar Dateien Verzeichnisse durchsuchen kann?

Gruß.

Ja, also das mit dem bin und src weiss ich..

den Ordner außerhalb vom .jar file anzulegen kommt leider nicht in frage..

Okay ich werde es mal ausprobieren ob es möglich ist wenn ich den ordner ins stammverzeichniss des jar files lege...

Danke.

Weiss einer wie ich in .jar Dateien Verzeichnisse durchsuchen kann?

JAR ist im Endeffekt sehr vereinfacht gesagt sowas wie eine ZIP.

Also suche nach einer Möglichkeit gepackte Daten auszulesen.

Bzw. kannst du das JAR in einen temp Ordner auspacken und dann den Ordner durchsuchen. Sollte aber auch leichter möglich sein.

Also das mit deiner Idee die Dateien in einen Anderen Ordner zu legen hat nicht geklappt... zwar beim ausführen in eclipse usw. jedoch nicht nach dem Packen in .jar..

D.h. ich werde wohl wirklich das ganze über ZIP archiv oder irgendwas auslesen müssen.

Gruß

Startest du das JAR per Doppelklick?

versuchs mal damit:

Auf der Shell in den Ordner wechseln wo die JAR liegt und dann eintippen "java -jar deinJarName.jar"

ja tue ich...

ja hab e ich probiert, bringt aber nichts...

und das mit dem im .jar verzeichnisse auslesen bekomm ich auch noch nicht so auf die reihe..

Servus,

Du musst das JAR nicht auspacken. Über Class#getRessource oder Class#getRessourceAsStream kannst Du auf Ressourcen in Deinem Classpath zugreifen. Wenn Deine Datei im JAR ist, liegt sie im Classpath und kann dann auch gelesen werden.

Peter

Okay, also ich habe es nun hinbekommen mein gewünschtes verzeichnis auszulesen... somit werd ich das dann hinbekommen.


JarFile jf = new JarFile(filename);

		    Enumeration e = jf.entries();

		    while (e.hasMoreElements()) {

		      JarEntry je = (JarEntry) e.nextElement();


		      if(je.getName().contains(icon_path)){

		    	  String name = je.getName();

		    	  System.out.println(name);

		      }


		    }

Was nun noch ein Problem ist: der filename?!

Wie bekomme ich den filename des .jar archives heraus... z.B. fall es umbenannt wurde.

ich hatte da heute schon irgendwas mit class.getRessource() gesehen ja... aber ich weiss nicht mehr wie das war...

Kannst du das genauer erläutern?

Gruß

Okay habe nun rausgefunden wie man das Stammverzeichnis, also den Name des .jar Files, der Klasse herausfindet:

File filename = new File(ChatClient.class.getProtectionDomain().getCodeSource().getLocation().toURI());

Gruß

nene, wenn du deine icons mit in das Jar file rein packst, dann kannst du einfach so darauf zugreifen:

java.net.URL imgURL = ResourceManager.class.getResource( "chat/smilies/foo.png" );

if (imgURL != null)

{

return new ImageIcon( imgURL, iconDescr );

}

else

{

System.err.println( "Couldn't find file" );

}

Geht aber auch nur, wenn die Datei mir in der JAR ist.

ich kenne aber die dateinamen nicht^^

das ist ja gerade das Problen^^

ich habe das alles so geschrieben, dass ich einfach nur wenn ich ein icon mehr haben möchte, eines in den ordner dazu legen muss^^

er soll dort ja dann durch iterieren und dann anhand der verfügbaren files die icons erstellen...

Du kannst doch einfach das URL Objekt an ein File Objekt übergeben und die Url nur bis zum Ordner definieren.

Dann file.isDirectory() -> file.listFiles()

Scho haste alle Dateien als FileObjekte in einem Array und kannst die nach Namen abfragen und wenn nötig als Icon verwenden.

Vielleicht willst Du auch noch mal Deinen Ansatz überdenken. Ein JAR ist dazu da, dass Du eine Anwendung darin komplett ausliefern kannst. Wenn jetzt ein neues Icon hinzukommen soll, soll der Anwender dann das JAR entpacken, ein Icon hineinlegen, zippen und als JAR umbenennen? Wenn Du die Dateien "von außen" verfügbar haben willst, dann lass sie am besten auch außerhalb des JARs.

Erklär mal, was Du wirklich machen willst. Dann kann man eher sagen, was Du machen kannst.

Peter

Also..

Ich habe für unsere FI-Klasse nen Chat gebastelt.. für die Schule, der auch funktionieren soll, ohne dass das Internet im Raum freigeschaltet wurde.

Es liegen ein paar dateien in einem Tausch Verzeichnis auf dem Server, der immer verfügbar ist, in die die Daten gepeichert werden... z.B. der Chatlog..

Die Icons wollte ich deswegen extra mit in das File packen, damit sie nicht irgendwo auf dem Server rumliegen und dies jemand dann bemerkt.

Das ist ja auch kein Problem, denn sobald ich ich einer Datei, auf die beim ausführen des Files immer überprüft wird, ändere (die Versions-Nummer des Chats) zieht sich die Datei automatisch die Version im Ordner aufm Server und überschreibt sich, sollte die Version nicht übereinstimmen...

Also Packe ich irgendwann mal neue Smilies rein, dann bekommen die Leute die das File nutzen sicher beim nächsten ausführen nach dem nächsten start.

Und ausserdem habe ich ja nicht vor dort jeden Tag neue Smilies reinzupacken, das war einfach nur für mich ne Vereinfachung, damit ich, wenn ich nicht irgendwann dort neue Icons einfüge, den ganzen Quellcode nochmal ändern muss... so stecke ich einfach smilies rein, oder nehm welche raus, ändere die Versions-Nummer und dann passt die Sache...

Es läuft ja jetzt auch alles inzwischen.. ich hab das dann alles hinbekommen...

Also hier mal der Code wie ich das jetzt mache:


File filename = new File(ChatAdmin.class.getProtectionDomain().getCodeSource().getLocation().toURI());


			/** Icons for run class in .jar */

			if(filename.getName().contains(".jar")){


				icon_path = "jar:"+filename.toURI()+"!/data/smilies/";

				JarFile jf = new JarFile(filename);

			    Enumeration e = jf.entries();


			    int entryCount = -1;


			    while (e.hasMoreElements()) {

			      JarEntry je = (JarEntry) e.nextElement();


			      if(je.getName().contains("data/smilies/")){

			    	  String name = je.getName();

			    	  entryCount++;

			      }


			    }


			    try{	

			    	Enumeration z = jf.entries();

					i = 0;

					icons = new ImageIcon[entryCount];


					while (z.hasMoreElements()) {

					      JarEntry je2 = (JarEntry) z.nextElement();


					      if(je2.getName().contains("data/smilies/")){

					    	  String name = je2.getName();

					    	  try{	

					    		  URL imgURL = ChatAdmin.class.getResource(name);

					    		  icons[i] = new ImageIcon(imgURL);


								}catch(IndexOutOfBoundsException df){	

								}

							    i++;

					      }

					    }

				}catch(NullPointerException npe){

				}



			 /** Icons for run class in .java */

			}else{

				// Sets icon_path

				icon_path = "data/smilies/";

				try{

					// Looks into the file directory

					File dir = new File(icon_path);

					File[] fileList = dir.listFiles();


					i = 0;

					icons = new ImageIcon[fileList.length];


					for(File f : fileList) {

						try{

							// defines all smilies

							icons[i] = new ImageIcon(icon_path+f.getName());

						}catch(IndexOutOfBoundsException df){	

						}

					    i++;

					}

				}catch(NullPointerException npe){

				}

			}

Also am anfang überprüft er erstmal ob ich das Teil so rennen lass oder als .jar Datei, und je nach dem baut er sich halt die Icons dann zusammen.

Gruß Dominik

Bearbeitet von dommes89

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.