【问题标题】:Java 9 no class definition exceptionJava 9 没有类定义异常
【发布时间】:2017-10-17 21:51:08
【问题描述】:

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

【问题讨论】:

标签: java java-9 java-http-client


【解决方案1】:

我遇到了同样的问题

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

使用 java-9-ea+173 和 IntelliJ。我遵循 Eugenes 和 Nicolais 的建议,在运行/调试配置中通过 --add-modules jdk.incubator.httpclientjdk.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 选项中。它开箱即用。

【讨论】:

  • 我的建议是添加 jdk.incubator.httpclient--add-modules,因为文档和命令行实验表明它是不必要的。不过,可能是 IntelliJ 犯了一个错误。
  • 对不起,我误解了。无论如何,如果添加参数,则会加载孵化器模块。也许这真的是一个 IntelliJ 错误。我也无法使用 IntelliJ 通过 ServiceLoader 加载类。只是不会被发现。在命令行上它工作。要么 IntelliJ 还没有准备好,要么我做错了什么。
【解决方案2】:

您或 IntelliJ 一定犯了一个错误。您正在使用incubator module,文档中说:

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

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

您没有收到编译错误这一事实似乎表明 IntelliJ 在编译中正确地包含了模块声明。您收到运行时错误以及 this answer 提供帮助的事实表明 JVM 没有看到您作为模块启动的代码。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 非常感谢!有没有办法自动包含模块?
    • @EmberTraveller Nicolai 的回答似乎暗示当模块孵化出来时,您将不需要--add-modules
    • 这个答案不正确 - --add-modules is not necessary。如果无论是否添加都会有所不同,那么它只是隐藏了另一个错误 - 很可能是开发人员创建的模块(在本例中为 com.company)未在模块路径上使用。
    • @Eugene 感谢您的评论。我不得不删除我原来的那个来修复一个我发现得太晚的错误。我刚刚转发了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2017-04-30
    • 2012-11-25
    相关资源
    最近更新 更多