Java 9 HttpClient java.lang.NoClassDefFoundError: jdk/ инкубатор /http/HttpClient
Я пытаюсь использовать HttpClient из инкубатора в проекте Java 9 Maven. У меня нет проблем с компиляцией. Проект строится успешно. Но когда я пытаюсь запустить класс Main, он дает мне следующее исключение:
Exception in thread "main" java.lang.NoClassDefFoundError: jdk/incubator/http/HttpClient
at java9.http_client.Main.main(Main.java:18)
Caused by: java.lang.ClassNotFoundException: jdk.incubator.http.HttpClient
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)....
Мой код - это просто файл информации о модуле и главный класс, который просто вызывает google.com и пытается прочитать ответ:
module-info.java
module java9.http_client {
requires jdk.incubator.httpclient;
}
Main.java
public final class Main {
public static void main(String[] args) {
try {
HttpClient client = HttpClient.newHttpClient();
URI httpURI = new URI("http://www.google.com/");
HttpRequest request = HttpRequest.newBuilder(httpURI).GET().build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandler.asString());
String responseBody = response.body();
int responseStatusCode = response.statusCode();
System.out.println(responseBody + "\n" + responseStatusCode);
} catch (URISyntaxException | IOException | InterruptedException e) {
throw new RuntimeException("Unable to run Java 9 Http Client examples", e);
}
}
}
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.javacodegeeks.java9</groupId>
<artifactId>http_client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Java9HttpClient</name>
<description>Java Http Client example</description>
<properties>
<java-version>1.9</java-version>
<maven-compiler-plugin-version>3.6.1</maven-compiler-plugin-version>
<maven-shade-plugin-version>3.0.0</maven-shade-plugin-version>
</properties>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin-version}</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>${maven-shade-plugin-version}</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java-version}</source>
<target>${java-version}</target>
<verbose>true</verbose>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.javacodegeeks.java9.http_client.Main</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Что мне не хватает? Я нашел различные статьи об этом, но все они делают это таким образом.
Любая помощь оценивается. Спасибо!
Команда выполняется при использовании --add-modules
cd /home/mansi/NetBeansProjects/java9-http-client; JAVA_HOME=/home/mansi/jdk-9 /home/mansi/netbeans-dev-201709070001/java/maven/bin/mvn "-Dexec.args=--add-modules=jdk.incubator.httpclient -classpath %classpath java9.http_client.Main" -Dexec.executable=/home/mansi/jdk-9/bin/java -Dexec.classpathScope=runtime org.codehaus.mojo:exec-maven-plugin:1.5.0:exec
Когда не используется --add-modules
cd /home/mansi/NetBeansProjects/java9-http-client; JAVA_HOME=/home/mansi/jdk-9 /home/mansi/netbeans-dev-201709070001/java/maven/bin/mvn "-Dexec.args=-classpath %classpath java9.http_client.Main" -Dexec.executable=/home/mansi/jdk-9/bin/java -Dexec.classpathScope=runtime org.codehaus.mojo:exec-maven-plugin:1.5.0:exec
2 ответа
Разница во время выполнения заключается в использовании classpath и modulepath. Заявление в модулях инкубатора JEP11#, на которое следует обратить
... модули инкубатора не разрешены по умолчанию для приложений на пути к классам.
поэтому для выполнения кода с использованием classpath
Приложения на пути к классам должны использовать
--add-modules
опция командной строки для запроса разрешения модуля инкубатора.
Если вы хотите выполнить без использования --add-modules
вариант, при создании нового module
и пытается выполнить Main
класс убедитесь, что команда java выполнена с использованием пути к модулю, используя аргументы:
-p or --module-path <module path>
Поиск каталогов из списка каталогов, разделенных точкой с запятой (;). Каждый каталог является каталогом модулей.
-m or --module <module>/<mainclass
Указывает имя исходного модуля для разрешения и, если оно не указано модулем, затем указывает имя основного класса для выполнения.
Полная команда будет что-то вроде (например):
.../jdk-9.0.1.jdk/Contents/Home/bin/java
-p .../jdk9-httpincubate-maven/target/classes
-m jdk.httpincubate.maven/http2.Main
Примечание:
Приведенная выше структура каталогов используется в примере проекта, который я создал на GitHub, чтобы повторить то же самое.
Просто чтобы добавить к этому и без какой-либо рекламы, я использую 2017.3 EAP для intelliJ, и это позволяет мне также запускать класс Main без аргументов VM (используя команду, включающую аргументы, как указано выше).
Если принятый ответ все еще не работает для вас тогда..
Недостающий секрет также должен включать maven-surefire-plugin
с тем же компилятором Арг.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>10</source>
<target>10</target>
<compilerArgument>--add-modules=jdk.incubator.httpclient</compilerArgument>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<configuration>
<argLine>--add-modules=jdk.incubator.httpclient</argLine>
</configuration>
</plugin>
</plugins>
</build>