Erwähnen Sie, dass es nur in Windows
überprüft wurde, aber ich denke, dass es auf anderen Betriebssystemen [Linux,MacOs,Solaris
] perfekt funktioniert :).
Ich hatte 2 .jar
Dateien im selben Verzeichnis. Ich wollte von der einen .jar
Datei die andere .jar
Datei starten, die sich im selben Verzeichnis befindet.
Das Problem ist, dass wenn Sie es vom cmd
starten, das aktuelle Verzeichnis system32
ist.
Warnungen!
- Das unten stehende scheint in all meinen Tests recht gut zu funktionieren, auch mit Ordnernamen wie
;][[;'57f2g34g87-8+9-09!2#@!$%^^&()
oder ()%&$%^@#
funktioniert es gut.
- Ich verwende den
ProcessBuilder
mit dem folgenden Code:
..
// Die Klasse, von der aus ich dies aufgerufen habe, war die Klasse `Main`
String path = getBasePathForClass(Main.class);
String applicationPath = new File(path + "application.jar").getAbsolutePath();
System.out.println("Verzeichnispfad ist: "+applicationPath);
// Ihr bekanntes Try-Catch hier
// Erwähnen Sie, dass es manchmal nicht funktioniert, zum Beispiel mit dem Ordner `;][[;'57f2g34g87-8+9-09!2#@!$%^^&()`
ProcessBuilder builder = new ProcessBuilder("java", "-jar", applicationPath);
builder.redirectErrorStream(true);
Process process = builder.start();
//...Code
getBasePathForClass(Class classs)
:
/**
* Gibt den absoluten Pfad des aktuellen Verzeichnisses zurück, in dem die gegebene Klasse
* Datei ist.
*
* @param classs
* @return Der absolute Pfad des aktuellen Verzeichnisses, in dem die Klassen
* Datei ist.
* @author GOXR3PLUS[StackOverFlow-Benutzer] + bachden [StackOverFlow-Benutzer]
*/
public static final String getBasePathForClass(Class classs) {
// Lokale Variablen
File file;
String basePath = "";
boolean failed = false;
// Lass es uns zuerst versuchen
try {
file = new File(classs.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
if (file.isFile() || file.getPath().endsWith(".jar") || file.getPath().endsWith(".zip")) {
basePath = file.getParent();
} else {
basePath = file.getPath();
}
} catch (URISyntaxException ex) {
failed = true;
Logger.getLogger(classs.getName()).log(Level.WARNING,
"Kann den Basispfad für die Klasse mit Methode (1) nicht ermitteln: ", ex);
}
// Das obige ist fehlgeschlagen?
if (failed) {
try {
file = new File(classs.getClassLoader().getResource("").toURI().getPath());
basePath = file.getAbsolutePath();
// das untenstehende ist für Testzwecke...
// beginnt mit File.separator?
// String l = local.replaceFirst("[" + File.separator +
// "/\\\\]", "")
} catch (URISyntaxException ex) {
Logger.getLogger(classs.getName()).log(Level.WARNING,
"Kann den Basispfad für die Klasse mit Methode (2) nicht ermitteln: ", ex);
}
}
// Fix, um innerhalb von Eclipse zu laufen
if (basePath.endsWith(File.separator + "lib") || basePath.endsWith(File.separator + "bin")
|| basePath.endsWith("bin" + File.separator) || basePath.endsWith("lib" + File.separator)) {
basePath = basePath.substring(0, basePath.length() - 4);
}
// Fix, um innerhalb von NetBeans zu laufen
if (basePath.endsWith(File.separator + "build" + File.separator + "classes")) {
basePath = basePath.substring(0, basePath.length() - 14);
}
// end fix
if (!basePath.endsWith(File.separator)) {
basePath = basePath + File.separator;
}
return basePath;
}