【问题标题】:What is the replacement for javax.activation package in java 9?java 9 中 javax.activation 包的替代品是什么?
【发布时间】:2018-03-11 15:23:54
【问题描述】:

似乎javax.activation 包在 Java 9 中已被弃用。 Oracle 迁移指南建议在 JVM 启动期间使用 --add-modules java.activation 选项。

但是,我想避免这种情况并替换 javax.activation 包的类,因为它已被弃用,并将在未来的 Java 版本中删除。我想,javax.activation 应该有某种替代方案。如果有的话,是什么?

【问题讨论】:

  • 一个小补充:JDK 11 实际上删除了它(作为 JEP 320 的一部分),因此如果使用该 JAF,则必须将其作为单独的依赖项包含在内。
  • 需要邮件的 javax 激活依赖项是什么? javax.mail 应该足够了。对吗?
  • javax.mail 的 MimeBodyPart 使用激活的 DataHandler 来设置该部分的 mime 内容。我今天遇到了。甚至在 IDE 中运行时,无法弄清楚为什么主线程在我身上消失了。我只是抓住了异常,所以类没有找到的东西就溜走了。在告诉我的项目应该使用 JRE 8 运行后,问题就消失了>为此浪费了几个小时。

标签: java jvm java-9 javax.activation


【解决方案1】:

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

此独立版本的 JAF 使用 Java 平台模块系统 自动模块名称为java.activation,与模块名称相匹配 在 JDK 9 中使用。未来的版本将包括完整的模块元数据。

通过 upgradeable modules 的概念,仅以模块化形式支持独立 API。使用它们,可以在任何阶段(即在编译时、构建时或运行时)使用来自更高版本的该模块的版本。


当前的available version 是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'

常春藤

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

【讨论】:

【解决方案2】:

JavaBeans 激活框架是一种独立的技术,在 JCP 中有自己的维护 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。

【讨论】:

【解决方案3】:

2020 年更新

下一次改名

(由于某些合法的issues,javax.* 被重命名为jakarta.*。所以当前 1.2.2+ 版本的Jakarta Activation Framework 使用这些名称:

  • jakarta.activation:jakarta.activation-api(而不是javax.activation:javax.actication-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.2</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 允许项目编译。
【解决方案4】:

如上所述,java 版本 > 8 不提供 javax.activation。我在从事骆驼项目时遇到了这个例外。我刚刚添加了以下依赖项:

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      我必须在 Liferay 7.1 中发送邮件,所以我添加了这样的依赖项

      编译'javax.mail:mail:1.4.7'

      【讨论】:

        猜你喜欢
        • 2020-02-18
        • 2014-04-12
        • 2011-08-31
        • 2011-02-03
        • 2019-02-22
        • 2011-05-07
        • 2012-04-24
        • 2019-12-03
        • 2010-09-17
        相关资源
        最近更新 更多