创建支持 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。
您可能知道,由于商标问题,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。