Как загрузить банки OpenJPA с помощью tomcat

У меня есть приложение Spring MVC, которое использует openjpa 2.1.1 в качестве своей среды сохранения. Он разработан как проект Maven в STS и работает локально на vFaric TC Server (Tomcat 7).

Когда мы впервые развернули войну в Websphere 8.5, мы столкнулись с конфликтами загрузчика классов со следующими тремя файлами jar openjpa, которые были в нашем файле войны:

geronimo-jpa_2.0_spec-1.1.jar geronimo-jta_1.1_spec-1.1.1.jar проверка API-1.0.0.GA.jar

Удаление их из войны и отсрочка до связанного openjpa Websphere сработало нормально, поэтому я изменил область зависимостей POM openjpa с «компилировать» на «предоставлено» (чтобы эти jar-файлы не были упакованы в файл войны).

Поскольку Tomcat 7 не совместим с Java EE, я поместил 3 jar-файла в Tomcat\lib (также попробовал библиотеку vfabric-tc-server, которая обертывает tomcat), но классы JPA не были видны приложению при запуске (исключения noclassdeffound в приставка).

Я также попытался добавить банки в путь к классам сервера из «конфигурации запуска» в STS - и там не повезло.

Есть ли порядок загрузчика классов, который необходимо установить где-то в Tomcat, чтобы JPA загружался перед приложением?

Мне нужна сборка, которая будет работать при развертывании на Tomcat или Websphere.

Любая помощь будет высоко ценится.


person user2743197    schedule 03.09.2013    source источник


Ответы (2)


В случае, если это кому-то поможет, NoClassDefFoundError имел в виду класс JPA, но НЕ один из тех, что были включены в 3 jar-файла. Я запустил дерево mvn и обнаружил, что вся цепочка зависимостей JPA:

openjpa-2.1.1.jar commons-lang-2.4.jar commons-collections-3.2.1.jar geronimo-jta_1.1_spec-1.1.1.jar geronimo-jpa_2.0_spec-1.1.jar

Мне также нужно было добавить:

серп-1.12.0.jar

Первоначально я включил validation-api-1.0.0.GA.jar в tomcat/lib, потому что его нужно было удалить из войны, чтобы заставить работать веб-сферу, но размещение его в tomcat/lib вызвало «javax.validation.ValidationException : Не удалось найти поставщика по умолчанию», поэтому я удалил его, а это означает, что нужно было добавить только вышеуказанные 6 банок.

person user2743197    schedule 04.09.2013
comment
Для всех, кто заинтересован, это моя оболочка Tomcat+AutomanagedEM+OpenJPA. См. папку example_webapp/web-inf/lib/, в которой находятся jar-файлы. Это может быть хорошим справочником для тех, кто использует технику Tomcat+JPA. github.com/Murmur/ScopedEntityManager - person Whome; 08.09.2014

@ user2743197 - Во-первых, вам нужны отдельные профили, определенные в вашем Maven pom. Определите один профиль для WAS и используйте его зависимость от OpenJPA через:

    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>6.0</version>
        <scope>provided</scope>
    </dependency>

Вот как я использую бинарный файл OpenJPA-2.1.1-SNAPSHOT, который связан с WAS v8.x.x.

Определите другой профиль Maven для Tomcat, который явно захватывает все необходимые вам зависимости, за исключением нескольких спецификаций, связанных с JavaEE, которые предоставляет Tomcat. Итак, определите OpenJPA-2.1.1-SNAPSHOT как зависимость (конечно, не как «предоставленную»).

Теперь, что касается начальной загрузки JPA в военном проекте, развернутом на Tomcat (без использования Spring), я обычно создаю такой класс:

@WebListener
public class ApplicationLifeCycleListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
       ...
       // Do some OpenJPA bootstrapping here
       // Get an EntityManager.
       EntityManager em = PersistenceUtil.getEntityManager();
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        //throw new UnsupportedOperationException("Not supported yet.");
        PersistenceUtil.closeEntityManagerFactory();
    }
}

Это то, что я делаю для начальной загрузки Hibernate/JPA. My PersistenceUtil обрабатывает создание EntityManagerFactory, доставку моего EntityManager и т. д.

Вместо этого вы можете рассмотреть TomEE. Он будет предлагать вам ту же функциональность, что и WebSphere 8.x.x, когда дело доходит до JPA. Оба в значительной степени полагаются на продукты Apache. WebSphere 8.x.x и TomEE позволят вам использовать EJB 3.x, который в сочетании с CDI или без него намного проще использовать с реализацией JPA. С Tomcat вам придется беспокоиться об управлении транзакциями самостоятельно или о том, как использовать CDI или Spring для управления вашими транзакциями.

person Chris Harris    schedule 09.09.2013