当前位置: 首页 > 知识库问答 >
问题:

在Java9中如何在运行时访问javax.annotation.resource

谢旻
2023-03-14

我有个测试:

public class ResourceTest {
    @Test
    public void test() throws ClassNotFoundException {
        Class.forName("javax.annotation.Resource");
    }
}
module test {
    requires java.xml.ws.annotation;
    requires junit;
}

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

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

当我添加它们时(pom.xml中的Maven依赖项和需要java.xml.ws.annotation),IDEA中的编译失败,出现以下消息

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

但是Maven build仍然成功!

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

测试项目可在https://github.com/rpuch/test-resource-jdk9获得

共有1个答案

施锋
2023-03-14

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

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

所以它的工作方式是:

<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>
<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.1</version>
</dependency>

不,要求只是声明的一部分。[想想看,在JDK 9之前,如果在类中使用语句import some.foo.bar;,而该类没有作为库(类路径)添加,那么这会起作用吗?]。标记为required的模块必须位于modulepath上,您才能访问它。

更新-第一个选项在使用JDK/11或更高版本时将不再受支持,其中删除Java EE和CORBA模块的JEP是目标。

 类似资料:
  • 问题内容: 我有一个测试: 它尝试访问。在Java 8中,它起作用了,但是在Java 9中(我在使用Oracle JDK 9),它失败了。从JDK是默认不可用在Java中9。 我正在尝试使用模块描述符访问它: 在这里,我专门请求访问模块(包含)。但是测试仍然失败。 当我删除该子句并添加包含的依赖项(作为库)时,它会起作用: 当我(在Maven的依赖性增加他们两个和),汇编IDEA失败,出现以下消息

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

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

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

  • 通过使用命令,我发现内存中的地址contains start路径 ,并且由于C标准,此路径以 byte结尾。 所以我试着写一个简单的C程序来打印这一行(我使用了丹尼斯·尤里切夫(Denis Yurichev)的“RE初学者”一书中的一个示例 - 第24页): 但是我很失望得到了一个分段错误,而不是预期的< code >/lib 64/LD-Linux-x86-64 . so . 2 输出。 我觉得

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