模块已被弃用并标记为删除

Chr*_*ick 6 java java-9 java-10 java-module

我已添加requires transitive java.activation到我的module-info.java,但java-10正在给我一个编译器警告module-info.java: module java.activation has been deprecated and marked for removal,尽管我已经在我的Maven 上添加了对com.sun.activation:javax.activation:1.2.0(Automatic-Module-Name: java.activation)的依赖pom.xml.

我可以通过添加@SuppressWarnings("removal")到我的模块声明来解决这个问题,但我从不喜欢抑制我可以修复的警告.还有什么我可以做的事情来与编译器沟通我打算依赖第三方jar而不是该模块的内置/弃用版本?

非常感谢!

Nic*_*lai 4

分析

该选项--show-module-resolution有助于观察此类行为。它仅适用于java,不适用于javac,但 JPMS 在这两种情况下的行为相同。如果您使用该选项和模块路径上的javax.activation-1.2.0.jar启动应用程序,您将看到这一行:

root $your-module file:///$your-jar requires java.activation jrt:/java.activation
Run Code Online (Sandbox Code Playgroud)

请注意,java.activation是从 中提取的jrt:/java.activation,而不是模块路径上的 JAR。模块系统更喜欢(不幸的是默默地)平台模块而不是模块路径中的模块,这就是不使用未弃用版本的原因。

解决方案

我看到你的问题有三种不同的解决方案。

升级模块路径

您使用的 JAR 是平台模块java.activation的完整实现,因此您可以通过将 JAR 放在升级模块路径上来使用 JAR 来替换模块:

javac
    -d /home/nipa/code/Java-Activation/target/classes
    --upgrade-module-path ~/.m2/repository/com/sun/activation/javax.activation/1.2.0/javax.activation-1.2.0.jar:
    -g --release 10 -encoding UTF-8
    `find . -name *.java`
Run Code Online (Sandbox Code Playgroud)

然后,编译器将使用 JAR 来替换同名的平台模块,并且弃用将消失。

正如您自己发现的那样,您可以使用命令行选项配置编译器插件:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <compilerArgs>
                    <arg>--upgrade-module-path=${settings.localRepository}/com/sun/activation/javax.activation/${javax.activation.version}/javax.activation-${javax.activation.version}.jar</arg>
                </compilerArgs>
            </configuration>
        </plugin>
    </plugins>
</build>
Run Code Online (Sandbox Code Playgroud)

爪哇11

JEE 模块(如java.activation)已从 JDK 11 中删除,因此如果您针对 11 进行构建,问题就会消失。

忽略它

您正在做正确的事情,几个月后问题就会自行解决,因此请忽略该警告。:)