【问题标题】:Using Incubator Http Classes with Maven in Java9在 Java9 中使用带有 Maven 的孵化器 Http 类
【发布时间】:2018-02-10 20:19:30
【问题描述】:

我在用什么

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

Foo 的第 4 行是

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 不是很好,以前从未处理过孵化器类。我已经搜索了错误,但没有发现任何有用的东西。感谢您的帮助。

【问题讨论】:

    标签: java maven java-9


    【解决方案1】:

    在创建模块时,您需要在包的最顶层创建一个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。我该怎么做才能解决这个问题?感谢大家的帮助!
    • @CalebBassham 理想情况下,我建议将运行时的错误解耦为另一个问题。因为这应该包括问题中的详细信息,例如您如何尝试执行该类以及如何使用更好的堆栈跟踪对其进行打包。
    • "你需要创建一个 module-info.java ..." 不太对。是的,您可以创建一个需要 httpclient 模块的模块。另一种方法是只创建一个使用--add-modules jdk.incurbator.httpclient 编译和运行的常规类路径应用程序。
    • @AlanBateman 好吧,答案是假设 OP 正在创建模块。也更新了类路径替代方案以供将来参考。
    猜你喜欢
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    相关资源
    最近更新 更多