问题标签 [java-module]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
572 浏览

java - 避免加载传递依赖的模块

我正在使用 JDK 9.0.1 编译我的旧源代码,如下所示:

它给出了一个错误,因为由于拆分模块问题,其中定义的注释jsr305.jar不可见。错误如下:

这里模块java.xml.ws.annotation正在加载,因为它是java.xml.ws. 所以它忽略了jsr305.jar. 我不希望加载此模块,而是从javax.annotation-api-1.2.jar. 我也不想这样做--patch-module,因为它会在未来的版本中中断。

如果我使用--limit-module=java.xml.ws.annotation它会给出同样的错误。如果我从中删除java.xml.ws-add-modules它会成功编译,但我需要从中导出一些 API,因此无法删除它。有什么办法可以加载模块java.xml.ws但不是java.xml.ws.annotation吗?

编辑:我想我通过给出 java.xml.ws.annotaion 和 jsr305.jar 之间的拆分示例增加了一些混淆。虽然这是我的实际问题,但我更感兴趣的是 - 我可以避免加载传递依赖的模块,比如加载java.xml.ws而不加载java.xml.ws.annotation吗?根据我在 JEP 261 中的理解,它说,

--limit-modules <module>(,<module>)*

<module>模块名称在哪里。此选项的效果是将可观察模块限制为命名模块的传递闭包中的模块加上主模块(如果有)以及通过 --add-modules 选项指定的任何其他模块。

那么,为什么不--limit-module阻止java.xml.ws.annotation加载呢?

0 投票
3 回答
101 浏览

java - 为什么未模块化的 JAR 可以访问封装的模块化 JAR 的非公开?

我在 intelliJ 中使用 Java 9:我创建了 4 个模块(所有模块都依赖于 module1):

  1. module1:导出包 pkg1 并将 pkg2 导出到模块 2。
  2. module2:需要 module1 并且能够访问这两个包
  3. module3:需要 module1 并且只能访问 pkg1
  4. module4:没有module-info.class,可以访问module1的两个包

我认为自动模块应该需要所有暴露的打包,而不是那些没有暴露的。

我不明白封装的意义是什么,如果它只适用于显式模块化的 JAR。

我错过了什么?

0 投票
2 回答
4044 浏览

java - 是否可以在不使用编译器标志的情况下在同一个项目中混合 Java 8 和 Java 9 源代码?

在 Java 9 中,您可以选择将源目录打包为模块,方法是添加一个 module-info.java,它定义了它导出的事物包,以及它依赖的其他模块。

但是,一旦这样做,您必须在模块描述符中列出所有依赖项 - 并且依赖项本身必须都是模块。因此,通过扩展,如果您模块化单个源目录,则必须模块化公司范围内的每个源目录。

此外,您不能在 Java 8 或更早版本中定义模块,这意味着除了模块化每个 Java 源目录之外,您还必须将所有内容都转换为 Java 9。同时。

如果您在一家拥有大量代码并由许多不同项目共享的公司工作,这似乎是灾难性的。

现在,我可以通过设置一堆编译器标志来避免定义模块来解决这个问题,但这似乎是一个非常糟糕的解决方案。

我希望我理解不正确?

0 投票
0 回答
308 浏览

java-9 - Java 9 - 如何使用模块信息重新编译 .jar 库

我读到将 .jar 库作为依赖项添加到 java9 模块中,我们只需要将它们包含在 --module-path 中,它们将被转换为“Atomatic Modules”

但是,当我尝试使用 jLink 时,仍然出现错误:错误:找不到 dd.plist 模块的 module-info.class

我意识到我们可以使用 jdeps 生成 module-info.java,我的问题是如何使用这个 module-info.java 重新编译 .jar 库?

0 投票
3 回答
4941 浏览

java-9 - module-info.java 不适用于 Java 9 中的 lombok

我在将我们的项目迁移到Java 9时遇到了问题。

更新 Java 9 后,我尝试运行项目,但遇到编译器错误:-

但我找到了解决方法。我添加了lombok.config文件。

然后将module-info.java文件添加到项目编译器后再次显示错误

项目示例:

我们有实体Store

在根的包中我有module-info.java内容:

在根的项目中,我有 lombok.config文件:

在我称之为代码的某处:

0 投票
2 回答
4015 浏览

java - Java 9 HttpClient java.lang.NoClassDefFoundError: jdk/incubator/http/HttpClient

我正在尝试在 Java 9 maven 项目中使用孵化器中的 HttpClient。我没有收到任何编译问题。项目成功构建。但是当我尝试运行 Main 类时,它给了我以下异常:

我的代码只是一个模块信息文件和一个 Main 类,它只调用 google.com 并尝试读取响应:

模块信息.java

主.java

pom.xml

我错过了什么?我发现了很多关于这个的文章,但他们都是这样做的。

任何帮助都值得赞赏。谢谢!

使用 --add-modules 时执行的命令

不使用 --add-modules 时

0 投票
1 回答
2271 浏览

java - 使用 Log4j2 2.10.0 运行 Java 9 模块

我正在尝试运行我创建的使用 Log4j2 2.10.0 的 Java 9 模块。

我遇到的问题是我得到了一个

当做一个LogManager.getLogger(). 它发现 LogManager 类很好,但是当它new PropertiesUtil("log4j2.StatusLogger.properties")从内部调用时StatusLogger,它会收到上述错误。

如何修复/找到解决方法?

添加信息:

堆栈跟踪:

一件更奇怪的事情是我可以直接调用调用:new PropertiesUtil("string")从我的代码中找到类。

我正在使用日食氧气 4.7.1a。

我的 Eclipse 启动配置文件:

模块文件:

0 投票
2 回答
5413 浏览

java - 使用 Jlink 在一个平台上为另一个平台创建 Java 运行时映像

我在我的 Linux 机器上使用 jlink 创建了运行时映像。我看到linux文件夹下的include文件夹。这是否意味着我只能将这个运行时映像用于 Linux 平台?如果是,是否有任何方法可以在一个平台上为另一个平台创建运行时映像(例如,在 Linux 上为 Windows 上,反之亦然)

0 投票
1 回答
612 浏览

java - 列出 Java9 中所有必需的模块?

如何在 Java9 中列出所有必需的模块?

对于系统模块,这有效:

但是,没有看到 atm 如何获取我当前代码所需的模块列表。

这个问题是关于以编程方式查询所有模块。这不是解决模块化问题。

0 投票
1 回答
1187 浏览

java - 如何使用 Gradle 制作多版本 JAR 文件?

Java9 引入了Multi-Release JARs

假设我有使用 java8 的多模块 Gradle 项目:

这是 Gradle 中常见的多模块项目。假设我需要 MR-Jar 用于module1.

我无法添加module1-java9目标 Java9,因为基础是 8 - 到目前为止,我的 Gradle 和 IntelliJ IDEA 都在抱怨。Gradle 是用 java8 编译的,但是我需要为模块启用 java9 运行时(不知道如何);在 IntelliJ IDEA 中,我可以为模块设置 java9 运行时,但每次重新加载 gradle config 时它都会被覆盖。

此外,即使我以某种方式添加它,我也需要指示module11)构建第二个和 2)包含module1-java9. 这是这种情况的示意图:

或者,这可以在 下完成module1,具有不同的来源:srcsrc-java9。但我怀疑这是否会被接受。这是一张图:

到目前为止,我只看到这module1-java9是一个单独的项目(不是模块),它module1只是在那里调用 gradle 并获取输出。是的,这是 gradle 调用 gradle :)))

有没有对开发人员友好的方式来做到这一点?