【问题标题】:Create a jar file that supports java and Jakarta创建一个支持java和Jakarta的jar文件
【发布时间】:2021-08-08 01:06:57
【问题描述】:

您可能知道,由于商标问题,javax 不得不将其名称更改为 jakarta。目前,我的公司为我们的客户提供了两个 .jar 文件,一个用于使用 Tomcat 9 或更早版本 (javax) 的用户,一个用于 Tomcat 10 (jakarta)。

是否可以创建一个 jar 文件来查看使用了哪个 Tomcat,并为每次导入选择 javax 或 jakarta?本项目不使用 Spring。

我已经找到了如何判断使用的是哪个 Tomcat 版本。

我看到 JAVA 没有像 C++ 这样的预处理器指令。有没有类似的东西可以让我交换进口?

我还看到我不必使用导入,只需使用整个路径调用类。这似乎需要做很多工作,但却是一个可能的解决方案。我只是想知道是否有更快更简单的解决方案。

【问题讨论】:

  • 这可能在这里可以回答,但我认为它更适合SuperUser
  • 你们提供库还是应用程序?您可以同时提供javax.*jakarta.* 类并使用ServletContainerInitializer 来启动您的应用程序(实际上是两个:-))。您有多少班级使用javax.servlet.* 班级?
  • Piotr 它是一个库。如果没有人能给我更好的答案,这就是我的计划。我有 6 节课。

标签: java servlets tomcat9 tomcat10


【解决方案1】:

您描述的行为可以通过ClassFileTransformer 来实现,就像Tomcat Migration Tool 提供的那样。 Tomcat 10 的每个副本都与迁移工具的阴影版本捆绑在一起,因此您无需单独分发。

您可以创建一个jakarta.servlet.ServletContainerInitializer,它将在网络应用程序启动时注入ClassFileTransformer

import java.util.Set;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import org.apache.tomcat.InstrumentableClassLoader;
import org.apache.tomcat.jakartaee.ClassConverter;

public class JavaEEContainerInitializer implements javax.servlet.ServletContainerInitializer {

    @Override
    public void onStartup(Set<Class< ? >> c, ServletContext ctx) throws ServletException {
        final ClassLoader cl = Thread.currentThread().getContextClassLoader();
        if (cl instanceof InstrumentableClassLoader) {
            final InstrumentableClassLoader instrumentableCl = (InstrumentableClassLoader) cl;
            instrumentableCl.addTransformer(new ClassConverter());
        }
    }
}

但是,在库的情况下,我宁愿分发它的两个版本,因此库不必与应用程序的类加载器混为一谈。例如。 openwebbeans 提供相同工件的两个版本:Java EE 版本和带有 jakarta 分类器的 Jakarta EE 版本。

前面提到的Tomcat迁移工具可以自动生成Jakarta EE版本的jar。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 2015-04-24
    • 2010-10-26
    • 2011-12-17
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多