Tag: java 9

如何正确地抑制“需要自动模块的传递指令”警告?

将Maven项目升级到Java 9并添加模块描述符后, javac抱怨自动模块的传递依赖: [警告] /…/scrc/main/java/module-info.java:[3,35] requires transitive指令用于自动模块 重现问题的示例module-info.java : module com.example.mymodule { exports com.example.mymodule.myexportedpackage; requires transitive com.google.common; } 这个警告的含义是完全清楚的,这里有一些相关的链接: 需求和需要Java 9中的传递语句有什么区别? 为什么javac抱怨命名的自动模块? 相关的OpenJDK问题 问题是 – 如何在不修复实际问题的情况下抑制此警告 ,并且不禁用所有其他javac警告? 我尝试了以下选项,但没有一个工作: @SuppressWarnings(“module”) @SuppressWarnings(“all”) -Xlint:all,-module命令行选项 不幸的是,我无法解决实际问题(现在),因为“my”模块具有来自第三方(自动)模块(例如Guava)的返回类型和注释。 因此,如果我使用“require com.google.common”(不具有transitive ),则会出现不同的警告,例如: [警告] … / MyClass.java:[25,20]类com.google.common.collect.Table 。模块com.google.common中的表没有使用requires transitive间接导出 当然,我无法为第三方库(现在是自动模块)定义模块描述符。 我正在使用-Werror ,我宁愿保留,所以警告不仅仅是烦人的…… PS我不打算将我的工件发布到任何公共存储库。

为什么我在创建Map时会收到IllegalArgumentException?

我正在尝试创建一个城市和温度的地图,但它正在抛出IllegalArgumentException 。 这就是我正在做的事情: Map tempMap = Map.of(“London”, 13, “Paris”, 17, “Amsterdam”, 13, “Madrid”, 21, “Rome”, 19, “London”, 13, “Bonn”, 14, “Moscow”, 7, “Barcelona”, 20, “Berlin”, 15); 如果我逐个添加它们就没问题了: Map tempMap = new Hashmap(); // or LinkedHashMap tempMap.put(“London”, 13); tempMap.put(“Madrid”, 21); tempMap.put(“Moscow”, 7); // etc. 为什么会这样? 内容应该是不一样的吗?

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

SonarQube支持Java9吗?

问题实际上是双重的: 可以使用SonarQube 分析 Java9项目吗? SonarQube本身可以在Java9 JVM上运行吗? Java8的同样问题

为什么泄漏内部类型的公共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定义格式错误,并且认为它不应该被支持,理想情况下由编译器强制执行。 不解除这种情况的原因是什么?

如何在Java 9中以其名称获取模块?

如何在Java 9中通过字符串名称获取java.lang.Module ? 例如,我们有 String name = “some.module”; Module module = //how to get here it?

Java 9嵌套(分层或父/子)模块

是否可以在Java 9中创建基于inheritance的(或嵌套的)模块? 像这样的东西: module a | ├── module a1 | └── module a2 在此示例中, a1和a2模块都是a2的子级。 如果我导入其中一个子模块,我将获得父( a )的function以及该子项中定义的任何function。 也就是说,我可以导入a1 ,并明确地获得对a和a1 (但不是a2 )的function的访问权限。 a1和a2都是a ,并且可以访问a的所有包,而不必将a的包暴露给它们。

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

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

在JShell上执行时同一语句的不同行为

我正在研究一个问题,以便在彼此之间存储两个类的引用 例如: class A { B b; A(B b){ this.b = b;} } class B { A a; B(A a){ this.a = a;} } public static void main(String…s){ A a = new A(new B(null)); aba = a; } 现在,如果我使用以下语句而不是上面的初始化: A a = new A(new B(a)); 我得到了以下错误,这很明显: Main.java:19: error: variable a might not have been initialised […]

是否有另一种方法来启动远程jvm?

我正在玩JDK9的JShell API。 目前,JShell API在内部自动启动远程JVM。 我不想自动启动流程,而是将两个流程分开。 注意:我知道我可以更改VM选项。 但我想知道VM是否可以在不同的机器上运行。 默认执行控件最终在代码中到达此位置 。 如果我指定启动,它会自动使用com.sun.jdi.CommandLineLaunch连接器,它实际上是按定义启动java程序。 如果我指定no-launch,它会像我期望的那样使用com.sun.jdi.SocketListen ,一旦启动服务器套接字,它就会自动启动一个远程虚拟机并连接到这个套接字 。 我认为这是出乎意料的。 我试过的其他事情, Shell jshell = JShell.builder() .executionEngine(“jdi:hostname(localhost),launch(false)”) .build(); jshell.eval(“1+2”); 我希望这会失败或被卡住,直到一个单独的进程开始。 是否有另一种方法来指定连接器,或者不启动JVM? (我对’本地’也不感兴趣) 一些简单的选项,例如能够将com.sun.jdi.RawCommandLineLaunch指定为接受自定义命令的连接器,或者能够使用套接字侦听连接器并等待其他进程连接。 谢谢。