java javax,如何在Java 9中运行时访问javax.annotation.Resource

I have a test:

public class ResourceTest {

@Test

public void test() throws ClassNotFoundException {

Class.forName("javax.annotation.Resource");

}

}

It tries to access javax.annotation.Resource. In java 8 it worked, but in java 9 (I'm using Oracle JDK 9) it fails with ClassNotFoundException.

As explained here Spring: @Resource injection stopped working under JDK9 , javax.annotation.Resource from the JDK is not available by default in Java 9.

I'm trying to get access to it using module descriptor:

module test {

requires java.xml.ws.annotation;

requires junit;

}

Here, I specifically request access to java.xml.ws.annotation module (which contains javax.annotation.Resource). But the test still fails.

When I remove that requires clause and add a dependency (as a library) which contains javax.annotations.Resource, it works:

javax.annotation

javax.annotation-api

1.3.1

When I add them both (Maven dependency in pom.xml and requires java.xml.ws.annotation), compilation in IDEA fails with the following message:

the unnamed module reads package javax.annotation from both java.xml.ws.annotation and java.annotation

But Maven build still succeeds!

If I add java.xml.ws.annotation module via command line, it works (with no Maven dependency and with requires clause):

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

Do I do something wrong with my module description? How can I get access to JDK-supplied javax.annotation.Resource without command line switches?

解决方案

Just to clear out some confusion here. The ways to work stated in the question by you are alternatives and should not be combined as you have already seen.

the unnamed module reads package javax.annotation from both

java.xml.ws.annotation and java.annotation

So the way it would work is either:

You can use the compiler args to add modules

org.apache.maven.plugins

maven-compiler-plugin

3.7.0

9

--add-modules

java.xml.ws.annotation

OR

Make use of the javax.xml.ws.annotation being an upgradeable module which is when you can make use of the dependency

javax.annotation

javax.annotation-api

1.3.1

Ideally this would be a preferrable option to stick to as the former is just an alternate to use the @Deprecated module marked forRemoval.

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?

No, the requires is just a part of declaration. [Think about this, prior to JDK 9 if you used a statement import some.foo.bar; in your class which was not added as a library(classpath) would that have worked?]. The module marked as required has to be on the modulepath for you to access it.

Update - The first option would not be supported any time longer with the use of JDK/11 or above wherein the JEP to Remove the Java EE and CORBA Modules is targetted.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值