如何在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),它失败了ClassNotFoundExceptionjavax.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.xmlrequires

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

回到顶部