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?