问题标签 [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.
java - 为什么 Java 9 不简单地将类路径上的所有 JAR 转换为自动模块?
为了了解我们拥有的类别:
- 平台显式模块
- 应用显式模块
开放模块- 自动模块
- 未命名的模块
类路径中的所有类和 jar 都将成为未命名模块的一部分。但为什么这是我们需要的?与自动模块相比,优势在哪里?我可以“要求”那些该死的遗留罐子将它们变成一个自动模块。我没有把所有东西都包括进去吗?
java - 为什么不允许导出整个模块?
在 Java 9 的模块声明中,有两种结构:
和
Whereexports
授予编译时访问,而opens
允许运行时访问,作为反射和资源。
opens
有一个宽大处理exports
,您可以将整个模块定义为打开,结果与显式打开每个包相同:
但是没有类似的结构
我的问题:为什么会这样;已做出哪些决定允许一次打开整个模块但不允许导出?
java - 在独立的 Java 平台模块中使用不同版本的依赖项
我希望可以在 myModuleA 中使用 Guava-19 和在 myModuleB 中使用 guava-20,因为拼图模块有自己的类路径。
假设 myModuleA 使用 Iterators.emptyIterator(); - 在 guava-20 中被移除,myModuleB 使用新的静态方法 FluentIterable.of(); - 这在 guava-19 中不可用。不幸的是,我的测试是阴性的。在编译时,它看起来很好。与运行时相比,结果是 NoSuchMethodError。这意味着,类加载器上的第一个类决定了哪个类失败。
与底层耦合的封装?我为自己找到了一个理由。它不能被支持,因为传递依赖会和以前有同样的问题。如果在 ModuleA 和 ModuleB 的签名中发生了版本冲突的番石榴类依赖于它。应该使用哪个类?
但是为什么在整个互联网上我们都可以阅读“拼图 - 模块系统停止类路径地狱”?我们现在有多个具有相同问题的较小的“类路径相似”。这更像是一个不确定性而不是一个问题。
java - 不允许使用 --release 从系统模块导出包
我有以下程序:
模块信息.java
主.java
该程序使用以下--add-exports
选项成功编译:
但是,当我添加--release
参数时,它失败了:
基本上,这两个命令是等价的。那么为什么后者是被禁止的呢?
此外,由于 IDEA 将--release
参数传递给 javac,如果我的项目需要内部 API,这使得在 IDEA 中进行开发是不可能的。
我正在使用 JDK 9+178。
java - 如何在 IDEA 中使用类路径而不是模块路径运行 Java 9 应用程序?
当我在 IDEA 中运行一个主类时,它会将模块及其依赖项放在模块路径上。是否可以将其更改为类路径?
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 中指定了标志,如此处所述。Settings
Build,Execution,Deplyoment
Compiler
Shared build process VM options
编译失败,因为编译器无法RegularImmutableList
从 guava 库中找到超类。
IntelliJ 提供的建议是将requires
guava 库的指令添加到模块描述符中,这当然不起作用,因为编译器随后正确地抱怨了拆分包问题:
错误: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 的构建过程我想要修补我的模块?
spring-boot - SpringBoot 使用 java9 的 Jigsaw 模块
我正在尝试编写一个可以使用 Java 9 运行的简单 Spring Boot 应用程序。我无法在 jdk9 下编译此应用程序。我在日志记录模块周围遇到一堆错误
有没有人有任何在 jdk9 jigsaw 概念下使用 Springboot 的示例应用程序?
java - JPMS/Project Jigsaw 对小型应用程序/库的好处
我了解 Java 平台模块系统 (JPMS) 对大型应用程序的好处,但是是否有任何理由将小型库或应用程序变成(单个)模块?如果是这样,模块化 Jar 文件是实现此目的的最佳方法,还是首选常规方法?
展望未来,模块化 v. 类路径程序是否会对性能产生影响?
java - Java9中的Exports、Indirect Exports、Requires和Indirect Requires之间的区别?
我正在浏览 API 文档jdk.accessibility
并注意到它分别列出了所有这些。
一个模块中具有作用域
requires
的模块都在消耗模块的间接需求?该
module-info.java
模块如下:和 for
java.desktop
类似(试图包括变化 -但是随后的文档
jdk.accessibility
没有提到sun.awt
要求或间接要求或间接出口。这里不一致的原因是什么?
寻找这些差异的示例,以帮助理解(2)中发生的情况以及我们应遵循的做法,以便我们使用 Java9 适应模块结构。
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绑定?
如果我做错了,请告诉我解决这个问题的正确方向。