Java 9 без исключения определения класса

Поэтому я хочу попробовать 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 (2017.1.3). Я посмотрел на этот ответ, и похоже, что мне нужно просто добавить требование в файл, но по какой-то причине он не работает.

3 ответа

Решение

Отлично работает для меня, если я использую --add-modules jdk.incubator.httpclient в качестве параметра запуска.

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

Если вы говорите, что ваш модуль требует этого, это не значит, что он будет включен; у него не включено по умолчанию.

Либо вы, либо IntelliJ допустили ошибку. Вы используете модуль инкубатора, о котором в документации сказано:

Модули инкубатора являются частью образа времени выполнения JDK, созданного стандартной сборкой JDK. Однако модули инкубатора не разрешены по умолчанию для приложений на пути к классам. Приложения на пути к классам должны использовать --add-modules опция командной строки для запроса разрешения модуля инкубатора. Приложения, разработанные как модули, могут указывать requires или же requires transitive зависит от модуля инкубатора напрямую.

Я только что подтвердил, что поведение на java-9-ea+169т.е. я могу скомпилировать и запустить такой модуль (из командной строки) без дополнительных флагов.

Тот факт, что вы не получаете ошибку компиляции, указывает на то, что IntelliJ правильно включает объявление модуля в компиляцию. Тот факт, что вы получили ошибку во время выполнения и этот ответ помог, указывает на то, что JVM не видит код, который вы запускаете как модуль.

Я столкнулся с теми же проблемами

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

с java-9-ea+173 и IntelliJ. Я последовал совету Евгения и Николая, чтобы добавить jdk.incubator.httpclient явно к пути модуля через --add-modules jdk.incubator.httpclient в конфигурациях Run/Debug (в 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. Это просто работает из коробки.

Другие вопросы по тегам