2010-12-12 5 views

Antwort

6

Es ist im Allgemeinen nicht möglich.

Das in @ khachiks Antwort angegebene Rezept funktioniert nicht unbedingt für eine nicht Sun-Implementierung von Java.

  • ausführbaren Java-Datei nicht notwendigerweise java genannt und nicht notwendigerweise im bin Unterverzeichnis leben. Auch unter Sun Java gibt es unter Windows zwei ausführbare Dateien. java und javaw.

  • Die Befehlsoptionen für den Befehl zum Starten einer JVM sind für verschiedene Java-Implementierungen unterschiedlich. So kann der Schritt ProcessBuilder nicht portable Argumente beinhalten.


Während der meisten JVMs die primären Sun java Befehlsoptionen angenommen hat, gibt es zahlreiche Unterschiede. Zum Beispiel:

  • IBM J9 verwendet j9 und j9w wie die Namen der ausführbaren Dateien.
  • BEA/Oracle JRockit hat verschiedene -X und -XX Optionen.
  • verwendet rvm als den Namen der ausführbaren Datei und unterstützt nur eine Untergruppe von Sun java Optionen.
  • IKVM verwendet ikvm als ausführbaren Namen.

(Hinweis: Dies sind nur Beispiele, die in einem flüchtigen Lesen der entsprechenden Online-Dokumentation abheben.)

+0

Alle Links zur Unterstützung Ihrer ersten Behauptung? –

10

können Sie java.home Systemeigenschaft verwenden, um die aktuelle JVM zu finden:

String jvm = new java.io.File(new java.io.File(System.getProperty("java.home"), 
               "bin"), 
           "java").getAbsolutePath(); 

und dann laufen ProcessBuilder (oder Runtime.exec).

Beachten Sie, dass für JDK java.home verweist auf das JRE-Verzeichnis in JDK enthalten.

1

Haben Sie versucht, die Apache Commons Libs verwenden? Wenn Sie die launcher project nicht versuchen, versuchen Sie es. Es war ziemlich nützlich für mich vor einiger Zeit.

Hier ist die Projektbeschreibung von ihrer Website:

Die Launcher-Komponente ist so konzipiert, ein Cross-Plattform Java Anwendungsstarter zu sein.

Die ursprünglichen Java-Klassen stammen aus dem Tomcat 4.0-Projekt.

Mit dem Commons-Launcher wird ein Stapel- oder Shell-Skript zum Starten einer Java-Klasse überflüssig.Einige Situationen, in denen die Eliminierung eines Stapel- oder Shell-Skripts wünschenswert sein kann, sind:

  • Sie möchten vermeiden zu bestimmen, wo bestimmte Anwendungspfade z.B. B. das Home-Verzeichnis Ihrer Anwendung usw. Das dynamische Bestimmen in einem Windows-Batch-Skript ist bei einigen Windows-Versionen oder beim Einsatz von Softlinks auf Unix-Plattformen sehr schwierig.
  • Sie möchten vermeiden, dass Sie mit systemeigenen Datei- und Pfadtrennzeichen oder Problemen mit systemeigenen Pfadangaben umgehen müssen.
  • Sie müssen bestimmte Systemeigenschaften erzwingen, z. java.endorsed.dirs beim Ausführen mit JDK 1.4.
  • Sie möchten, dass Benutzer benutzerdefinierte JVM-Argumente oder Systemeigenschaften übergeben können, ohne Argumente in Ihrem Skript analysieren und neu anordnen zu müssen. Dies kann in Batch- und Shell-Skripten schwierig und/oder unordentlich sein. Sie möchten Systemeigenschaften von einer Konfigurationsdatei starten, statt sie in Ihren Batch- und Shell-Skripten hart zu codieren.
  • Sie möchten lokalisierte Fehlermeldungen bereitstellen, was in Batch- und Shell-Skripten sehr schwierig ist.
+0

Wenn ich es verstehe, dann hilft es nicht, einen Java-Prozess sonst irgendeinen externen Prozess zu starten, wo ich die ausführbare Datei kenne. Aber das ist das Problem. Ich kenne die aktuelle ausführbare Datei nicht. – Horcrux7