创建支持 java 和 Jakarta 的 jar 文件

Create a jar file that supports java and Jakarta

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

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

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

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

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

您描述的行为可以通过 ClassFileTransformer like the one provided by the Tomcat Migration Tool 实现。 Tomcat10的每个副本都与迁移工具的阴影版本捆绑在一起,因此您无需单独分发它。

您可以创建一个 jakarta.servlet.ServletContainerInitializer,它将在 Web 应用程序启动时注入 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());
        }
    }
}

然而,如果是库,我宁愿分发它的两个版本,这样库就不必与应用程序的 class 加载程序混淆。例如。 openwebbeans 提供同一工件的两个版本:Java EE 版本和带有 jakarta classifier 的 Jakarta EE 版本。

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