问题标签 [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 回答
439 浏览

java - 使用包含非导出参数类型的方法实现接口(Java 9 模块)

我正在使用 Java 9 模块系统。以下是我的问题的简化版本。

我已经定义ClassA(在模块中com.foo)来实现InterfaceB(在模块中com.bar)。ClassA实现 的方法printInterfaceB它接受一个类型的参数ClassC(在模块中com.baz)。下面是代码。

com.baz模块不导出任何内容。因此,为了在 and 的编译期间访问,ClassC我使用了标志。InterfaceBClassA--add-exports

InterfaceB成功编译,但是当我尝试编译时ClassA,我收到错误:

编译器是否以某种方式使用不同的实例ClassC?我有一种意料之外的事情正在发生--add-exports

(作为旁注,我使用的原因--add-exports是,在我的示例中,com.baz它实际上是一个内部 JDK 包。我无法修改模块设置来导出它。)

0 投票
1 回答
275 浏览

java - 为什么编译泄漏内部类型的公共 API 不会失败?

我有以下 Java 9 模块:

使用导出类型:

和非导出类型:

导出类型使用非导出类型作为公共方法中的方法参数类型。我假设编译器会拒绝这种不一致的类配置,因为其他模块中的客户端无法真正调用该foo()方法,因为它们无法实例化参数类型。

令我惊讶的是,这个模块被 javac 编译成功。我可以看到 pass 的特殊情况null,但我仍然认为这样的 API 定义格式错误,并认为它不应该被支持,理想情况下由编译器强制执行。

不允许这种情况的原因是什么?

0 投票
17 回答
138580 浏览

java - 如何解决 Java 9 上的 InaccessibleObjectException(“无法使 {member} 可访问:模块 {A} 不‘打开 {package}’到 {B}”)?

在 Java 9 上运行应用程序时,这种异常发生在各种场景中。某些库和框架(Spring、Hibernate、JAXB)特别容易出现这种情况。这是来自 Javassist 的示例:

消息说:

无法使受保护的最终 java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError 可访问:模块 java.base不会“打开 java.lang”到未命名的模块 @1941a8ff

可以做些什么来避免异常并让程序成功运行?

0 投票
3 回答
2032 浏览

maven - 将 Java 8 项目迁移到 Jigsaw 时我应该在哪里放置单元测试

我目前正在测试使用 jdk-9+149 将 Java 8 应用程序迁移到 Java 9 / Jigsaw。

该项目已按标准 Maven 目录布局进行布局,即有src/main/java,src/test/java等。

一旦我添加module-info.javasrc/main/java,maven-compiler-plugin 就会失败并抛出 NullPointerException。这是因为它也希望找到test目录的模块信息。所以,据我所知,选项是:

  • 将测试类保存在单独的模块中,这意味着它们只能访问主模块的导出包。
  • 将测试类连同源一起移动到主模块中,这意味着主模块需要测试依赖项。

显然,这些选项似乎都不是可取的,所以我认为有一种推荐的方法可以在 Maven 项目中测试 Jigsaw 模块。不幸的是,我既找不到建议也找不到例子。

编辑:添加一些我在发布问题时不认为相关的信息(对不起)

0 投票
1 回答
821 浏览

maven - 如何处理自动模块中的拆分包?

我目前正在测试将现有应用程序迁移到 Jigsaw 模块。我的一个模块使用 ElasticSearch 及其 Groovy 插件。

  • org.elasticsearch:elasticsearch
  • org.elasticsearch.module:lang-groovy

不幸的是,他们共享一个拆分包,所以mvn install给了我:

x 从 lang.groovy 和 elasticsearch 读取包 org.elasticsearch.script.groovy

对描述符中的每个必需模块执行一次,其中 x 是每个模块的名称。

我假设在 Java 9 最终版本之前,较新的 elasticsearch 版本将消除拆分包,但是通常有一种方法可以处理遗留依赖项中的拆分包吗?

我希望能够将它们放在类路径而不是模块路径上,但是在阅读邮件列表上的这个对话之后,似乎没有办法告诉 Maven 编译器这样做。


maven 3.3.9 - maven-compiler-plugin 3.6.0 - jdk9-ea+149 - elasticsearch 2.3.3

0 投票
2 回答
843 浏览

java - IntelliJ 不理解 Java9-ea 上的 java 库

我正在使用jdk9-ea 149并创建了一个示例javafx 应用程序

IntelliJ 不理解 java 库,它以红色显示所有导入语句,并且它们都是灰色的。即使对于java.util.List,java.util.ArrayList它也有同样的问题。

我可以在外面编译表单,但我无法从IntelliJ 2016.3.2 Ultimate Edition编译代码。

看起来我们需要向 IntelliJ 项目添加一些库,但是使用java9 build 149 jigsaw 我不知道该怎么做。

使用 jdk9-ea 在 Intellij 上的示例 JavaFx 代码

我正在使用实验性功能,但它仍然不理解导入语句 - 请参阅下面的 intellij 设置

IntelliJ 版本:IntelliJ 2016.3.2 终极版 Java 版本:java 9-ea 构建:149 在此处输入图像描述

0 投票
0 回答
198 浏览

maven - 类路径中的拼图测试依赖项:为什么无法访问另一个 JAR 中的超类?

我目前正在测试使用 jdk9-ea+147 和 maven-compiler-plugin 3.6.0 将现有的 Java 8 (Maven) 项目迁移到 Java 9 / Jigsaw。

我已将src目录转换为模块并将test目录保留为非模块化。

testCompile我收到意外错误期间:

错误:ExtractedArtifactStoreBuilder 中的 build() 定义在不可访问的类或接口中

当然,我已经检查过两者ExtractedArtifactStoreBuilder都是公开的。build()继承自它的(公共)超类和公共的。代码在 JDK 8 中编译并运行良好。

ExtractArtifactStoreBuilder在与其超类不同的 3rd 方 JAR 中定义,但 Maven 正确地将两者都放在类路径中。令人困惑的是,超类具有相同的类名(但位于不同的包中)

据我所知,我应该能够在我的测试代码中访问公共继承方法。那么这是jdk9抢先体验版的bug吗?


编辑:希望更好地理解,这里是所涉及的 JAR 和类的一点抽象,命名和不重要的东西更少混淆(对于实际的依赖关系,见下文):

进程.jar

mongo.jar

src/test/java/ExampleTest


我已经能够以最小的设置重现该行为:

pom.xml(摘录)

src/main/java/module-info.java

src/test/java/ExampleTest.java(摘录)

0 投票
5 回答
10126 浏览

java - 如何在 jdk9/java-9 中使用 sun.reflect 包?

我正在使用 jdk-9,我想sun.reflect.*在我的代码中使用包,但我得到了以下异常

当我使用 JDK-9 运行下面的示例代码时

0 投票
1 回答
137 浏览

java - jdk9/java-9中limitmods标志和listmods有什么用?

由于 Java-9 带有模块化的概念。他们在 JDK 中添加了两个新标志。 -listmods-limitmods

那些标志有什么用以及如何使用?谁能更详细地解释一下?

0 投票
4 回答
5243 浏览

java - 如何解决 Jdk9/java-9 中的 module-info.java 编译错误

我正在尝试使用 jdk-9 运行以下代码,但在使用命令编译时遇到问题

命令

错误

模块信息.java

测试.java

包结构如下

JDK版本