当前位置: 首页 > 面试题库 >

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

太叔昊苍
2023-03-14
问题内容

我正在尝试在Java 9
Maven项目中使用来自孵化器的HttpClient。我没有任何编译问题。该项目成功构建。但是当我尝试运行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并尝试读取响应的Main类:

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

问题答案:

执行期间的区别是使用类路径与模块路径。在声明 JEP11#孵化器模块
要注意的是如

…默认情况下,类路径上的应用程序不解析孵化器模块。

所以为了使用类路径执行代码

类路径上的应用程序必须使用--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上创建的示例项目中也遵循上述目录结构,以复制相同的内容。

  • 只是添加到其中,而没有进行任何公开宣传,我使用的是intelliJ的2017.3 EAP,它还允许我 运行 不包含VM参数的Main类(使用包含上述共享参数的命令)。



 类似资料:
  • Apache Incubator 是工程希望成为完全独立的Apache 软件基金会工程的跳板。代码来自外部组织和现有的外部工程期望移动到Apache 将通过Incubator 输入。

  • Tripleo Incubator 这个库可用于孵化新思想和新工具,从而使我们更加接近我们的目标。

  • Oslo Incubator 是一套 Python 库,它包含了 OpenStack 工程里的基础结构代码。由这些库提供的 API 都是高质量、稳定且有用的。 开发一个新的 Oslo API 的过程一般开始于将从 OpenStack 项目中获取常用的代码,然后将代码移植到这个库中。孵化器不应视为任何 API 的长期选项 - 它仅仅是作为一块敲门砖而纳入 Oslo 库中。

  • 内建 HTTP 路由 路由是一个负责将传入的 HTTP 请求转换为 Action 的组件。 一个 HTTP请求通常被 MVC 框架视为一个事件(event)。这个事件包含了两个主要信息: 请求路径(例如:/clients/1542,/photos/list),其中包括了查询串(如 ?page=1&max=3) HTTP 方法(例如:GET,POST 等) 路由定义在了 conf/routes 文件

  • 我正在向我使用httplib2拥有的REST服务发出HTTPS GET请求,但我们得到了错误: 所有其他客户端都运行良好(浏览器、Java客户端等...),只有一个小例外,PHP curl需要设置为使用SSL v3。 我已经搜索了周围,它似乎确实是一个关于SSL版本的错误,但我似乎找不到一种方法来改变它在http://www. ttplib2.除了改变源代码中的以下行之外,还有什么方法可以解决这个