Java 9中javax.activation包的替代品是什么?

85

看起来在Java 9中,javax.activation包已被弃用。Oracle迁移指南建议在JVM启动时使用--add-modules java.activation选项。

但是,我想避免使用该选项并替换javax.activation包的类,因为它已经被弃用并将在未来的Java版本中被删除。我认为,应该有一些javax.activation的替代方案。如果有可用的替代方案,那是什么?


7
一个小补充:实际上,JDK 11删除了这个功能(作为JEP 320的一部分),因此如果使用它,则必须将JAF作为单独的依赖项包含进来。 - blalasaadri
javax.activation依赖于邮件需要吗?javax.mail就足够了,对吧? - Satish Patro
4
javax.mail的MimeBodyPart使用activation的DataHandler来设置该部分的mime内容。我今天遇到了这个问题。甚至在IDE中运行时,主线程也突然消失,我无法找出原因。我只捕获了异常,所以类未找到的问题直接跳过去了。 告诉我的项目应该使用JRE 8运行后,问题消失了。我在这上面浪费了很多时间。 - Mike
6个回答

85

JavaBeans Activation Framework (JAF)可能是您寻找的替代方案,用于现有包。

这个独立的 JAF 发布使用 Java 平台模块系统自动模块名称java.activation,以匹配 JDK 9 中使用的模块名称。未来版本将包括完整的模块元数据。

这些独立的 API 仅以模块化形式受支持,通过 可升级模块 的概念。使用它们,可以在任何阶段(即编译时、构建时或运行时)中使用来自较新版本的该模块的版本。


当前可用版本1.2.0,可以像这样使用:

Maven

<dependency>
    <groupId>com.sun.activation</groupId>
    <artifactId>javax.activation</artifactId>
    <version>1.2.0</version>
</dependency>

Gradle

compile 'com.sun.activation:javax.activation:1.2.0'

Ivy

<dependency org="com.sun.activation" name="javax.activation" rev="1.2.0" />

19
Eclipse基金会已接管JavaEE的开发。根据https://wiki.eclipse.org/New_Maven_Coordinates,javax.activation已经迁移到jakarta.activation。 - Gili

29
JavaBeans激活框架是一项独立的技术,具有自己的维护JSR和下载。是的,Java SE 9已经将其弃用,并计划在未来的版本中删除它及与Java EE共享的模块,但这并不影响独立版本。该独立版本将继续存在。如果您正在使用Maven,则应该可以使用以下命令:
<dependency>
  <groupId>com.sun.activation</groupId>
  <artifactId>javax.activation</artifactId>
  <version>1.2.0</version>
</dependency>

如果您正在开发一个模块,那么您可以使用 requires java.activation


那么,如果我使用javaee-api依赖项并将其范围设置为provided,我需要添加这个吗? - Dmitriy Dumanskiy
3
现在使用JakartaEE,源代码由Eclipse基金会托管,并可在GitHub上找到:https://github.com/eclipse-ee4j/jaf,以及在Maven中央库中找到:https://mvnrepository.com/artifact/com.sun.activation/jakarta.activation。因此,`artifactId`已更改为`jakarta.activation`,版本号为`1.2.1`。 - jonashackt

24

2020更新

下一次更名

(由于一些法律问题, javax.* 被更名为 jakarta.*。所以当前的1.2.2+版本的 Jakarta Activation Framework 使用以下名称:

  • jakarta.activation:jakarta.activation-api (而不是 javax.activation:javax.activation-api) 或者
  • com.sun.activation:jakarta.activation (而不是 com.sun.activation:javax.activationjavax.activation:activation)

(这些库中的包名仍然是 javax.activation,所以这个问题只涉及 Maven 依赖名称)

<dependency>
    <groupId>jakarta.activation</groupId>
    <artifactId>jakarta.activation-api</artifactId>
    <version>1.2.2</version>
</dependency>

或者

<dependency>
    <groupId>com.sun.activation</groupId>
    <artifactId>javax.activation</artifactId>
    <version>1.2.0</version>
</dependency>

注意:你不需要同时使用这两个依赖项,因为com.sun.activation:javax.activation已经包含了jakarta.activation:jakarta.activation-api中的类。
使用Maven强制执行器来确保项目中没有重复的内容。
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>3.0.0-M3</version>
    <executions>
        <execution>
            <id>enforce-lib-ban</id>
            <goals>
                <goal>enforce</goal>
            </goals>
            <configuration>
                <rules>
                    <bannedDependencies>
                        <!-- the activation framework was renamed to jarkata activation framework -->
                        <excludes>
                            <exclude>javax.activation:javax.actication-api</exclude>                        
                            <exclude>com.sun.activation:javax.activation</exclude>
                            <exclude>javax.activation:activation</exclude>
                        </excludes>
                        <message>use jakarta.activation:jakarta.activation-api or com.sun.activation:jakarta.activation instead of javax.activation</message>
                    </bannedDependencies>
<!-- if you use com.sun.activation:jakarta.activation
                    <bannedDependencies>
                        <!- - the implementation com.sun.activation:jakarta.activation contains the api classes too - ->
                        <excludes>
                            <exclude>jakarta.activation:jakarta.activation-api</exclude>
                        </excludes>
                        <message>the implementation com.sun.activation:jakarta.activation is included and it contains the api classes too</message>
                    </bannedDependencies>
-->
                </rules>
            </configuration>
        </execution>
    </executions>
</plugin>

这对我有用。我不得不安装全新的Eclipse(在家工作),以便在一个遗留项目上工作,最新的Eclipse(20210910-1417)有自己的JDK可以编译Java 8,但是不包括原始的javax.activation jar文件,如注释所述。我需要邮件包中的Mime,而jakarta.activation-1.2.1.jar允许项目被编译。 - JasonH
没有这样的依赖关系:- <groupId>com.sun.activation</groupId> <artifactId>javax.activation</artifactId> <version>1.2.2</version> - 将版本更改为1.2.0。 - Lonzak

2

如上所述,Java版本> 8没有提供javax.activation。在Camel项目中工作时遇到了此异常。我只需添加以下依赖项:

最初的回答:

<!-- https://mvnrepository.com/artifact/javax.activation/activation -->
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>

2

我在我的项目中使用模块配置,所以这个问题可以通过在module-info.java文件中添加requires java.activation来简单解决。


0

我需要在 Liferay 7.1 中发送邮件,所以我添加了依赖项,如下所示

compile 'javax.mail:mail:1.4.7'


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接