Tag: java module

Java 9重叠非导出包

各种资源( infoq , jigsaw-dev , osdir )表明在不同的java模块中具有相同的包将导致LayerInstantiationException ,即使包是模块的内部(未导出)。 这似乎与要求所说的完全相反: Java编译器,虚拟机和运行时系统必须确保包含相同名称的包的模块不会相互干扰。 如果两个不同的模块包含相同名称的包,那么从每个模块的角度来看,该包中的所有类型和成员仅由该模块定义。 那么(将)应用程序使用的两个模块能够包含同名的私有包吗? 编辑 这是斯坦尼斯拉夫·卢基亚诺夫指出的JMPS 问题

限制由javapackager添加的模块

我试图通过限制它包含的模块来减小我的应用程序的大小。 我已经使用jlink为我的运行时做了这个。 但是,当我使用–add-modules和–limit-modules选项运行javapackager使用逗号分隔的列表来显示我用于运行时的相同的一javapackager –add-modules ,它仍然坚持要添加所有模块。 它似乎不想尊重我给它的选项。 如何获得该工具来限制它添加到我的应用程序包中的模块? “Adding modules: [java.base, java.desktop, java.naming, java.sql, java.xml, java.logging, java.management, java.scripting, java.compiler, java.rmi, java.activation, jdk.charsets, jdk.xml.dom, java.datatransfer, jdk.httpserver, javafx.base, java.security.sasl, jdk.zipfs, jdk.crypto.ec, jdk.management.agent, java.sql.rowset, javafx.swing, jdk.jsobject, jdk.sctp, java.smartcardio, jdk.unsupported, jdk.scripting.nashorn, java.security.jgss, javafx.graphics, javafx.fxml, jdk.dynalink, javafx.media, jdk.accessibility, jdk.security.jgss, javafx.web, java.xml.crypto, jdk.jfr, jdk.packager.services, jdk.net, javafx.controls, java.prefs, jdk.naming.rmi, jdk.jdwp.agent, java.instrument, jdk.management, jdk.security.auth, […]

Java 9:模块路径上可能有2个具有相同名称的模块

是否可以在模块路径上拥有2个具有完全相同名称(但内容略有不同)的模块? 据我所知,Java 9编译器并没有抱怨它。 我有2个模块声明如下: module com.dj.helper { exports com.dj.helper; } 两者都包含com.dj.helper包,但在包中内容不同。 然后在我的主应用程序中,我想要导入此模块: module com.dj { requires com.dj.helper; } 具有相同名称的两个模块都在我的模块路径上。 我希望在编译我的com.dj模块时,编译器会抱怨同一个模块存在两次,但事实并非如此。 这是否有效地意味着您可以在模块路径上拥有相同jar的2个版本,而Java将不知道使用哪个版本?

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

我试图熟悉Java 9模块以及如何在IntelliJ中定义它们。 除此之外,我想使用–patch-module编译器/ JVM标志解决拆分包问题,我不知道如何使它在IntelliJ中工作。 我正在使用IntelliJ IDEA 2017.2.1使用Java HotSpot(TM)64位服务器VM构建#IC 172.3544.35(内置9 + 180,混合模式)。 这是我的源文件MyImmutableList.java : package com.google.common.collect; public class MyImmutableList extends RegularImmutableList { public MyImmutableList(Object[] array) { super(array); } } 它属于我的模块com.effjava.collect与module-info.java : module com.effjava.collect { // do not require module guava; instead patch this module with guava.19-0.jar via: // javac –patch-module com.effjava.collect=guava-19.0.jar module-info.java com/google/common/collect/MyImmutableList.java // requires guava; […]

什么是Java 9中的开放模块以及如何使用它

模块与open关键字之前和之后有什么区别? 例如: open module foo { } module foo { }

使用Log4j2 2.10.0运行Java 9模块

我正在尝试运行我创建的Java 9模块,它使用Log4j2 2.10.0。 我遇到的问题是我得到了一个 java.lang.NoClassDefFoundError: Could not initialize class org.apache.logging.log4j.util.PropertiesUtil 在做LogManager.getLogger() 。 它找到了LogManager类,但是当它从StatusLogger内部调用new PropertiesUtil(“log4j2.StatusLogger.properties”) ,它会得到上述错误。 如何修复/找到解决方法? 添加信息: 堆栈跟踪: Exception in thread “main” java.lang.NoClassDefFoundError: Could not initialize class org.apache.logging.log4j.util.PropertiesUtil at org.apache.logging.log4j/org.apache.logging.log4j.status.StatusLogger.(StatusLogger.java:71) at org.apache.logging.log4j/org.apache.logging.log4j.LogManager.(LogManager.java:60) at com.EvolutionarySoftwareSystems.Utilities/com.EvolutionarySoftwareSystems.Utilities.Base.DebugAble.(DebugAble.java:45) 更奇怪的是我可以直接调用invoke:来自我的代码的new PropertiesUtil(“string”) ,它找到了类。 我正在使用日食氧气4.7.1a。 我的eclipse启动配置文件: 模块文件: module com.EvolutionarySoftwareSystems.Evolver { // // // Export the com.EvolutionarySoftwareSystems package // requires com.EvolutionarySoftwareSystems.Base; requires com.EvolutionarySoftwareSystems.Utilities; […]

Java 9 + maven + junit:测试代码是否需要自己的module-info.java以及放置它的位置?

假设我有一个使用Maven 3和junit的Java项目。 有src/main/java和src/test/java目录,分别包含主要源和测试源(一切都是标准的)。 现在我想将项目迁移到Java 9. src/main/java内容代表Java 9模块; com/acme/project/module-info.java看起来大概是这样的: module com.acme.project { require module1; require module2; … } 如果测试代码需要自己的module-info.java怎么办? 例如,添加对某些模块的依赖性,该模块仅用于测试,而不是生产代码。 在这种情况下,我必须将module-info.java放到src/test/java/com/acme/project/给模块一个不同的名称。 这样Maven似乎将主要源和测试源视为不同的模块,因此我必须将包从主模块导出到测试模块,并且需要测试模块中的包,如下所示: 主模块(在src/main/java/com/acme/project ): module prod.module { exports com.acme.project to test.module; } 测试模块(在src/test/java/com/acme/project ): module test.module { requires junit; requires prod.module; } 这产生了 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:testCompile (default-testCompile) on project test-java9-modules-junit: Compilation failure: Compilation […]

org.springframework.cglib.core.ReflectUtils $ 1的非法reflection访问

我的JDK 9 + 181 Spring Boot 2.0.0.BUILD-SNAPSHOT CLI应用程序在启动时显示此警告: WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by org.springframework.cglib.core.ReflectUtils$1 (jar:file:/home/jan/src/fm-cli/target/fm-cli-0.1.0-SNAPSHOT.jar!/BOOT-INF/lib/spring-core-5.0.0.RELEASE.jar!/) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) WARNING: Please consider reporting this to the maintainers of org.springframework.cglib.core.ReflectUtils$1 这是一个控制台应用程序,所以我需要禁用此警告 – 我该怎么做? 注意:此问题询问如何禁用Spring触发此警告的具体问题; 它不是JDK9的副本:发生了非法的reflection访问操作。 org.python.core.PySystemState ,用于处理不同库中的类似症状。

Java Jigsaw JUnit测试 – JUnit不在模块中

我在Eclipse Oxygen.3a使用Java 9.0.4 JUnit 5位于模块路径上,并且在module-info.java中是必需的。 当我尝试运行我的代码时,我总是收到以下消息: 初始化引导层时发生错误java.lang.module.FindException:无法为C:\ Users \ Tim HP.p2 \ pool \ plugins \ org.junit.jupiter.migrationsupport_5.0.0.v20170910-2246.jar派生模块描述符引起:java.lang.module.InvalidModuleDescriptorException:Provider类org.junit.jupiter.engine.JupiterTestEngine不在模块中 我无法弄清楚如何解决这个问题。

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

在Java 9的模块声明中有2个构造: exports com.foo; 和 opens com.foo; 其中, exports授予编译时访问权限,而opens允许运行时访问,作为reflection和资源。 opens对exports有一个宽容,你可以将整个模块定义为打开,结果与显式打开每个包相同: open module com.mod { 但是没有类似的结构 exported module com.mod { 我的问题 :为什么会这样; 做出了哪些决定允许一次打开整个模块而不是出口?