Создайте файл jar, поддерживающий java и Jakarta
Как вы, наверное, знаете, javax пришлось сменить название на jakarta из-за проблемы с товарным знаком. Сейчас моя компания предоставляет нашим клиентам два файла .jar, один для тех, кто использует Tomcat 9 или более раннюю версию (javax), а другой - для Tomcat 10 (jakarta).
Можно ли создать один файл jar, который может видеть, какой Tomcat используется, и для каждого импорта выбирать либо javax, либо jakarta? В этом проекте Spring не используется.
Я уже нашел, как узнать, какая версия Tomcat используется.
Я вижу, что в JAVA нет таких директив препроцессора, как C++. Есть ли что-то подобное, что позволит мне поменять местами импорт?
Я также вижу, что мне не нужно использовать импорт и просто вызывать класс, используя весь путь. Это похоже на большую работу, но это возможное решение. Я просто хочу знать, есть ли более быстрое решение.
1 ответ
Описанное вами поведение может быть достигнуто с помощью как тот, который предоставляется инструментом миграции Tomcat . Каждая копия Tomcat 10 поставляется с затененной версией средства миграции, поэтому вам не нужно распространять ее независимо.
Вы можете создать
jakarta.servlet.ServletContainerInitializer
который будет вводить
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 EE с
jakarta
классификатор.
Вышеупомянутый инструмент миграции Tomcat может автоматически генерировать Jakarta EE-версию jar-файла.