问题标签 [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 - Javadoc 如何处理 Java 9 中模块的可见性?
Javadoc 工具根据可访问性修饰符生成文档。默认情况下,它记录所有public
类protected
、字段和方法。这可以通过以下选项进行更改:
-public
仅显示公共类和成员。-protected
仅显示受保护的和公共的类和成员。这是默认设置。-package
仅显示包、受保护和公共类和成员。-private
显示所有类和成员。
Java 9 引入了模块的概念,Jigsaw 项目将其应用于现有的 JDK。Mark Reinhold 的一次演讲(关于模块的系列演讲中的第 3 次)展示了public
修饰符现在如何具有不同级别的可访问性,具体取决于模块的可见性(通过exports
):
- 向所有人公开
- 公开但仅限于特定模块
- 仅在模块内公开
由于现在并非所有公共成员都可以访问,因此继续使用相同的 Javadoc 生成方案就没有什么意义了。只有暴露在“足够”级别的成员才应记录在案。
Javadoc 模块感知吗?除了上面的命令选项之外,是否还有命令选项来处理额外的曝光层?对于只暴露给特定模块的公共成员,Javadoc 是否列出了这些,如
?
java - 包与 Java 9 中的自动模块冲突
随着 Java 9 的临近,我认为将我的一些项目移植到 Java 9 将是一个很好的学习练习。在我的一个项目中,我依赖于rxjava和rxjavafx
我想将此项目创建为命名模块。为此,我需要创建一个module-info.java
文件,并且需要在此处指定和的rxjava
要求rxjavafx
。但是,这些库还没有任何模块信息。
为了解决这个问题,我读到我需要创建 Automatic Modules。据我了解,我需要将 jar 重命名为一个简单的名称,rxjava
然后在参数rxjavafx
中列出这些 jar 。然后我在我的 jar 名称中--module-path
添加一个requires
指令。module-info.java
我编写了一个 gradle 任务来为我编辑 jar 名称,它似乎在大多数情况下都有效。它需要所有需要编译的 jars 并将它们重命名为不包含版本信息或斜杠。然后将文件连接成一个:
单独的字符串:
自然地,这些rx
库共享它们的一些包名称......但这会导致编译器吐回错误,例如:
似乎解决此问题的唯一方法是将其内容重新打包到一个 jar 中rxjava
并将rxjavafx
其添加为单个模块。虽然这似乎不是一个好的解决方案......
所以我的问题是:
- 我是否正确使用了新的模块系统?
- 我能做些什么来处理这个错误?和
- 这些依赖项是否阻止我更新,或者我应该等待 rx 更新他们的库?
注意:我尝试使用标准java
/运行它javac
,它们会导致相同的问题。这也是我的java版本:
java - 在哪里可以找到 Java 9 模块描述符参考?
模块系统的最新状态似乎有点过时,因为它仍然提到“需要公共”而不是“需要传递”。
我在哪里可以找到模块系统的最新规格?
java - RuntimeException:在模块 jrt.fs 和模块 java.base 中打包 jdk.internal.jimage.decompressor
组件详细信息- 使用IntelliJ IDEA 2017.1 CE和jdk-9-ea+154
主要() -
模块信息.java
日志-
对 VM 初始化的实现持怀疑态度,我的问题是我没有包含模块jrt.fs
- 图片来自哪里?如何调试此类模块的包含/排除?如何进一步解决当前的异常?
java - 为什么模块名称中禁止使用终止数字?
我创建了一个名称java9
为 Java 9 模块的 Java 项目。我有以下内容module-info.java
:
但是 javac 编译器抱怨我的模块名称中的数字:
在运行时 java 也抱怨:
谁能解释为什么禁止终止数字?commons-lang3
为了避免这种限制,图书馆应该怎么做?如果我有一个类似base64
or的库名称sha3
怎么办?
这个问题不包含我的问题的答案。它回答了如何避免错误,但没有回答为什么 Java 在命名方案中如此严格。
java - 在 Java 9 中,为什么在某些情况下对包冲突的处理会有所不同?
我正在试验 Java 9 并查看以下场景:
实验一
- 模块 A
- 模块 B
- 两者都声明了一个名为 com.foo 的非空包,但不导出它。
- 两者都是第三个模块 C 所必需的
从“C”运行 main 会产生运行时错误:
java.lang.RuntimeException:在模块 B 和模块 A 中都包 com.foo
实验二
和以前一样,但这次都导出 com.foo。
从 C 执行 main 的结果:
java.lang.module.ResolutionException:模块 B 和 A 将包 com.foo 导出到模块 C
实验三
与 2 相同,但这次我在模块 C 中声明了包 com.foo。
现在我得到一个编译错误: Error:(4, 1) java: module C reads package com.foo from both A and B
为什么在编译过程中也没有发现前两种情况?在执行程序之前是否有我不知道的运行时属性排除解决方案?
此外,就错误消息而言:实验 2 中的错误消息比实验 1 中给出的错误消息以何种方式更好。并不是说如果其中一个模块不导出它,最终结果会有所不同. 换句话说,产生不同错误信息背后的考虑是什么?
gradle - Gradle 的模块化支持
我从这个链接了解到 gradle 3 启用 Java 9 支持但不支持模块路径。
https://blog.gradle.org/java-9-support
另外,我发现这个 github 链接讨论了 jdk 9 支持。
https://github.com/gradle/gradle/blob/master/design-docs/jdk9-support.md
gradle 3.5 是否支持使用 jdk 9 编译模块化代码?有人试过吗?
java - 我可以通过 MANIFEST.MF 要求 Java 9 模块吗?
我的 Java 库应该与 Java 8 和 Java 9 兼容。为了使用 Java 9 运行,我们需要一些 Java 9 模块。
我知道我可以通过命令行添加它--add-modules
。但它是一个库,我无法控制命令行。
有相当于--add-modules
inMANIFEST.MF
吗?还是有其他与 Java 8 兼容的解决方案?