Uso de construcción Java serviceloader con el uso de jdk8> = java9

Peter:

Tengo dos frascos. Uno proporciona una interfaz de servicio y una clase de servicio de carga y uno proporciona la aplicación de dicho servicio.

Esto funciona perfectamente cuando se ejecuta este en jdk8, pero me sale un service type not accessible to unnamed module @3754a4bferror cuando se ejecuta en jdk9 o superior.

Emigré que los dos frascos a un frasco de base del módulo y que funciona muy bien cuando se ejecuta en> = jdk9, pero que falla en jdk8 de la causa, debido a la versión del archivo de clase equivocada.

Por lo tanto, no tengo problema con java serivceloader API Java con 8 o 9.

Soy consciente de https://blog.codefx.org/tools/multi-release-jars-multiple-java-versions/ , pero quiero evitar hacer el proceso de construcción más complicada. La acumulación ya implica la reubicación de clase y otras cosas.

Mi pregunta: ¿Hay una manera de utilizar los mismos frascos que se ejecuta en jdk8 y> = jdk9 utilizando la API de Java serviceloading?

rzwitserloot:

En JDK9 en adelante, todos los frascos son efectivamente 'módulos'. Si ellos no tienen una definición de módulo (que se crea al hacer un archivo con el nombre module-info.javay poner una declaración en el interior del módulo), su nombre es 'módulo no identificado @whatever', exporta todos sus paquetes, y el acceso puede salir algo exportado por cualquier otro módulo (en el módulo-hablar: se 'lee' todo). Es decir, si todas sus dependencias de ruta de clases son tales módulos sin nombre, que todas las exportaciones de todo y todos leen todo por lo que todos los accesos lata nada marcada publicde cualquier otra persona - que es la forma en que trabajó en JDK8, y por lo tanto, ¿por qué todo es compatible.

Para que quede claro: en JDK9, para el código en el módulo (JAR) A para acceder a un método, clase, o un campo de módulo (JAR) B, a continuación, además de los modificadores habituales de acceso (la publicpalabra clave), las necesidades de B a 'exportar' ese paquete, y a tiene que leer ese módulo, o no funciona. Si usted no está escribiendo explícitamente los archivos de información de módulo para cada lado, bueno, entonces se obtiene el comportamiento por defecto que es 'exportar todo' y 'todo lo lectura', lo que nos devuelve al escenario de JDK8: la cosa tiene que ser marcada public, y luego se puede acceder a él.

En realidad, yo no recomiendo que haga que el archivo de módulo de información; eso es un gran paso, uno sólo se debe tomar una vez que esté familiarizado con el sistema de módulos.

Los medios de error que el 'tipo de servicio' [1] no es 'accesible' [2] a 'sin nombre módulo @ 3754a4bf' [3]. La ruptura de permitir que eso en pedazos:

[1] serviceloader funciona mediante la definición de una interfaz que unos implementos 'del proveedor de servicios, y la clase utilizando el cargador de servicio, entonces termina con un grupo de instancias de esa interfaz; cada uno representando una implementación. Es la Foode ServiceLoader.load(Foo.class).

[2] 'accesible' es hablar módulo para: O bien el código que necesita este no lo hizo de manera explícita 'leer', o el código que tiene esta no exportó ella.

[3] 'no identificado módulo @ 3754abf' es el nombre del módulo que está tratando de acceder a ella.

Tomando todo esto junto, significa: usted está operando bajo supuestos falsos: Sea cual sea el tarro contiene su interfaz de servicio (que Fooyo estaba hablando), es NO un módulo sin nombre, o, posiblemente, no es público. Tenga en cuenta que si se trata de una interfaz pública dentro de una clase no-pública (es decir: /* package private */ class Example { public interface MyServiceInterface {} }), que probablemente todavía se cuenta como 'lo suficiente para no pública'.

Si se trata de un módulo llamado (que significa: que tiene un module-info.javaarchivo), a continuación, exportar el paquete que la interfaz de servicio se encuentra en ninguna de rompecabezas Ver (el nombre del sistema de módulos java) tutorial sobre cómo poner esto en marcha.. Si no es así, asegúrese de que es una interfaz pública o clase abstracta, y si su interior algún otro tipo, asegúrese de que esos son demasiado pública. Si tampoco es el caso, revisar sus rutas de clases; javac es bastante inflexible que uno de estos dos es el caso.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=367273&siteId=1
Recomendado
Clasificación