Java 9没有类定义异常

时间:2017-05-18 07:50:06

标签: 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.incubator.httpclient;
}

但我得到java.lang.NoClassDefFoundError: jdk/incubator/http/HttpClient

我不明白为什么。我的java版本是"构建9-ea + 169"我使用最新版本的IntelliJ idea(2017.1.3)。我查看了this回答,看起来我只需要将需求添加到文件中,但由于某种原因它不起作用。

3 个答案:

答案 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命令行选项来请求解析孵化器模块。作为模块开发的应用程序可以直接在孵化器模块上指定requiresrequires 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

enter image description here

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

module network {
    requires jdk.incubator.httpclient;
}

<强>更新

使用最新的IntelliJ IDEA 2017.2 EAP 172.2953.9,我不需要将--add-modules放入VM选项。它只是开箱即用。