在Java9中使用Maven和孵化器Http类

6

我所使用的技术

Java 9 + Maven + HttpClient (从Java 9开始) jdk.incubator.http.HttpClient

问题

在使用maven构建我的项目时,我遇到了以下错误:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile (default-compile) on project Core: Compilation failure: Compilation failure:
[ERROR] Foo.java:[4,21] package jdk.incubator.http is not visible
< p > < code > Foo 的第四行是

import jdk.incubator.http.HttpClient;

Pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>me.bar</groupId>
    <artifactId>foo</artifactId>
    <version>0.0.0-SNAPSHOT</version>
</parent>

<artifactId>Core</artifactId>

<build>
    <finalName>${project.artifactId}</finalName>
    <sourceDirectory>${project.basedir}/src</sourceDirectory>


    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-clean-plugin</artifactId>
            <version>3.0.0</version>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <source>9</source>
                <target>9</target>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.1.0</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <minimizeJar>true</minimizeJar>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

注意

抱歉,如果您认为这有一个显而易见的解决方法,我并不擅长使用Maven,以前也从未处理过incubator类。我已经搜索了错误,但没有找到任何有用的信息。感谢您的帮助。

1个回答

7
在创建一个模块时,你需要在你的包的最高层级别创建一个名为 module-info.java 的类,并将其包括在其中。
module yourModule {
    requires jdk.incubator.httpclient;
}

确保模块 jdk.incubator.httpclient 导出的包 jdk.incubator.http 对您的模块可见。

或者,如果要创建一个常规的类路径应用程序,则可以

使用以下命令进行编译:

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.7.0</version>
    <configuration>
        <source>9</source>
        <target>9</target>
        <compilerArgs>
            <arg>--add-modules</arg>
            <arg>jdk.incubator.httpclient</arg>
        </compilerArgs>
    </configuration>
</plugin>

使用以下方式运行:

java -jar --add-modules=jdk.incubator.httpclient yourJar.jar

这确实允许Maven进行编译,但是在运行时却找不到该类,出现了“NoClassDefFoundError”错误。我应该怎么做才能解决这个问题呢?非常感谢你的帮助! - Caleb Bassham
1
@CalebBassham 我建议在运行时将错误解耦成一个不同的问题。这样做可以包含有关如何执行类以及如何打包它以及更好的堆栈跟踪的详细信息。 - Naman
2
你需要创建一个 module-info.java 文件... 不完全正确。是的,你可以创建一个依赖于 httpclient 模块的模块。另一种方法是创建一个普通的类路径应用程序,并使用 --add-modules jdk.incurbator.httpclient 进行编译和运行。 - Alan Bateman
@AlanBateman 嗯,是的,答案是基于假设OP正在创建模块的情况下给出的。同时也更新了classpath替代方案,以供将来参考。 - Naman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接