1

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

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

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

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

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

4

1 回答 1

2

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

您可以创建一个jakarta.servlet.ServletContainerInitializerClassFileTransformer在 Web 应用程序启动时注入的:

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 Migration Tool可以自动生成Jakarta EE版本的jar。

于 2021-05-18T20:32:17.690 回答