Java 9没有类定义异常

Java 9没有类定义异常,java,java-9,java-http-client,Java,Java 9,Java Http Client,所以我想试试http客户端 package com.company; import jdk.incubator.http.HttpClient; public class Main { public static void main(String[] args) { HttpClient client = HttpClient.newHttpClient(); } } 我的模块信息如下所示 module com.company { requires jdk.inc

所以我想试试http客户端

package com.company;

import jdk.incubator.http.HttpClient;

public class Main {

public static void main(String[] args) {
    HttpClient client =  HttpClient.newHttpClient();

  }
}
我的模块信息如下所示

module com.company {
    requires jdk.incubator.httpclient;
}
但是我得到了
java.lang.NoClassDefFoundError:jdk/incubator/http/HttpClient


我真的不明白为什么。我的java版本是“build 9-ea+169”,我使用的是IntelliJ idea的最新版本(2017.1.3)。我查看了答案,看起来我必须将需求添加到文件中,但由于某种原因,它不起作用。

如果我使用
--addmodules jdk.incubator.httpclient
作为启动参数,对我来说效果很好

HttpClient client = HttpClient.newHttpClient();
client.executor().execute(() -> System.out.println("Here")); // prints Here

如果你说你的模块需要它,并不意味着它将被包括在内;在默认情况下,它不包括在内。

您或IntelliJ一定犯了错误。您使用的是,文档中说明:

孵化器模块是标准JDK构建生成的JDK运行时映像的一部分。但是,默认情况下,类路径上的应用程序不会解析孵化器模块。类路径上的应用程序必须使用
--addmodules
命令行选项请求解析孵化器模块。作为模块开发的应用程序可以直接指定对孵化器模块的依赖关系

我刚刚确认了
java-9-ea+169
上的行为,即我可以编译并启动这样一个模块(从命令行),而无需附加标志


没有得到编译错误这一事实似乎表明IntelliJ在编译中正确地包含了模块声明。您得到了一个运行时错误,这表明JVM没有看到您作为模块启动的代码。

我遇到了同样的问题

java.lang.NoClassDefFoundError:jdk/incubator/http/HttpClient

使用
java-9-ea+173
和IntelliJ。我按照Eugenes和Nicolais的建议,通过运行/调试配置中的
--添加模块jdk.incubator.httpclient
(在macOS上:
菜单栏->运行->编辑配置->配置选项卡->虚拟机选项->添加模块jdk.incubator.httpclient

之后一切正常。当然,您必须像前面所说的那样将依赖项添加到
模块info.java

module network {
    requires jdk.incubator.httpclient;
}
更新


使用最新的IntelliJ IDEA 2017.2 EAP 172.2953.9,我不需要将
--添加模块
添加到VM选项中。它只是开箱即用。

@QBrute模块
jdk.incubator.httpclient
包含包
jdk.incubator.http
,请参阅@MarkRotteveel是的,我的错了。非常感谢!有什么办法吗要自动包含模块?@emberTraveler对Nicolai的回答似乎暗示,当模块孵化出来时,您不需要
--添加模块
。这个回答不正确-
--添加模块
。如果添加模块与否有区别,那么它只是隐藏了另一个错误,很可能是开发人员创建的ed模块(在本例中为
com.company
)未在模块路径上使用。@Eugene谢谢你的评论。我不得不删除我原来的一个,以修复我看到的一个太晚的错误。我只是重新发布了它。我的建议是不要添加jdk.incubator.httpclient with
--add modules
,因为文档和命令行实验表明它是不必要的。可能是IntelliJ犯了错误吗e、 尽管如此。抱歉,我误解了。无论如何,如果添加参数,孵化器模块将被加载。可能这真的是IntelliJ错误。我也无法通过带有IntelliJ的ServiceLoader加载类。只是找不到。在命令行上,它起作用了。IntelliJ尚未就绪,或者我做错了什么。