我有一个测试:
public class ResourceTest {
@Test
public void test() throws ClassNotFoundException {
Class.forName("javax.annotation.Resource");
}
}
它试图访问javax.annotation.Resource
. 在 java 8 中它可以工作,但在 java 9(我使用的是 Oracle JDK 9)中它失败并显示ClassNotFoundException
. 正如Spring: @Resource injection 在 JDK9 下所解释的那样,javax.annotation.Resource
默认情况下 Java 9 中的 JDK 不可用。
我正在尝试使用模块描述符访问它:
module test {
requires java.xml.ws.annotation;
requires junit;
}
在这里,我特别请求访问java.xml.ws.annotation
模块(其中包含javax.annotation.Resource
)。但测试仍然失败。
当我删除该requires
子句并添加包含的依赖项(作为库)javax.annotations.Resource
时,它可以工作:
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.1</version>
</dependency>
当我同时添加它们(pom.xml
和Maven 依赖项requires java.xml.ws.annotation
)时,IDEA 中的编译失败并显示以下消息:
the unnamed module reads package javax.annotation from both java.xml.ws.annotation and java.annotation
但是 Maven 构建仍然成功!
如果我java.xml.ws.annotation
通过命令行添加模块,它可以工作(没有 Maven 依赖项和with requires
子句):
mvn clean test -DargLine="--add-modules java.xml.ws.annotation"
我的模块描述有问题吗?如何在javax.annotation.Resource
没有命令行开关的情况下访问 JDK 提供的访问权限?