2010-12-12 14 views

Respuesta

6

No es posible, en general.

La receta proporcionada en la respuesta de @khachik no necesariamente funcionará para una implementación que no sea de Sun de Java.

  • El ejecutable de Java no es necesariamente llama java y no necesariamente viven en el bin subdirectorio. Incluso con Sun Java, en Windows hay dos ejecutables; java y javaw.

  • Las opciones de comando para el comando que inicia una JVM son diferentes para las diferentes implementaciones de Java. Por lo tanto, el paso ProcessBuilder puede incluir argumentos no portátiles.


Aunque la mayoría de las JVM han adoptado las primarias Sun java opciones de comando, existen numerosas diferencias. Por ejemplo:

  • IBM J9 utiliza j9 y j9w como los nombres de los ejecutables.
  • BEA/Oracle JRockit tiene diferentes -X y -XX opciones.
  • Jikes RVMrvm utiliza como el nombre del ejecutable, y sólo soporta un subconjunto de java opciones de Sun.
  • IKVM usa ikvm como el nombre del archivo ejecutable.

(Nota: estos son sólo ejemplos que se destacan en una lectura superficial de la respectiva documentación en línea.)

+0

¿Algún enlace para apoyar su primera demanda? –

10

Puede utilizar java.home propiedad del sistema para encontrar la JVM actual:

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

y luego ejecutarlo utilizando ProcessBuilder (o Runtime.exec).

Tenga en cuenta que para JDK java.home apunta al directorio JRE incluido en JDK.

1

¿Ha intentado utilizar las bibliotecas Apache Commons? Si no le has dado una oportunidad al launcher project. Fue bastante útil para mí hace algún tiempo.

Aquí está la descripción del proyecto desde su sitio:

El componente Launcher está diseñado para ser un lanzador de aplicaciones Java multiplataforma.

Las clases Java originales provienen del proyecto Tomcat 4.0.

Commons-launcher elimina la necesidad de un script por lotes o shell para iniciar una clase Java.Algunas situaciones en las que puede ser deseable eliminar un lote o un script de shell son:

  • Quiere evitar tener que determinar dónde se encuentran ciertas rutas de acceso de aplicaciones, p. el directorio de inicio de su aplicación, etc. Determinar esto dinámicamente en un script de lote de Windows es muy complicado en algunas versiones de Windows o cuando los softlinks se usan en plataformas de Unix.
  • Desea evitar tener que manejar separadores nativos de archivos y rutas o problemas de citas de rutas nativas.
  • Debe aplicar ciertas propiedades del sistema, p. java.endorsed.dirs cuando se ejecuta con JDK 1.4.
  • Desea permitir a los usuarios pasar argumentos de JVM personalizados o propiedades del sistema sin tener que analizar y reordenar argumentos en su secuencia de comandos. Esto puede ser complicado y/o complicado en los guiones por lotes y de shell. Desea iniciar las propiedades del sistema desde un archivo de configuración en lugar de codificarlas en sus secuencias de comandos de proceso por lotes y de shell.
  • Desea proporcionar mensajes de error localizados, lo cual es muy complicado de hacer en los scripts por lotes y shell.
+0

Si lo entiendo, no ayuda iniciar un proceso Java, sino cualquier proceso externo donde conozco el ejecutable. Pero este es el problema. No sé el ejecutable actual. – Horcrux7

Cuestiones relacionadas