创建一个支持javax.*和jakarta.*的jar文件



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

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

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

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

我还看到,我不必使用导入,只需使用整个路径调用类。这看起来工作量很大,但却是一个可能的解决方案。我只是想知道是否有一个更快更容易的解决方案。

您描述的行为可以使用类似Tomcat迁移工具提供的ClassFileTransformer来实现。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());
}
}
}

然而,在库的情况下,我更愿意分发它的两个版本,这样库就不必与应用程序的类加载器发生冲突。例如,openwebbeans提供了同一工件的两个版本:Java EE版本和带有jakarta分类器的Jakarta EE版本。

上述Tomcat迁移工具可以自动生成jar的Jakarta EE版本。

最新更新