¿Es posible mezclar –class-path y –module-path en javac (JDK 9)?

Cuando compilo un módulo que depende de otros módulos que he comstackdo previamente, debo especificar la --module-path . Esto hace que los módulos de los que dependo sean visibles.

Pero al mismo tiempo, también me gustaría hacer visibles algunos archivos Jar no modulares. Sin embargo, si no los convierte en módulos automáticos y simplemente especifica el --class-path some.jar justo al lado de --module-path , entonces javac parece ignorar el claspath y lanza “paquete yyy no encontrado” y otros errores “no encontrados”.

Puedo entender que usar --class-path y --module-path en el mismo tiempo (de comstackción) es ilegal, pero javac no me previene de ninguna manera.

Puede usar la ruta de clases y la ruta del módulo en paralelo, pero hay algunos detalles a considerar.

Ruta del módulo de dependencia ~> Ruta de clase

Los módulos explícitos (JAR con un descriptor de módulo en la ruta del módulo) no pueden leer el módulo sin nombre (JAR en la ruta de clase), esto se hizo a propósito para evitar que los JAR modulares dependan del “caos de la ruta de clase”.

Como un módulo debe requerir todas sus dependencias y solo pueden ser cumplidas por otros módulos nombrados (es decir, no JAR en la ruta de clases), todas las dependencias de un JAR modular deben colocarse en la ruta del módulo. Sí, incluso los JAR no modulares, que luego se convertirán en módulos automáticos .

Lo interesante es que los módulos automáticos pueden leer el módulo sin nombre, por lo que sus dependencias pueden ir en la ruta de la clase.

Ruta de la clase de dependencia ~> Ruta del módulo

Si comstack un código no modular o inicia una aplicación desde un JAR no modular, el sistema de módulos aún está en juego y, como el código no modular no expresa ninguna dependencia, no resolverá los módulos de la ruta del módulo.

Entonces, si el código no modular depende de artefactos en la ruta del módulo, debe agregarlos manualmente con la opción --add-modules . No necesariamente todos ellos, solo aquellos de los que usted depende directamente (el sistema de módulos aplicará dependencias transitivas) o puede usar ALL-MODULE-PATH (consulte la publicación vinculada, lo explica con más detalle).

Creo que usar las --classpath y --module-path al mismo tiempo no es ilegal . Es posible utilizar ambos al mismo tiempo, incluso cuando no se especifique explícitamente una ruta de clases predeterminada para el directorio actual.

Detalles del mensaje javac -help y de las herramientas javac docs –

 --module-path , -p  

Especifique dónde encontrar los módulos de la aplicación

 --class-path , -classpath , -cp  

Especifique dónde encontrar archivos de clase de usuario y procesadores de anotación

Si --class-path , -classpath o -cp no están especificados , entonces la ruta de la clase de usuario es el directorio actual .


Editar : gracias a @MouseEvent, probablemente me perdí la parte de la pregunta

Sin embargo, si no los convierte en módulos automáticos y simplemente especifica el –class-path some.jar justo al lado de –module-path, entonces javac parece ignorar el claspath y lanza “paquete yyy no encontrado” y otro “no encontrado” “errores”

Si no los convierte en automáticos, se trata como un módulo sin nombre del Sistema de módulos y –

Un módulo nombrado no puede, de hecho, incluso declarar una dependencia del módulo sin nombre. Esta restricción es intencional, ya que permitir que los módulos con nombre dependan del contenido arbitrario de la ruta de clases haría imposible la configuración confiable.

Además, el módulo sin nombre exporta todos sus paquetes, por lo tanto, el código en un módulo automático podrá acceder a cualquier tipo público cargado desde classpath.

Pero un módulo automático que hace uso de tipos de la ruta de clase no debe exponer esos tipos a los módulos explícitos que dependen de ella , ya que los módulos explícitos no pueden declarar dependencias sobre el módulo sin nombre.

Si el código en el módulo explícito com.foo.app refiere a un tipo público en com.foo.bar , por ejemplo, y la firma de ese tipo se refiere a un tipo en uno de los archivos JAR que todavía están en la ruta de clases , entonces el código en com.foo.app no podrá acceder a ese tipo ya que com.foo.app no puede depender del módulo sin nombre.

Esto puede remediarse tratando com.foo.app como un módulo automático temporalmente para que su código pueda acceder a los tipos desde la ruta de la clase, hasta que el archivo JAR relevante en la ruta de la clase pueda tratarse como un módulo automático o convertirse en un módulo automático. un módulo explícito.