所以我想试试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版本是"构建9-ea + 169"我使用最新版本的IntelliJ idea(2017.1.3)。我查看了this回答,看起来我只需要将需求添加到文件中,但由于某种原因它不起作用。
答案 0 :(得分:10)
--add-modules jdk.incubator.httpclient
作为启动参数,对我来说很好。
HttpClient client = HttpClient.newHttpClient();
client.executor().execute(() -> System.out.println("Here")); // prints Here
如果您说您的模块需要它,并不意味着它将被包括在内;默认不包括它。
答案 1 :(得分:9)
你或者IntelliJ都犯了一个错误。您使用的是incubator module,文档中说明了这一点:
孵化器模块是标准JDK构建生成的JDK运行时映像的一部分。但是,默认情况下,类路径上的应用程序孵化器模块未解析。类路径上的应用程序必须使用
--add-modules
命令行选项来请求解析孵化器模块。作为模块开发的应用程序可以直接在孵化器模块上指定requires
或requires transitive
依赖。
我刚刚确认java-9-ea+169
上的行为,即我可以编译并启动这样一个模块(从命令行),而无需额外的标记。
您没有收到编译错误这一事实似乎表明IntelliJ正确包含了编译中的模块声明。您遇到运行时错误并且this answer有助于表明JVM没有看到您作为模块启动的代码。
答案 2 :(得分:1)
我遇到了同样的问题
java.lang.NoClassDefFoundError: jdk/incubator/http/HttpClient
使用java-9-ea+173
和IntelliJ。我按照Eugenes和Nicolais的建议,通过运行/调试配置中的jdk.incubator.httpclient
明确地将--add-modules jdk.incubator.httpclient
添加到模块路径中(在macOS上:Menu Bar -> Run -> Edit Configurations -> Configuration Tab -> VM Options -> --add-modules jdk.incubator.httpclient
之后一切正常。当然,您必须像以前所说的那样将依赖项添加到module-info.java
:
module network {
requires jdk.incubator.httpclient;
}
<强>更新强>:
使用最新的IntelliJ IDEA 2017.2 EAP 172.2953.9,我不需要将--add-modules
放入VM选项。它只是开箱即用。