Создайте файл 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-файла.

Другие вопросы по тегам