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>
Другие вопросы по тегам