Jar-File soll eignen *.jar Namen ausgeben

G

GuestOnly

Gast
Hallo

Ich habe eine *.jar Datei welche ihren eigenen Namen kennen soll.
Also wenn die Datei zB "Projekt.jar" heisst soll das Programm in der Lage sein diesen auszugeben auch wenn man die Datei umbenent.
Der Pfad wo sich die *.jar Datei befindet ist dabei egal es geht ausschliesslich um den Namen.
Der Name sollte als String o.ae. im Programm zur Verfuegung stehen (und dann ggf. ausgegebn werde). Wie lautet diese Befehlszeile?
Suchen im Forum oder ueber andere Seiten ergaben nicht die Egebnisse nach denen ich gesucht habe....

Gruss
 
N

nillehammer

Gast
Ist ein bischen von hinten durch die Brust ins Auge. Aber wenn du in dem fraglichen Jar-File eine Dir bekannte Resource hast, kannst Du dir mit getResource("/package/Resource") die URL zu dieser Resource holen. Diese enthält u.a. auch den Namen des jar-Files. Hier mal ein Codeschnipsel, der rausprintet, in welchem jar sich java.io.File befindet:
Java:
public final class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Throwable {

		// Aufruf muss passen, sonst NullpointerException!
		final String jarUrlString = Main.class.getResource(
				"/java/io/File.class").toString();

		System.out.println(jarUrlString);

		// hier noch ein bischen Fummelkram, um den Teil mit dem ".jar"
		// aus dem String rauszupulen.
	}
}
 
Zuletzt bearbeitet von einem Moderator:
G

GuestOnly

Gast
Vielen Dank fuer die schnelle Antwort!

Allerdings gibt mir das Programm mit dem Namen "Test.jar" (mit der zu testenden Methode)
folgendes aus:

jar:file:/C:/Program%20Files%20(x86)/Java/jre6/lib/rt.jar!/java/io/File.class

--> keinen Hinweis auf den .jar Namen.

Ich hatte es bereits ueber main.class.getResource("main.class") versucht.
Dort musste ich auch umstaendlich den .jar Namen auslesen was allerdings ausschlieslich auf meinem Computer funktionierte (bei einem weiteren win7 und einem xp probiert).
Gib es da keine anderen Moeglichkeiten??

Gruss
 
G

GuestOnly

Gast
Hatte einen Parameter vergessen...
Nun tut er es genau wie meine vorher benutzte Methode. Wird sie auf anderen Computern (anderes OS) aber auch zuverlaessig funktionieren? Werde es zeitnah ausprobieren....
Gibt es keine eleganteren Moeglichkeiten?
 
N

nillehammer

Gast
GuestOnly hat gesagt.:
Allerdings gibt mir das Programm mit dem Namen "Test.jar" (mit der zu testenden Methode)
folgendes aus:

jar:file:/C:/Program%20Files%20(x86)/Java/jre6/lib/rt.jar!/java/io/File.class

--> keinen Hinweis auf den .jar Namen.
Schau mal genau hin. Habe es fett gemacht:
jar:file:/C:/Program%20Files%20(x86)/Java/jre6/lib/rt.jar!/java/io/File.class
Das Ausrufezeichen ist ein guter Ankerpunkt für's Rauspulen.

Und Du musst auch meine Tipps genauer lesen. Du musst natürlich eine Resource aus dem jar nehmen, dessen Namen du wissen willst. Das mit File.class war ein Beispiel.
 
G

GuestOnly

Gast
Ja ich hatte nicht genau gelesen...

mit folgender Methode hab ich es nun realisiert:

Java:
static void name()
    {   
      
        
  final String n=CClient.class.getResource("CClient.class").toString();
          int i=n.length()-19;
            for(;;)
            { 
              
              if(n.substring(i-1,i).equals("/")){break;}
                i--;
                if((i-1)<0){break;}
            }
           System.out.println(n.substring(i,n.length()-19)+".jar");

          
    }

Scheint bisher zu klappen (noch nicht getestet auf anderen PCs) aber ist eig. 1zu1 die Methode die ich vorher nutzte und die bei anderen Computern nicht funktionierte. Ich werde es ausprobieren und berichten.

Danke vorab!

Gruss
 
N

nillehammer

Gast
Klappt das wirklich? Finde die for-Schleife mit leeren Anweisungen etwas merkwürdig und die fixe Länge 19 ist auch eine Fehlerquelle, wenn die Klasse mal umbenannt wird (obwohl die URL dan eh null wäre). Habe mal eine Methode geschrieben, die etwas flexibler ist und vor allem auch vernünftig eventuelle Fehlerzustände mittels geeigneter Exceptions reportet. Die Methode und die Kosntante kannste in eine Klasse Deiner Wahl kopieren.
Java:
private static final String JAR = "jar";
	/**
	 * Finds the file name of a jar a given resource is packaged in.
	 * 
	 * @param resourceUrl
	 *            the jar-URL pointing to the resource in question, must not be
	 *            null and must be a jar-URL (jar:...)
	 * @return the jar file name
	 * @throws NullPointerException
	 *             if resourceUrl is null
	 * @throws IllegalArgumentException
	 *             if resourceUrl is not a jar-URL
	 * @throws IllegalStateException
	 *             if resourceUrl does not contain a jar file name
	 */
	public static String findJarName(final URL resourceUrl) {

		if (!JAR.equals(resourceUrl.getProtocol())) {

			throw new IllegalArgumentException(
					"resourceUrl must be a jar-URL but is: " + resourceUrl);
		}

		final String[] pathParts = resourceUrl.getPath().split("[/!]");

		for (final String pathPart : pathParts) {

			if (pathPart.contains(JAR)) {
				return pathPart;
			}
		}

		throw new IllegalStateException(
				"Resource Url does not contain a jar file name: " + resourceUrl);
	}
}
 
G

GuestOnly

Gast
@ nillehammer Sieht eleganter aus und laeuft gut!

@ irgendjemand Dieser Thread ist auch erst von gestern^^

Gibt es Unterschiede zwischen den beiden Wegen? Ist einer vielleicht vielseitiger oder verlaesslicher jenachdem unter welchem OS er ausgefuehrt wird o.ae.

Java:
...
File me = new File(<CLASSNAME>.class.getProtectionDomain().getCodeSource().getLocation().toURI());
...

Gibt es da (Problembezogen) generell einen Unterschied von wo aus die .jar gestartet wird?
Also ueber ein direktes ausfuehren, ueber eine .bat oder .vbs ??
 

irgendjemand

Top Contributor
ja ... es gibt einen sehr wichtigen unterschied ... du musst dich nicht um decoding der URL kümmern ...

ich versuchs mal so zu erklären

bei der variante über getResource() erhält man eine URL welche auch durch "!" getrennt den "pfad" innerhalb des jar zur resource enthält ...
man kann zwar jetzt aus dieser URL auch eine URI machen ... jedoch über diese URI kein File objekt erzeugen ...
also müsste man aus der URL erst einen String machen ... dann den jar-internen teil abtrennen ... dann wieder aus dem string eine URL parsen ... diese umwandeln zu einer URI und könnte DANN erst ein File objekt erzeugen ...

und das ist einfach viel umständlicher und birgt auch einige enconding-risiken ... als gleich dierekt eine URL auf das JAR zu erhalten ... diese dierekt in eine URI umzuwandeln ... und dann daraus dierekt das File objekt erstellen ...

oder kurz : die andere variante ist kürzer und zuverlässiger

einen unterschied WIE das jar gecallt wird gibt es bei keiner variante ...
jedoch gibt es einen unterschied zwischen "im jar" und "ohne jar" ...
bei der variante über getResource() nämlich sein das es probleme gibt die eigentlich "bekannte" resource zu finden ... weil sie plötzlich doch an einem anderen ort liegt ...
auch muss man grundsätzlich immer auf "!/" prüfen was signalisiert ob es ein JAR ist oder nicht ... alles in allem ein haufen "fummelei" ...
bei dem einzeiler reicht ein folgendes [c]if(me.isFile()) { me=me.getParentFile(); }[/c] um dann auf den ordner zu kommen in dem das jar liegt *falls notwendig*
also alles in allem einen "zwei-zeiler" ...
bei "getResource()" werden es mal locker 4 bis 6 ... und es ist wie gesagt unzuverlässiger als der zwei-zeiler ...


btw : ich habe früher auch mal versucht über [c]this.getClass().getResource(this.getClass().getSimpleName()+".class")[/c] und dann fummelei mit URL , String , URI , File versucht den pfad zum aktuellen JAR zu bekommen ... und was meinst du wie sehr ich dabei gerade unter windows auf die schnauze gefallen bin ...
ich hab dann hier auch mal irgendwann diesen zwei-zeiler gelesen ... und er hat bis her IMMER funktioniert ... ergo : hat sich bewährt und wurde für "perfekt" befunden =D
 
G

GuestOnly

Gast
Vielen Dank fuer diese detailleirte Antwort!
Gut erklaert!

Problem geloesst wuerd ich sagen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R FileChooser soll nur das File ausgeben Allgemeine Java-Themen 4
G Jar File soll anderes benutzen Allgemeine Java-Themen 3
H "File too large" - genauere IOException-Behandlung Allgemeine Java-Themen 5
H Sicherer File Tresor Allgemeine Java-Themen 13
W Jar-File Start nur über Terminal Allgemeine Java-Themen 13
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
D Read JSON File Problem Allgemeine Java-Themen 9
S Umstellung von File auf Path - Probleme mit Stream Allgemeine Java-Themen 5
C jar File mehrfach aufrufen (als Windows Dienst) Allgemeine Java-Themen 5
N File Path mit Variablen angeben Allgemeine Java-Themen 1
izoards Zugriff auf gemeinsame Ressource (CSV-File) Allgemeine Java-Themen 3
S Class File Editor -> Source not found Allgemeine Java-Themen 4
F jar File ausführen Allgemeine Java-Themen 14
M File Binary Representation Allgemeine Java-Themen 1
N jar File auf Mac mit Doppelklick starten Allgemeine Java-Themen 5
O Input/Output java.io.File beenden Allgemeine Java-Themen 5
G File not found - nach dem Kompilieren Allgemeine Java-Themen 6
T Jar File zu exe... Allgemeine Java-Themen 3
M Foreign Memory API / Memory-Mapped File Allgemeine Java-Themen 0
R Delete files before creating new from temp using Java file method Allgemeine Java-Themen 1
S File lesen und schreiben Java 6 Allgemeine Java-Themen 2
T String-Manipulation beim Ablauf in Eclipse und als JAR-File Allgemeine Java-Themen 8
F Input/Output FileNotFoundException, obwohl File existiert Allgemeine Java-Themen 5
G Excel File öffnen, in Zelle schreiben, abspeichern Allgemeine Java-Themen 6
L JAR-File auf Ilias (LMS) laufen lassen Allgemeine Java-Themen 0
ralfb1105 Classpath Directory fuer Properties File Allgemeine Java-Themen 2
L File beim Kopieren in einen anderen Ordner umbenennen Allgemeine Java-Themen 6
J File in Package erstellen & lesen mit Programmstart in externe Projekt Allgemeine Java-Themen 3
I File ausführen und mein Programm bearbeiten lassen Allgemeine Java-Themen 11
A File lesen Codierung Charset Allgemeine Java-Themen 5
J .java-Dateitext Compile zur Laufzeit ohne File Allgemeine Java-Themen 15
M Key-File im selben Ordner speichern? Allgemeine Java-Themen 18
I TrueZip add file to archive Allgemeine Java-Themen 10
T Probleme mit dem Pfad zum Propertie file Allgemeine Java-Themen 7
J ftp - delete file ohne appache Allgemeine Java-Themen 8
X Klassen File-Klasse wird als Directory markiert Allgemeine Java-Themen 8
T ImageIO.read -> Can`t read input file Allgemeine Java-Themen 11
L Applet Problem "security: Trusted libraries list file not found" ? Allgemeine Java-Themen 7
C Swing File[] als klickbare links in irgendeinem Swing Element Allgemeine Java-Themen 3
H Kennt sich jemand mit Eclipse und dem Thema Jar-File aus ? Allgemeine Java-Themen 6
H Laden einer (Resourcendatei) aus einem Jar-File Allgemeine Java-Themen 17
C Authentifizierung mit java.nio.file? Allgemeine Java-Themen 5
L CSV File lesen, in ArrayList speichern und ausgeben Allgemeine Java-Themen 3
M xlsx File auslesen Exception occured Allgemeine Java-Themen 13
offi Drag and Drop mehrerer File aus Explorer in JTable Allgemeine Java-Themen 1
G Java/LibGDX File Loading Exception Allgemeine Java-Themen 2
Cromewell JavaFX FXML-File lädt unter Ubuntu nicht Allgemeine Java-Themen 7
D Java Anwendung mit dll File Allgemeine Java-Themen 5
AssELAss Log4j Logging Ausgabe für jede Klasse in seperates File Allgemeine Java-Themen 2
thet1983 Input/Output read properties file from classpath Allgemeine Java-Themen 3
J Umwandeln von URL zu File und danach kopieren geht nicht Allgemeine Java-Themen 1
J Properties file ändern Allgemeine Java-Themen 12
S Executable Jar File startet nicht unter Windows 10 Allgemeine Java-Themen 3
B Objekte anhand von Properties file Allgemeine Java-Themen 41
Dechasa Input/Output Write into File Allgemeine Java-Themen 2
N Maven ObjectMapper Error wenn das File gespeichert wird Allgemeine Java-Themen 0
H Security Manager (IIOException: Can't read input file!) Allgemeine Java-Themen 2
H File.listFiles() funktioniert nicht... Allgemeine Java-Themen 10
C Input/Output Problem bei Datei verschiebung mit File.move und Paths.get() Allgemeine Java-Themen 26
X Zeile unter einer bestimmen Zeile hinzufügen(File) Allgemeine Java-Themen 1
F Open source file übersetzen Phython -> Java Allgemeine Java-Themen 4
C file.delete() funktioniert bei zweiten aufruf nicht mehr Allgemeine Java-Themen 3
M Desktop jar File icon Ändern? Allgemeine Java-Themen 14
O Sax-Parser ließt XML-File doppelt Allgemeine Java-Themen 1
J Java Software Compare Files und Neue File erstellen Allgemeine Java-Themen 0
Thallius Custom File Chooser Allgemeine Java-Themen 1
C .jar File lässt sich nur über Konsole öffnen Allgemeine Java-Themen 1
J Java Download Filedownload File.getFileName Allgemeine Java-Themen 3
R Java .class-File-Konstrunkt mit Programm visualisieren Allgemeine Java-Themen 18
G SecurityManager/Policy-File/Reflection Allgemeine Java-Themen 0
M pdf File bzw. ausgefüllte pdf Formulare drucken Allgemeine Java-Themen 2
S Input/Output File Not Found FileReader Allgemeine Java-Themen 6
Thallius Serialisiertes File kann auf anderem Rechner nicht geladen werden Allgemeine Java-Themen 12
P Java Dynamic Web Project -> config File Allgemeine Java-Themen 1
S runnable jar file in Verbindung mit itext Allgemeine Java-Themen 3
D Variablen java.io.File zum vergleichen abspeichern Allgemeine Java-Themen 1
M File IO Klasse ... wie einbinden Allgemeine Java-Themen 6
O Freies Tool zum Jar-File obfuscaten gesucht! Allgemeine Java-Themen 5
F File.listFiles ohne .sort Allgemeine Java-Themen 6
B XML File JAXB Allgemeine Java-Themen 0
S Platzverbrauch, File oder String Allgemeine Java-Themen 14
J Runnable jar-File: Fehlermeldung Allgemeine Java-Themen 2
P Kurze Frage: aus einer File die Zeilenanzahl auslesen Allgemeine Java-Themen 9
K Gepacktes Jar-File gibt beim Doppelklick eine Exception aus Allgemeine Java-Themen 4
P java.nio.file unter Java 6 verwenden Allgemeine Java-Themen 4
A TXT File einlesen unterschiedliche Zeilenlänge Allgemeine Java-Themen 9
B Finde letztes veränderte File Allgemeine Java-Themen 4
E Zip-File entpacken: unterschiedlicher Zeitaufwand bei unterschiedlicher Puffergröße Allgemeine Java-Themen 2
Guybrush Threepwood File.canWrite() und UAC Allgemeine Java-Themen 7
N Input/Output Mit Windows 7 erzeugtes zip-File in Java 7 öffnen Allgemeine Java-Themen 5
B Garbage Collection Logfile: Binary File Allgemeine Java-Themen 2
H XML-File mit Java erzeugt Frage Allgemeine Java-Themen 10
V C-Header Datei aus .java File herstellen Allgemeine Java-Themen 10
D File mit Inhalt kopieren und dieses File dann neu erstellen ? Allgemeine Java-Themen 4
T @NotBlank verwendet nicht message aus .property-File Allgemeine Java-Themen 4
S Jar-File startet nicht über doppelklick Allgemeine Java-Themen 2
P ganze Zeilen in einem File mit .replace() ändern. Allgemeine Java-Themen 10
S Datei in File-Objekt mit UTF-8 einlesen Allgemeine Java-Themen 2
P Aus einem File Zeilen auslesen. Allgemeine Java-Themen 15
V ProcessBuilder exe file Allgemeine Java-Themen 3

Ähnliche Java Themen


Oben