12

所以我想试试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)。我查看了这个答案,看起来我必须将要求添加到文件中,但由于某种原因它不起作用。

4

3 回答 3

13

如果我--add-modules jdk.incubator.httpclient用作启动参数,对我来说效果很好。

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

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

于 2017-05-18T09:07:01.660 回答
10

您或 IntelliJ 一定犯了一个错误。您正在使用一个孵化器模块,文档说:

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

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

您没有收到编译错误的事实似乎表明 IntelliJ 在编译中正确地包含了模块声明。您收到运行时错误并且此答案有帮助的事实表明 JVM 没有将您作为模块启动的代码。

于 2017-05-18T13:58:17.100 回答
2

我遇到了同样的问题

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

java-9-ea+173IntelliJ。我遵循 Eugenes 和 Nicolaisjdk.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-modulesVM 选项中。它开箱即用。

于 2017-06-13T03:12:19.303 回答