x64_bin jdk for 4_windows java windows java-9

java - jdk - ¿Por qué mantiene bloqueados los módulos/lib?



jdk 9 download (2)

Cuando lanzo cualquier aplicación de terceros, por ejemplo, el Bloc de notas (pero podría tomar cualquier otra cosa), desde una aplicación Java 9 y luego salga de la aplicación Java:

import java.io.*; public class LaunchNotepad { public static void main(String[] args) throws IOException { Runtime.getRuntime().exec(new String[] {"C://Windows//notepad.exe"}); } }

la aplicación de terceros lanzada sigue bloqueando el archivo lib/modules Java 9. Esto dificulta que nuestra aplicación Java con un JRE privado se actualice, ya que no se puede cambiar el nombre del directorio original (que contiene el JRE). Aquí hay una captura de pantalla de ProcessExplorer (Sysinternals):

Esto huele a un error de Java 9 (reportado como JDK-8194734 ), pero existe una JDK-8194734 para iniciar una aplicación en Windows sin bloquear el archivo lib/modules , por ejemplo, al usar una aplicación externa (proxy) que simplemente inicia parámetro como una aplicación?


He arreglado este error . ¿Esto cuenta como una solución? :)

De lo contrario, algunas soluciones son de hecho posibles.

Solución 1: utilizar awt.Desktop

Escaneando a través de las fuentes de Java, encontré que awt.Desktop puede llamar a ShellExecute por nosotros.

Desafortunadamente, este método no permite pasar argumentos de la línea de comandos. Puede escribir un archivo por lotes temporal en el disco y lanzarlo como solución alternativa.

import java.io.*; import java.awt.Desktop; public class LaunchNotepad { public static void main(String[] args) throws IOException { File program = new File("C://Windows//notepad.exe"); Desktop.getDesktop().open(program); } }

Solución 2: Utilice PsExec como proxy

SysInternals PsExec no hereda archivos en procesos que se inician con él. Recuerde usar el parámetro -d , o PsExec en sí mantendrá el archivo.

Usar cmd.exe como proxy no es posible, porque siempre hereda los manejadores.

Solución 3: Haz tu propio proxy

Deberá usar uno de los dos WINAPI''s: CreateProcess (especificando bInheritHandles=FALSE ) o ShellExecute .


Si tiene un contrato de soporte de Java para Oracle, debe pasar por los canales de soporte para preguntar cuándo habrá una solución.

ACTUALIZACIÓN : basado en bugs.openjdk.java.net/browse/JDK-8194734 , la respuesta actual probablemente sea "cuando se lance Java 11". Pero Oracle puede decidir realizar una copia de seguridad de la solución a Java 9 y 10.

Si realmente estás desesperado por una solución, entonces considera hacer lo siguiente:

  1. Descargue el código fuente de OpenJDK y cree su propia JVM.

  2. Averiguar dónde está el error. Parece que sabes lo que es, por lo que no debería ser difícil averiguar dónde mirar.

  3. Desarrollar una solución para el error.

  4. Contribuya la solución al proyecto OpenJDK como un parche.

Eso aumentará la probabilidad de que el problema se solucione antes en la base de código estándar y las distribuciones producidas a partir de él. También le brindará una solución alternativa para las pruebas internas y para los clientes que estén dispuestos a usar su JVM "fija".

Mencioné una posible solución que implicó volver a trabajar el código que rechazó de inmediato. Hay otros también. AFAIK, no hay soluciones que no impliquen trabajo para usted, de una forma u otra.