当前位置: 首页 > 面试题库 >

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

逑俊楚
2023-03-14
问题内容

我有一个测试:

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为目标。



 类似资料:
  • 我有个测试: 当我删除子句并添加一个包含的依赖项(作为库)时,它可以工作: 当我添加它们时(中的Maven依赖项和),IDEA中的编译失败,出现以下消息: 但是Maven build仍然成功! 测试项目可在https://github.com/rpuch/test-resource-jdk9获得

  • 我的背景: 9-ea-113(这是javafx现在完全模块化,没有jfrt.jar) eclipse-neon-M6与当前的测试版支持java9(运行在java8上,如果这很重要) win7 简单地说 没有编译,因为javafx。找不到xx个包。 要怎么做?

  • 有没有一种方法可以在运行时访问JUnit5版本? 例如。 在JUnit4中工作得很好。 我正在寻找JUnit5的“对应物” 谢谢:-)

  • 问题内容: 我有一个带有表的数据库,该表充满了用于检查另一个数据库的条件和错误消息。 我想运行一个循环,以便对照第二个数据库中的所有表检查所有这些条件,并生成一个给出错误的报告。 这是可能的ms访问。 例如, querycrit表 我有超过400个类似这样的不同变量的查询。 我针对其运行查询的表是 记录表 问题答案: 这是更多示例代码。它说明了两种不同类型的记录集的用法。您可能希望阅读VBA陷阱:

  • 问题内容: 我有一个正在运行的线程,但是从外面我无法绕过一个值来停止该线程。如何在内部发送false / true值或调用运行线程的公共方法?当我按下按钮1?例如: 或 跟进(校对): 问题答案: 如果您通过类而不是通过a定义它,则可以调用实例方法。 还要注意,由于多个内核具有自己的关联内存,因此您需要警告处理器该状态可能在另一个处理器上更改,并且它需要监视该更改。听起来很复杂,但只需将’vola

  • 我想通过liquibase-maven-plugin运行一个liquibase更新,但是changeset yml文件在一个。jar中,我通过依赖项拉入这个文件。 当我用TotalCommander打开。jar时,它具有以下结构:xy.jar/changelog/changeset.yml。