Estoy experimentando con Java 9 y viendo los siguientes escenarios:
Experimento 1
Ejecutar un main desde 'C' da un error de tiempo de ejecución:
java.lang.RuntimeException: paquete com.foo tanto en el módulo B como en el módulo A
Experimento 2
Igual que antes, pero esta vez ambos exportan com.foo.
Resultado de ejecutar main desde C:
java.lang.module.ResolutionException: los módulos B y A exportan el paquete com.foo al módulo C
Experimento 3
Igual que 2, pero esta vez declaré el paquete com.foo en el módulo C.
Ahora recibo un error de compilación: Error:(4, 1) java: el módulo C lee el paquete com.foo de A y B
¿Por qué los dos primeros casos no se detectan también durante la compilación? ¿Existen propiedades de tiempo de ejecución que desconozco que impidan la resolución antes de ejecutar el programa?
Además, en lo que respecta a los mensajes de error: de qué manera el mensaje de error del experimento 2 es mejor que el del experimento 1. No es que si uno de los módulos no lo exporta, el resultado final será diferente. . En otras palabras, ¿cuál fue la consideración detrás de producir diferentes mensajes de error?
Los experimentos n.º 2 y n.º 3 son problemas de paquetes divididos y deberían ser errores tanto en tiempo de compilación como en tiempo de ejecución. Para el n. ° 2, no puedo decir en su publicación por qué no ve un error de compilación al compilar C. Debería ver un error con texto como "el módulo C lee el paquete com.foo de A y B".
El experimento n.º 1 es probablemente A, B y C en la ruta del módulo de la aplicación, donde no pueden estar todos en el mismo espacio de nombres (mismo cargador de clases) debido a la superposición de paquetes. El mensaje de error que ve se ha mejorado un poco en versiones recientes.
Tenga en cuenta que los experimentos aquí se han discutido en muchos hilos sobre jigsaw-dev y ese podría ser un mejor lugar para plantear preguntas y experiencias, al menos mientras JDK 9 aún está en desarrollo.