Zum Inhalt springen

Datei-Pfade innerhalb von .JAR


dommes89

Empfohlene Beiträge

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
Link zu diesem Kommentar
Auf anderen Seiten teilen

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
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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ß

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...