您描述的行为可以通过Tomcat 迁移工具ClassFileTransformer
提供的类似行为来实现。Tomcat 10 的每个副本都与迁移工具的阴影版本捆绑在一起,因此您无需单独分发它。
您可以创建一个jakarta.servlet.ServletContainerInitializer
将ClassFileTransformer
在 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。