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

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

我已将 requires transitive java.activation 添加到我的 module-info.java,但 java-10 给我一个编译器警告 module-info .java:模块 java.activation 已被弃用并标记为删除,尽管我添加了对 com.sun.activation:javax.activation:1.2.0 的依赖( Automatic-Module-Name: java.activation) 到我的 Maven pom.xml

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

非常感谢!

最佳答案

分析

选项 --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 放在升级模块路径上来使用 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 构建,问题就会消失。

忽略它

您正在做正确的事情,它会在几个月内自行解决,所以继续前进并忽略警告。 :)

关于java - 模块已被弃用并标记为删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51093463/

相关文章:

spring - Java 9项目结构问题

java - JDK10支持AOT编译吗?

java - 使用 JTWAIN 访问网络扫描仪

java - 当我在 Java 中说 "catch (Exception e) {}"时,它叫什么?

Java 9 + Maven : What happens if two dependencies export the same module?

java - 从 java 10 升级到 java 11,从 gradle 4.10 升级到 gradle。 5.2 : "Variable not initialized in the default constructor"

java - 将 GWT 2.5 网络应用程序迁移到 Java 10

java - 基于时间戳和电话号码的加盐随机数

java - Spring JasperException JSTL 标签

java - 我的模块化库的用户有什么方法可以访问尚未导出的类?