Java 9没有类定义异常

Emb*_*ler 11 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();

  }
}
Run Code Online (Sandbox Code Playgroud)

我的模块信息看起来像这样

module com.company {
    requires jdk.incubator.httpclient;
}
Run Code Online (Sandbox Code Playgroud)

但我明白了 java.lang.NoClassDefFoundError: jdk/incubator/http/HttpClient

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

Eug*_*ene 11

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

HttpClient client = HttpClient.newHttpClient();
client.executor().execute(() -> System.out.println("Here")); // prints Here
Run Code Online (Sandbox Code Playgroud)

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

  • 这个答案是不正确的 - "--add-modules"[没有必要](/sf/answers/3083487851/).如果它是否添加会有所不同,那么它只是隐藏了另一个错误 - 很可能是模块路径上没有使用开发人员创建的模块(在这种情况下是`com.company`). (2认同)

Nic*_*lai 10

要么你或者IntelliJ都犯了错误.您正在使用孵化器模块,文档说明了该模块:

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

我刚刚确认了这个行为java-9-ea+169,即我可以编译并启动这样一个模块(从命令行)而没有额外的标志.

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