如何在Java 9运行时访问javax.annotation.Resource
我有一个测试:
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
。javax.annotation.Resource
从JDK是默认不可用在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>
当我(在Maven的依赖性增加他们两个pom.xml
和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依赖项并且
requires
子句):
mvn clean test -DargLine="--add-modules java.xml.ws.annotation"
我的模块说明有问题吗?如何在javax.annotation.Resource
不使用命令行开关的情况下访问JDK提供的内容?
该测试项目位于https://github.com/rpuch/test-resource-
jdk9
回答:
只是为了消除一些混乱。您在问题中陈述的工作方式是替代方式,不应像您已经看到的那样结合使用。
未命名模块从java.xml.ws.annotation和java.annotation中都读取包javax.annotation
因此,它的工作方式是:
您可以使用编译器args添加模块
<plugin> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<release>9</release>
<compilerArgs>
<arg>--add-modules</arg>
<arg>java.xml.ws.annotation</arg>
</compilerArgs>
</configuration>
</plugin>
回答:
当您可以使用依赖项时,请使用javax.xml.ws.annotation
成为可升级模块
<dependency> <groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.1</version>
</dependency>
理想情况下,这是一个比较可取的选择,因为前者只是使用@Deprecated模块的替代方法forRemoval
。
因此,仅需要的子句不足以访问模块…对于所有JDK提供的模块(不包括java.base),这是正确的,还是仅对不赞成使用的模块正确?
不,这requires
只是声明的一部分。[考虑一下,在JDK 9之前,如果您import
some.foo.bar;在类中使用了没有添加为库(classpath)的语句,那会行得通吗?]。标记为必需的模块必须位于模块路径上才能访问。
-使用JDK / 11或更高版本将不再支持第一个选项,其中以删除Java
EE和CORBA模块的JEP为目标。
以上是 如何在Java 9运行时访问javax.annotation.Resource 的全部内容, 来源链接: utcz.com/qa/409303.html