Tag: jigsaw

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

我正在使用jdk-9,我想在我的代码中使用sun.reflect.*包但我得到以下exception Exception in thread ‘main’ java.lang.IllegalAccessError : class Test (in moudle: Unnamed Module) cannot access class sun.reflect.Reflaction (in module:java.base), sun.reflect is not exported to Unnamed module 当我使用JDK-9运行下面的示例代码时 public static void main(String args[]){ System.out.println(Reflection.getCallerClass(3)); }

RuntimeException:在模块jrt.fs和模块java.base中打包jdk.internal.jimage.decompressor

组件详细信息 – 使用IntelliJ IDEA 2017.1 CE和jdk-9-ea + 154 main() – Set set2 = Set.of(“a”, “b”, “c”); set2.forEach(System.out::println); module-info.java module collection { requires java.base; } 日志 – Error occurred during initialization of VM java.lang.RuntimeException: Package jdk.internal.jimage.decompressor in both module jrt.fs and module java.base at jdk.internal.module.ModuleBootstrap.fail(java.base@9-ea/ModuleBootstrap.java:699) at jdk.internal.module.ModuleBootstrap.boot(java.base@9-ea/ModuleBootstrap.java:329) at java.lang.System.initPhase2(java.base@9-ea/System.java:1928) 对VM的初始化实施感到怀疑,我的问题是我还没有包含模块jrt.fs – 图片来自哪里? 如何调试此类模块包含/排除? 如何进一步解决当前exception?

在分离的Java平台模块中使用不同版本的依赖项

我预计可以在myModuleA中使用ie Guava-19,在myModuleB中使用guava-20, 因为jigsaw模块有自己的类路径。 假设myModuleA使用Iterators.emptyIterator(); – 在guava-20中删除,myModuleB使用新的静态方法FluentIterable.of(); – 番石榴-19没有。 不幸的是,我的测试是否定的。 在编译时,它看起来很好。 与运行时相反,结果是NoSuchMethodError。 意味着,类加载器中第一个类决定哪个类失败。 与底层耦合的封装? 我找到了自己的理由。 由于传递依赖性会产生与以前相同的问题,因此无法支持它。 如果在ModuleA和ModuleB中的签名中发生版本冲突的guava类依赖于它。 应该使用哪个类? 但为什么我们可以通过互联网阅读“拼图 – 模块系统停止类路径地狱”? 我们现在有多个较小的“类似路径”,但问题相同。 这不仅仅是一个问题,而是一个不确定性。

IntelliJ不了解Java9-ea上的java库

我正在使用jdk9-ea 149并创建了一个示例javafx应用程序 IntelliJ不理解java库,它以红色显示所有import语句,并且它们都是灰色的 。对于java.util.List,java.util.ArrayList它有相同的问题。 我能够在外面编译表单,但我无法从IntelliJ 2016.3.2 Ultimate Edition编译代码。 看起来我们需要向IntelliJ项目添加一些库,但是使用java9 build 149 jigsaw我不知道该怎么做。 我正在使用实验function仍然无法理解import语句 – 请参阅下面的intellij设置 IntelliJ版本: IntelliJ 2016.3.2 Ultimate Edition Java版本:java 9-ea build:149

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

我有以下Java 9模块: module com.example.a { exports com.example.a; } 使用导出类型: public class Api { public static void foo(ImplDetail args) {} } 和非导出类型: package com.example.b.internal; public class ImplDetail {} 导出的类型使用非导出类型作为公共方法中的方法参数类型。 我假设编译器会拒绝这种不一致的类配置,因为其他模块中的客户端无法真正调用foo()方法,因为它们无法实例化参数类型。 令我惊讶的是,这个模块是由javac成功编译的。 我可以看到传递null的特殊情况,但我仍然认为这样的API定义格式错误,并且认为它不应该被支持,理想情况下由编译器强制执行。 不解除这种情况的原因是什么?

如何在IDEA中使用类路径而不是模块路径运行Java 9应用程序?

当我在IDEA中运行主类时,它将模块及其依赖项放在模块路径上。 是否可以将其更改为类路径?

在Java 9+中使用JRE运行时,我可以提供运行时编译器访问吗?

我正在将应用程序迁移到Java 10.我们的应用程序通常使用JRE运行,但我们允许用户通过捆绑tools.jar并使用reflection按需加载JavacTool实例来编译自己的自定义代码。 我们的方法如下: public static JavaCompiler getJavaCompiler() { String toolJarName = “tools.jar”; File file = getResourceForClass(“tools.jar”); try { file = file.getCanonicalFile(); } catch (IOException ignore) { } if (!file.exists()) throw new RuntimeException(“Can’t find java tools file: ‘”+file+”‘”); try { URL[] urls = new URL[]{ file.toURI().toURL() }; URLClassLoader cl = URLClassLoader.newInstance(urls); return Class.forName(“com.sun.tools.javac.api.JavacTool”, false, cl).asSubclass(JavaCompiler.class).newInstance(); } […]

是否可以在Java 9模块中使用不带module-info.class的依赖项

我创建了两个小项目de.app1和de.app2 ,其中来自de.app1的 App使用来自de.app2的 Test 。 ├── de.app1 │ ├── de │ │ └── app │ │ └── App.java │ └── module-info.java └── de.app2 └── de └── test └── Test.java 第一个项目中的module de.app1 {}只包含module de.app1 {} 我编译了第二个项目并创建了一个jar文件: javac de/test/Test.java jar cf app2.jar de/test/Test.class 然后尝试编译第一个项目,如下所示: javac -cp ../de.app2/app2.jar de/app/App.java module-info.java 失败,因为无法找到Test 。 当我在没有module-info.java的情况下编译项目时,一切正常。 是否有可能在Java 9模块中使用不是Java 9模块的jar中的类? 特别是对于依赖第三方项目的项目(例如apache-commons,……),我认为需要这样的东西。

Java 9模块和JUnit 4

Eclipse氧气; Windows 7的; JDK 9决赛9月21日; JUnit 4.12和现有的应用程序。 作为起点,可以编译,执行应用程序,并且所有JUnit测试都显示为绿色。 现在我们使用eclipse生成文件module-info.java。 结果如下: module ch.commcity.topsort { exports ch.commcity.topsort; requires junit; } 但是有了错误:junit无法解析为模块。 问题是:如何告诉文件junit没有定义任何模块,它应该在兼容模式下运行?

在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; […]