java classpath java-9 module-path

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



classpath java-9 (2)

Creo que usar las --classpath y --module-path al mismo tiempo no es ilegal . Es posible usar ambos al mismo tiempo, incluso cuando no especificas explícitamente una ruta de clase que por defecto es el directorio actual.

Detalles del mensaje javac -help y documentos de herramientas javac -

--module-path <path>, -p <path>

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

--class-path <path>, -classpath <path>, -cp <path>

Especifique dónde encontrar archivos de clase de usuario y procesadores de anotaciones

Si no se especifica --class-path , -classpath o -cp , la ruta de clase de usuario es el directorio actual .

Editar : Gracias a @MouseEvent, probablemente me había perdido la parte de la pregunta

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

Si no los hace automáticos, se trata como un módulo sin nombre de un Sistema de módulos y -

De hecho, un módulo con nombre no puede 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 clase haría imposible una 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 el classpath.

Pero un módulo automático que utiliza tipos de classpath no debe exponer esos tipos a los módulos explícitos que dependen de él , ya que los módulos explícitos no pueden declarar dependencias del 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 todavía en la ruta de clase , 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 a com.foo.app como un módulo automático temporalmente para que su código pueda acceder a los tipos desde la ruta de clase, hasta el momento en que el archivo JAR relevante en la ruta de clase pueda tratarse como un módulo automático o convertirse en Un módulo explícito.

Cuando compilo un módulo que depende de otros módulos que he compilado anteriormente, tengo que especificar la --module-path <directory> . Esto hace que los módulos de los que yo dependa 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 solo especifica --class-path some.jar justo al lado de --module-path <directory> , entonces javac parece ignorar el claspath y arroja "paquete yyy no encontrado" y otros Errores "no encontrados".

Puedo entender que usar --class-path y --module-path al mismo tiempo (compilar) es ilegal, pero javac no me advierte de ninguna manera.


Puede usar la ruta de clase y la ruta del módulo en paralelo, pero hay algunos detalles a tener en cuenta.

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), que se hizo a propósito para evitar que los JAR modulares dependan del "caos de la ruta de clase".

Dado que un módulo debe requerir todas sus dependencias y esas solo pueden ser cumplidas por otros módulos con nombre (es decir, no JAR en la ruta de clase), todas las dependencias de un JAR modular deben colocarse en la ruta del módulo. Sí, incluso 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 clase.

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

Si compila código no modular o inicia una aplicación desde un JAR no modular, el sistema del módulo aún está en juego y debido a que el código no modular no expresa ninguna dependencia, no resolverá los módulos desde 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 depende directamente (el sistema de módulos extraerá dependencias transitivas), o puede usar ALL-MODULE-PATH (consulte la publicación vinculada, explica esto con más detalle).