美文网首页
import javax.annotation.Resource

import javax.annotation.Resource

作者: LAMYMAY | 来源:发表于2020-10-20 11:27 被阅读0次

idea导包这个爆红:


image.png

我这边的原因:导入新项目,idea的默认jdk版本是内建的11版本,语言编译级别是11。
解决:(我本机是JDK8SE),我把项目jdk切换到系统环境的jdk8,语言level调整到8即可。[是要修改项目jdk level的]

点这里去修改:


image.png

修改后:


image.png

参考:
看原文点我

原文如下:

java - 如何在Java 9运行时获取对javax.annotation.Resource的访问

原文 标签 java java-9 java-module

我有一个测试:

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,Java 9中默认不提供来自JDK的javax.annotation.Resource

我正在尝试使用模块描述符访问它:

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.xmlrequires 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依赖关系,并且 requires子句一起使用):

mvn clean test -DargLine="--add-modules java.xml.ws.annotation"

我的模块说明有问题吗?如何在没有命令行开关的情况下访问JDK提供的javax.annotation.Resource

该测试项目位于https://github.com/rpuch/test-resource-jdk9

最佳答案

只是为了消除一些混乱。您在问题中陈述的工作方式是替代方式,不应像您已经看到的那样结合使用。

the unnamed module reads package javax.annotation from both java.xml.ws.annotation and java.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用作upgradeable module,即可以使用依赖项的时间

<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.1</version>
</dependency>

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

So the required clause by itself it not enough to get access to a module... is this true for all JDK-supplied modules (excluding java.base), or it is only true for deprecated modules?

不,requires只是声明的一部分。 [考虑一下,在JDK 9之前,如果您在类中使用了import some.foo.bar;语句,而该语句没有作为库(类路径)添加,那会行得通吗?]。标记为必需的模块必须位于模块路径上才能访问。

更新-使用JDK / 11或更高版本(不再针对Remove the Java EE and CORBA Modules的JEP)将不再支持第一个选项。

相关文章

网友评论

      本文标题:import javax.annotation.Resource

      本文链接:https://www.haomeiwen.com/subject/gltdmktx.html