4 Stimmen

Die richtige Art und Weise, eine ausführbare Datei (.exe) in verschiedenen Situationen auszuführen

Diese Art von Problem nervt mich schon seit einer Weile, daher war ich neugierig, wie ihr die folgende Situation handhabt:

Stellen Sie sich vor, ich habe zwei verschiedene Eclipse-Projekte im gleichen Arbeitsbereich mit den Namen ProjectA und ProjectB. ProjektB enthält eine .exe-Datei in seinem Root, die von ProjektA wie folgt aufgerufen wird:

Process p = Runtime.getRuntime().exec( "../ProjectB/ProjectB.exe" );

Das Problem ist nun, dass sich die Struktur nach der Einführung leicht verändert: ProjectA ist jetzt ein .jar. Neben diesem jar ist nun ein Ordner mit ProjectB, der ProjectB mit seiner .exe, .jars usw. enthält. Der richtige Aufruf müsste nun wie folgt aussehen:

Process p = Runtime.getRuntime().exec( "ProjectB/ProjectB.exe" );

Da ich diese Strukturen so belassen muss, wie sie sind, und ich nicht für jeden Fall zwei verschiedene .exec-Aufrufe in meiner Anwendung haben möchte, habe ich verschiedene Möglichkeiten ausprobiert, um diese Situation zu umgehen:

1) Hinzufügen von ProjectB als ClassFolder zu ProjectA und den ContextClassLoader herausfinden lassen, wo ProjectB.exe wie folgt zu finden ist:

URL url= Thread.currentThread().getContextClassLoader().getResource( "ProjectB.exe" );
file = new File( url.toURI() );
Process p = Runtime.getRuntime().exec( file.getAbsolutePath() );

Diese Lösung funktionierte einwandfrei, bis ich versuchte, meine Anwendung auf einem Netzlaufwerk bereitzustellen.

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: URI has an authority component
    at java.io.File.<init>(Unknown Source)

2) Da ich nicht für jeden Client ein Netzlaufwerk erstellen darf, habe ich versucht, dieses Problem zu umgehen, und bin wie folgt vorgegangen:

URL url= Thread.currentThread().getContextClassLoader().getResource( "ProjectB.exe" );
File file = new File( url.getFile() );
Process p = Runtime.getRuntime().exec( file.getAbsolutePath() );

Das schien vielversprechend zu sein, aber leider nur, solange mein Pfad ohne Bindestriche(" ") blieb, da dieser Appraoch jeden Bindestrich in "%20" umzuwandeln schien, was der Runtimeexecutor nicht wirklich zu mögen scheint. Natürlich könnte ich anschließend jedes "%20" in " " ersetzen, aber das erscheint mir etwas hakelig.

Eine weitere Anforderung ist, dass beide Anwendungen in einer anderen JVM laufen müssen, weshalb ich die .exe-Datei per Runtimeexecution aufrufe. Meine letzte Frage lautet also: Gibt es eine Möglichkeit, die ProjectB-Aufrufe ohne Umgehungslösungen zu reinigen?

1voto

Aaron Digulla Punkte 308693

Der saubere Weg ist, einen Suchpfad zu definieren (mehrere File Instanzen, die auf ein anderes Verzeichnis zeigen). Hängen Sie den Namen der Exe an jeden Pfad an und prüfen Sie, ob die resultierende File vorhanden ist, und verwenden Sie diesen Pfad zur Ausführung.

Eine Ausnahme bildet die Sicherheitsschicht von Windows: Sie erlaubt es nicht, unbekannte exe-Dateien von einem Netzwerkpfad auszuführen. Fragen Sie Ihren Systemadministrator nach einer Lösung.

Beachten Sie, dass Sie Exe-Dateien nicht immer über den Klassenpfad laden können. Wenn sie zum Beispiel in einem JAR enthalten sind, wird es nicht funktionieren. Der Launcher von Windows weiß nicht, wie er mit JAR-Dateien umgehen soll. Die Lösung besteht darin, die Ressource in eine temporäre Datei zu entpacken und sie von dort aus zu starten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X