J'ai un test :
public class ResourceTest {
@Test
public void test() throws ClassNotFoundException {
Class.forName("javax.annotation.Resource");
}
}
Il essaie d'accéder javax.annotation.Resource
. En java 8, cela a fonctionné, mais en java 9 (j'utilise Oracle JDK 9), il échoue avec ClassNotFoundException
. Comme expliqué ici Printemps : L'injection de @Resource ne fonctionne plus sous JDK9 , javax.annotation.Resource
du JDK n'est pas disponible par défaut dans Java 9.
J'essaie d'y accéder en utilisant le descripteur de module :
module test {
requires java.xml.ws.annotation;
requires junit;
}
Ici, je demande spécifiquement l'accès à java.xml.ws.annotation
(qui contient javax.annotation.Resource
). Mais le test échoue toujours.
Quand j'enlève ça requires
et ajouter une dépendance (en tant que bibliothèque) qui contient javax.annotations.Resource
ça marche :
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.1</version>
</dependency>
Lorsque je les ajoute tous les deux (dépendance de Maven en pom.xml
y requires java.xml.ws.annotation
), la compilation dans IDEA échoue avec le message suivant :
the unnamed module reads package javax.annotation from both java.xml.ws.annotation and java.annotation
Mais la construction de Maven réussit quand même !
Si j'ajoute java.xml.ws.annotation
via la ligne de commande, cela fonctionne (sans dépendance Maven et avec avec requires
clause) :
mvn clean test -DargLine="--add-modules java.xml.ws.annotation"
Ai-je fait quelque chose de mal dans la description de mon module ? Comment puis-je avoir accès aux modules fournis par le JDK ? javax.annotation.Resource
sans commutateur de ligne de commande ?
Le projet de test est disponible à l'adresse suivante https://github.com/rpuch/test-resource-jdk9