该模块已被弃用并标记为可移除

时间:2018-06-29 02:25:44

标签: java java-9 java-10 java-module

我已经将requires transitive java.activation添加到了module-info.java,但是尽管我添加了对module-info.java: module java.activation has been deprecated and marked for removal的依赖性,{{{1} {1}})到我的Maven com.sun.activation:javax.activation:1.2.0

我可以通过在模块声明中添加Automatic-Module-Name: java.activation来解决此问题,但是我从来不喜欢抑制可能修复的警告。我还可以做一些其他事情来与编译器进行通信,我的意图是依赖于第三方jar,而不是依赖于该模块的内置/不推荐使用的版本?

非常感谢!

1 个答案:

答案 0 :(得分:3)

分析

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

root $your-module file:///$your-jar requires java.activation jrt:/java.activation

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

解决方案

对于您的问题,我看到了三种不同的解决方案。

升级模块路径

您使用的JAR是平台模块 java.activation 的完整实现,因此可以通过将JAR放在 upgrade模块路径上来使用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`

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

you discovered yourself一样,您可以使用命令行选项配置编译器插件:

<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>

Java 11

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

忽略

您在做正确的事,它会在几个月内解决问题,因此请继续忽略此警告。 :)