Utilisez build java ServiceLoader avec l'utilisation jdk8 dans> = java9

Peter:

J'ai deux pots. Une fournit une interface de service et une classe de chargement de service et une offre la mise en œuvre de ce service.

Cela fonctionne parfaitement dans l'exécution de ce jdk8, mais je reçois une service type not accessible to unnamed module @3754a4bferreur lors de l' exécution sur jdk9 ou plus.

Je migrés deux pots à un pot de base du module et qui fonctionne très bien lors de l'exécution sur> = jdk9, mais qui ne parvient à jdk8 de la cause, en raison de la version de fichier de classe mal.

Donc, je n'ai pas problème en utilisant java serivceloader api java avec 8 ou 9.

Je suis au courant de https://blog.codefx.org/tools/multi-release-jars-multiple-java-versions/ , mais je veux éviter de rendre le processus de construction plus compliquée. La construction implique déjà la relocalisation de classe et d' autres choses.

Ma question: Y at-il un moyen d'utiliser les mêmes pots en cours d'exécution sur jdk8 et> = jdk9 en utilisant java serviceloading api?

rzwitserloot:

En JDK9 et plus, tous les pots sont effectivement des « modules ». Si elles ne pas ont une définition de module (que vous créez en faisant un fichier nommé module-info.javaet mettre un à l' intérieur de la déclaration du module), son nom est « le module sans nom @whatever », elle exporte tous ses paquets, et tout d'accès peut exporté par tout autre module (dans le module-parler: il 'lit' tout). Ce qui signifie, si toutes vos dépendances classpath sont tels modules sans nom, ils sont tous tout à l'exportation et ils ont tous tout lu ainsi tous quelque chose d'accès peut marquée publicde quelqu'un d' autre - ce qui est la façon dont il a travaillé dans JDK8, et donc, pourquoi il est tout compatible.

Pour être clair: en JDK9, pour le code dans le module (pot) A à accéder à une méthode, classe ou d'un champ de module (pot) B, en plus des modificateurs d'accès habituels (le publicmot - clé), les besoins B à « exporter » ce paquet, et A a besoin de lire ce module, ou il ne fonctionne pas. Si vous n'êtes pas explicitement écrivez bien, les fichiers d'information de module pour chaque côté, vous obtenez le comportement par défaut qui est « tout à l'exportation » et « tout lire », nous ramène au scénario JDK8 de: la chose doit être marquée public, et vous pouvez y accéder.

Je ne vous recommande vraiment pas faire ce fichier module info; c'est un grand pas, celui que vous ne devez prendre une fois que vous êtes familier avec le système de module.

Les moyens d'erreur que le 'type de service' [1] ne soit pas 'accessible' [2] 'Module anonyme @ 3754a4bf' [3]. La rupture de laisser cela en morceaux:

[1] ServiceLoader fonctionne en définissant une interface qui met en œuvre un « fournisseur de services », et la classe en utilisant le chargeur de service se termine alors avec un tas d'instances de cette interface; chacun représentant une mise en œuvre. Il est l' Fooen ServiceLoader.load(Foo.class).

[2] « accessible » est parler module: Soit le code qui a besoin de ce fait pas explicitement le « lire », ou le code qui a cela n'a pas l'exporter.

[3] « le module sans nom @ 3754abf » est le nom du module qui tente d'y accéder.

En prenant tout cela ensemble, cela signifie: Vous opérez sous de fausses hypothèses: pot Quelle que soit contient votre interface de service (que Fooje parlais), est pas un module sans nom, ou, peut - être, ne sont pas publiques. Notez que si elle est une interface publique dans une classe non publique (ex: /* package private */ class Example { public interface MyServiceInterface {} }), que probablement encore compte comme « pas assez public ».

Si c'est un module nommé ( ce qui signifie: il a un module-info.javafichier), puis exporter le package que l'interface de service est en Voir toute scie sauteuse (le nom du système de module Java) tutoriel sur la façon de mettre en place que.. Si ce n'est pas, assurez -vous qu'il est une interface publique ou classe abstraite, et si son intérieur d' un autre type, assurez - vous que ceux -ci sont trop public. Si aucun des deux est le cas, vérifiez vos classpaths; javac est assez catégorique que l' un de ces deux est le cas.

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=367270&siteId=1
conseillé
Classement