模块已被弃用并标记为删除
module has been deprecated and marked for removal
我已经将 requires transitive java.activation
添加到我的 module-info.java
,但是 java-10 给我一个编译器警告 module-info.java: module java.activation has been deprecated and marked for removal
,尽管我添加了对 com.sun.activation:javax.activation:1.2.0
(Automatic-Module-Name: java.activation
) 到我的 Maven pom.xml
.
我可以通过在我的模块声明中添加 @SuppressWarnings("removal")
来解决这个问题,但我从不喜欢抑制我可以修复的警告。我还可以做些什么来与编译器沟通我打算依赖第三方 jar 而不是该模块的 built-in/deprecated 版本?
非常感谢!
分析
选项--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 放在升级模块路径:
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 替换同名的平台模块,弃用就会消失。
作为,您可以使用命令行选项配置编译器插件:
<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
java.activation 等 JEE 模块已从 JDK 11 中删除,因此如果您针对 11 构建,问题就会消失。
忽略它
你做的是对的,它会在几个月内自行解决,所以继续前进并忽略警告。 :)
我已经将 requires transitive java.activation
添加到我的 module-info.java
,但是 java-10 给我一个编译器警告 module-info.java: module java.activation has been deprecated and marked for removal
,尽管我添加了对 com.sun.activation:javax.activation:1.2.0
(Automatic-Module-Name: java.activation
) 到我的 Maven pom.xml
.
我可以通过在我的模块声明中添加 @SuppressWarnings("removal")
来解决这个问题,但我从不喜欢抑制我可以修复的警告。我还可以做些什么来与编译器沟通我打算依赖第三方 jar 而不是该模块的 built-in/deprecated 版本?
非常感谢!
分析
选项--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 放在升级模块路径:
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 替换同名的平台模块,弃用就会消失。
作为
<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
java.activation 等 JEE 模块已从 JDK 11 中删除,因此如果您针对 11 构建,问题就会消失。
忽略它
你做的是对的,它会在几个月内自行解决,所以继续前进并忽略警告。 :)