idea导包这个爆红:
我这边的原因:导入新项目,idea的默认jdk版本是内建的11版本,语言编译级别是11。
解决:(我本机是JDK8SE),我把项目jdk切换到系统环境的jdk8,语言level调整到8即可。[是要修改项目jdk level的]
点这里去修改:
修改后:
参考:
看原文点我
原文如下:
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.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依赖关系,并且和 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)将不再支持第一个选项。