首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Java 9运行时访问javax.annotation.Resource

如何在Java 9运行时访问javax.annotation.Resource
EN

Stack Overflow用户
提问于 2017-09-30 10:51:04
回答 2查看 33.9K关注 0票数 26

我有个测试:

代码语言:javascript
复制
public class ResourceTest {
    @Test
    public void test() throws ClassNotFoundException {
        Class.forName("javax.annotation.Resource");
    }
}

它试图访问javax.annotation.Resource。在java 8中,它可以工作,但是在java 9(我正在使用Oracle 9)中,它在ClassNotFoundException中失败了。正如这里所解释的,JDK的Spring:@资源注入在JDK9下停止工作在Java9中默认不可用。

我试图使用模块描述符访问它:

代码语言:javascript
复制
module test {
    requires java.xml.ws.annotation;
    requires junit;
}

在这里,我特别请求访问java.xml.ws.annotation模块(其中包含javax.annotation.Resource)。但测试还是失败了。

当我删除该requires子句并添加一个包含javax.annotations.Resource的依赖项(作为库)时,它可以工作:

代码语言:javascript
复制
    <dependency>
        <groupId>javax.annotation</groupId>
        <artifactId>javax.annotation-api</artifactId>
        <version>1.3.1</version>
    </dependency>

当我同时添加它们( pom.xmlrequires java.xml.ws.annotation中的Maven依赖项)时,IDEA中的编译将失败,其中包含以下消息:

代码语言:javascript
复制
the unnamed module reads package javax.annotation from both java.xml.ws.annotation and java.annotation

但是Maven构建仍然成功!

如果我通过命令行添加java.xml.ws.annotation模块,它可以工作(不需要Maven依赖项,也不需要 requires子句):

代码语言:javascript
复制
mvn clean test -DargLine="--add-modules java.xml.ws.annotation"

我的模块描述做错了什么吗?如果没有命令行开关,我如何才能访问JDK提供的javax.annotation.Resource

该测试项目可在https://github.com/rpuch/test-resource-jdk9上使用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-30 11:08:59

只是为了消除这里的混乱。你在问题中提出的工作方式是可供选择的,不应该像你已经看到的那样结合在一起。

未命名模块从java.xml.ws.annotation和java.annotation中读取包java.annotation。

所以它的工作方式要么是:

您可以使用编译器args添加模块。

代码语言:javascript
复制
<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是一个可升级模块,这是您可以使用依赖项的时候

代码语言:javascript
复制
<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.1</version>
</dependency>

理想情况下,这是一个更好的选择,因为前者只是使用标记为@DeprecatedforRemoval模块的替代方法。

所以必需的子句本身不足以访问一个模块..。这是否适用于所有JDK提供的模块(不包括java.base),还是只适用于不推荐的模块?

不,requires只是声明的一部分。想想看,在使用JDK 9之前,如果您在类中使用了一个没有作为库(类路径)添加的语句import some.foo.bar;,这会有效吗?标记为所需的模块必须在模块路径上才能访问它。

Update -使用JDK/11或更高版本( JEP to 删除Java和CORBA模块 )将不再支持第一个选项。

票数 40
EN

Stack Overflow用户

发布于 2018-04-14 08:12:01

对于gradle构建,将以下内容添加到build.gradle works中:

代码语言:javascript
复制
compile 'javax.annotation:jsr250-api:1.0'

tasks.withType(AbstractCompile) {
    options.compilerArgs += ["--add-modules", "java.xml.bind"]
}

tasks.withType(Test) {
    jvmArgs += ["--add-modules", "java.xml.bind"]
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46502001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档