问题标签 [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 模块)
我正在使用 Java 9 模块系统。以下是我的问题的简化版本。
我已经定义ClassA
(在模块中com.foo
)来实现InterfaceB
(在模块中com.bar
)。ClassA
实现 的方法print
,InterfaceB
它接受一个类型的参数ClassC
(在模块中com.baz
)。下面是代码。
该com.baz
模块不导出任何内容。因此,为了在 and 的编译期间访问,ClassC
我使用了标志。InterfaceB
ClassA
--add-exports
InterfaceB
成功编译,但是当我尝试编译时ClassA
,我收到错误:
编译器是否以某种方式使用不同的实例ClassC
?我有一种意料之外的事情正在发生--add-exports
。
(作为旁注,我使用的原因--add-exports
是,在我的示例中,com.baz
它实际上是一个内部 JDK 包。我无法修改模块设置来导出它。)
java - 为什么编译泄漏内部类型的公共 API 不会失败?
我有以下 Java 9 模块:
使用导出类型:
和非导出类型:
导出类型使用非导出类型作为公共方法中的方法参数类型。我假设编译器会拒绝这种不一致的类配置,因为其他模块中的客户端无法真正调用该foo()
方法,因为它们无法实例化参数类型。
令我惊讶的是,这个模块被 javac 编译成功。我可以看到 pass 的特殊情况null
,但我仍然认为这样的 API 定义格式错误,并认为它不应该被支持,理想情况下由编译器强制执行。
不允许这种情况的原因是什么?
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
可以做些什么来避免异常并让程序成功运行?
maven - 将 Java 8 项目迁移到 Jigsaw 时我应该在哪里放置单元测试
我目前正在测试使用 jdk-9+149 将 Java 8 应用程序迁移到 Java 9 / Jigsaw。
该项目已按标准 Maven 目录布局进行布局,即有src/main/java
,src/test/java
等。
一旦我添加module-info.java
到src/main/java
,maven-compiler-plugin 就会失败并抛出 NullPointerException。这是因为它也希望找到test
目录的模块信息。所以,据我所知,选项是:
- 将测试类保存在单独的模块中,这意味着它们只能访问主模块的导出包。
- 将测试类连同源一起移动到主模块中,这意味着主模块需要测试依赖项。
显然,这些选项似乎都不是可取的,所以我认为有一种推荐的方法可以在 Maven 项目中测试 Jigsaw 模块。不幸的是,我既找不到建议也找不到例子。
编辑:添加一些我在发布问题时不认为相关的信息(对不起)
- 我遇到的 NullPointerException
- Maven 3.3.9
- maven 编译器插件 3.6.0
- 源和目标配置:9
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
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 我不知道该怎么做。
我正在使用实验性功能,但它仍然不理解导入语句 - 请参阅下面的 intellij 设置
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(摘录)
java - 如何在 jdk9/java-9 中使用 sun.reflect 包?
我正在使用 jdk-9,我想sun.reflect.*
在我的代码中使用包,但我得到了以下异常
当我使用 JDK-9 运行下面的示例代码时
java - jdk9/java-9中limitmods标志和listmods有什么用?
由于 Java-9 带有模块化的概念。他们在 JDK 中添加了两个新标志。
-listmods
和-limitmods
。
那些标志有什么用以及如何使用?谁能更详细地解释一下?
java - 如何解决 Jdk9/java-9 中的 module-info.java 编译错误
我正在尝试使用 jdk-9 运行以下代码,但在使用命令编译时遇到问题
命令
错误
模块信息.java
测试.java
包结构如下
JDK版本