问题标签 [java-platform-module-system]

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 投票
2 回答
1622 浏览

java - 为什么 Java 9 不简单地将类路径上的所有 JAR 转换为自动模块?

为了了解我们拥有的类别:

  • 平台显式模块
  • 应用显式模块
  • 开放模块
  • 自动模块
  • 未命名的模块

类路径中的所有类和 jar 都将成为未命名模块的一部分。但为什么这是我们需要的?与自动模块相比,优势在哪里?我可以“要求”那些该死的遗留罐子将它们变成一个自动模块。我没有把所有东西都包括进去吗?

0 投票
1 回答
1780 浏览

java - 为什么不允许导出整个模块?

在 Java 9 的模块声明中,有两种结构:

Whereexports授予编译时访问,而opens允许运行时访问,作为反射和资源。

opens有一个宽大处理exports,您可以将整个模块定义为打开,结果与显式打开每个包相同:

但是没有类似的结构

我的问题:为什么会这样;已做出哪些决定允许一次打开整个模块但不允许导出?

0 投票
4 回答
8139 浏览

java - 在独立的 Java 平台模块中使用不同版本的依赖项

我希望可以在 myModuleA 中使用 Guava-19 和在 myModuleB 中使用 guava-20,因为拼图模块有自己的类路径。

假设 myModuleA 使用 Iterators.emptyIterator(); - 在 guava-20 中被移除,myModuleB 使用新的静态方法 FluentIterable.of(); - 这在 guava-19 中不可用。不幸的是,我的测试是阴性的。在编译时,它看起来很好。与运行时相比,结果是 NoSuchMethodError。这意味着,类加载器上的第一个类决定了哪个类失败。

与底层耦合的封装?我为自己找到了一个理由。它不能被支持,因为传递依赖会和以前有同样的问题。如果在 ModuleA 和 ModuleB 的签名中发生了版本冲突的番石榴类依赖于它。应该使用哪个类?

但是为什么在整个互联网上我们都可以阅读“拼图 - 模块系统停止类路径地狱”?我们现在有多个具有相同问题的较小的“类路径相似”。这更像是一个不确定性而不是一个问题。

0 投票
6 回答
12863 浏览

java - 不允许使用 --release 从系统模块导出包

我有以下程序:

模块信息.java

主.java

该程序使用以下--add-exports选项成功编译:

但是,当我添加--release参数时,它失败了:

基本上,这两个命令是等价的。那么为什么后者是被禁止的呢?

此外,由于 IDEA 将--release参数传递给 javac,如果我的项目需要内部 API,这使得在 IDEA 中进行开发是不可能的。

我正在使用 JDK 9+178。

0 投票
2 回答
4890 浏览

java - 如何在 IDEA 中使用类路径而不是模块路径运行 Java 9 应用程序?

当我在 IDEA 中运行一个主类时,它会将模块及其依赖项放在模块路径上。是否可以将其更改为类路径?

0 投票
1 回答
3809 浏览

java - 无法在 IntelliJ IDEA 2017.2.1 中使用 --patch-module 编译 Java 9 模块

我正在尝试熟悉 Java 9 模块以及如何在 IntelliJ 中定义它们。除其他外,我想使用--patch-module编译器/JVM 标志解决拆分包问题,但我不知道如何使其在 IntelliJ 中工作。

我正在使用 IntelliJ IDEA 2017.2.1 Build #IC 172.3544.35 和 Java HotSpot(TM) 64 位服务器 VM(构建 9+180,混合模式)。

这是我的源文件MyImmutableList.java

它属于我的com.effjava.collect模块module-info.java

为了编译我的模块,我使用=> => =>--patch-module在 IntelliJ 中指定了标志,如此处所述SettingsBuild,Execution,DeplyomentCompilerShared build process VM options

编译失败,因为编译器无法RegularImmutableList从 guava 库中找到超类。

IntelliJ 提供的建议是将requiresguava 库的指令添加到模块描述符中,这当然不起作用,因为编译器随后正确地抱怨了拆分包问题:

错误:java:模块 guava 从 com.effjava.collect 和 guava 读取包 com.google.common.collect

在进一步调查中,我注意到构建过程发出与--patch-module标志相关的警告:

错误:异常构建过程终止:“C:\Program Files\Java\jdk-9\bin\java”-Xmx700m -Djava.awt.headless=true

... 很多东西 ...

警告:未知模块:com.effjava.collect 指定给--patch-module

... 更多东西 ...

顺便说一句,我不知道如何获取编译器警告。我没有将它们隐藏在 IntelliJ 的消息窗口中,但我看不到它们。作为一种解决方法,我只是指定了虚假的编译器标志并让构建过程崩溃,以便它在其崩溃报告中发出警告。

无论如何,构建过程抱怨 - 在构建模块时 - 有问题的模块不存在,因此无法通过--patch-module. 这个抱怨没有任何意义,因为我确实通过在命令行级别手动键入javac和命令成功地编译和构建了我的模块:jar

如何告诉 IntelliJ 的构建过程我想要修补我的模块?

0 投票
2 回答
1390 浏览

spring-boot - SpringBoot 使用 java9 的 Jigsaw 模块

我正在尝试编写一个可以使用 Java 9 运行的简单 Spring Boot 应用程序。我无法在 jdk9 下编译此应用程序。我在日志记录模块周围遇到一堆错误

有没有人有任何在 jdk9 jigsaw 概念下使用 Springboot 的示例应用程序?

这是我在 github 中的示例项目的链接

0 投票
3 回答
1092 浏览

java - JPMS/Project Jigsaw 对小型应用程序/库的好处

我了解 Java 平台模块系统 (JPMS) 对大型应用程序的好处,但是是否有任何理由将小型库或应用程序变成(单个)模块?如果是这样,模块化 Jar 文件是实现此目的的最佳方法,还是首选常规方法?

展望未来,模块化 v. 类路径程序是否会对性能产生影响?

0 投票
1 回答
636 浏览

java - Java9中的Exports、Indirect Exports、Requires和Indirect Requires之间的区别?

我正在浏览 API 文档jdk.accessibility并注意到它分别列出了所有这些。

  1. 一个模块中具有作用域requires 的模块都在消耗模块的间接需求

  2. module-info.java模块如下:

    和 forjava.desktop类似(试图包括变化 -

    但是随后的文档jdk.accessibility没有提到sun.awt要求或间接要求或间接出口。这里不一致的原因是什么?

寻找这些差异的示例,以帮助理解(2)中发生的情况以及我们应遵循的做法,以便我们使用 Java9 适应模块结构。

0 投票
3 回答
11552 浏览

java - 使用 Java 9 在哪里放置 module-info.java?

我有一个 OSGI 应用程序,并且有大约 30 个包(jar 文件)。今天我决定看看它是如何工作的/它是否适用于 Java 9。

所以我开始了我的申请并得到了

经过一番阅读,我添加了命令行选项

并创建了具有以下内容的文件 module-info.java:

我有两个问题。我应该把这个 module-info.java 放在哪里让 jvm 读取它?我应该如何将此模块信息与org.apache.felix.framework-5.4.0.jar文件/捆绑包/jar绑定?

如果我做错了,请告诉我解决这个问题的正确方向。