【发布时间】:2017-09-30 10:51:04
【问题描述】:
我有一个测试:
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 stopped working under JDK9 ,来自 JDK 的 javax.annotation.Resource 在 Java 9 中默认不可用。
我正在尝试使用模块描述符访问它:
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 和 requires java.xml.ws.annotation 中的 Maven 依赖项)时,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"
我的模块描述有问题吗?如何在没有命令行开关的情况下访问 JDK 提供的 javax.annotation.Resource?
【问题讨论】:
-
只添加
--add-modulesargline 然后requires <modulename>会发生什么? -
@nullpointer 在这种情况下测试成功运行(成功找到类)。
-
java.xml.ws.annotation 模块已弃用,无法移除。您应该只根据独立版本查看,这意味着
requires java.annotation和 Maven 对 javax.annotation/javax.annotation-api/1.3.1 的依赖,就像您所做的那样。这也消除了--add-modules的使用。
标签: java java-9 java-module