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. Это просто работает из коробки.