gvnix над Jboss 6 и Oracle

Я установил пример gvnix geo-petclinic поверх Tomcat и Postgis без проблем. Затем я попытался установить его через Jboss и Oracle

Я изменил скрипт рута с помощью:

jpa setup --provider HIBERNATE --database ORACLE --userName user --databaseName dbname --password pass --hostName host

Когда я пытался запустить его, я получаю эту ошибку:

13:24:57,781 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 48) MSC000001: Failed to start service jboss.persistenceunit."geo-gvnix-jboss-oracle2.war#persistenceUnit": org.jboss.msc.service.StartException in service jboss.persistenceunit."geo-gvnix-jboss-oracle2.war#persistenceUnit": java.lang.IllegalStateException: java.lang.ClassNotFoundException: Can't find a delegate
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:103) [jboss-as-jpa-7.3.0.Final-redhat-14.jar:7.3.0.Final-redhat-14]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_45]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_45]
    at java.lang.Thread.run(Thread.java:744) [rt.jar:1.7.0_45]
    at org.jboss.threads.JBossThread.run(JBossThread.java:122) [jboss-threads-2.1.1.Final-redhat-1.jar:2.1.1.Final-redhat-1]
Caused by: java.lang.IllegalStateException: java.lang.ClassNotFoundException: Can't find a delegate
    at net.bull.javamelody.JpaPersistence.guessDelegate(JpaPersistence.java:202)
    at net.bull.javamelody.JpaPersistence.loadOrGuessDelegate(JpaPersistence.java:170)
    at net.bull.javamelody.JpaPersistence.findDelegate(JpaPersistence.java:162)
    at net.bull.javamelody.JpaPersistence.createContainerEntityManagerFactory(JpaPersistence.java:124)
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.createContainerEntityManagerFactory(PersistenceUnitServiceImpl.java:200) [jboss-as-jpa-7.3.0.Final-redhat-14.jar:7.3.0.Final-redhat-14]
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.access$600(PersistenceUnitServiceImpl.java:57) [jboss-as-jpa-7.3.0.Final-redhat-14.jar:7.3.0.Final-redhat-14]
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:99) [jboss-as-jpa-7.3.0.Final-redhat-14.jar:7.3.0.Final-redhat-14]
    ... 4 more
Caused by: java.lang.ClassNotFoundException: Can't find a delegate
    ... 11 more

2 ответа

Спецификация Java EE гласит:

EE.8.2.3

Конфликты библиотек Если приложение включает в себя связанную версию библиотеки, и такая же библиотека существует в качестве установленной библиотеки, экземпляр библиотеки, связанной с приложением, следует использовать предпочтительнее любой установленной версии библиотеки. Это позволяет приложению связывать именно ту версию библиотеки, которая ему требуется, без влияния каких-либо установленных библиотек. Обратите внимание, что если библиотека также является обязательным компонентом версии платформы Java EE, в которой развертывается приложение, версия платформы может (и обычно будет) иметь приоритет.

gvNIX генерирует приложения, которые включают в себя связанные библиотеки, поэтому jcgarcia показала способ настроить сгенерированное приложение, удалив из него модуль персистентности (поскольку он является обязательным компонентом), и сконфигурировать приложение для получения ресурсов персистентности из JBoss.

Вам нужно только установить H-Spatial в качестве модуля JBoss, чтобы его предоставил JBoss.

gvNIX генерирует стандартные приложения Java, поэтому вы должны без проблем запустить ваше приложение на сервере JBoss EAP 6.2+... но вам нужно внести некоторые небольшие изменения;)...

  • Предоставляемые библиотеки: JBoss предоставляет постоянные библиотеки в отличие от tomcat. Вы должны установить в pom.xml установленные компоненты персистентности (не забудьте установить драйвер оракула, как это предусмотрено, при необходимости, и добавить драйвер оракула на JBOSS Server)

    <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>4.2.2.Final</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>4.2.2.Final</version> <scope>provided</scope> <exclusions> <exclusion> <groupId>cglib</groupId> <artifactId>cglib</artifactId> </exclusion> <exclusion> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.0-api</artifactId> <version>1.0.1.Final</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>4.3.1.Final</version> <scope>provided</scope> </dependency>

  • Конфликты путей: JBoss не нравится '*' в конфигурации пути к классам, поэтому вам нужно изменить файл web.xml с помощью:

    <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:META-INF/spring/applicationContext.xml,classpath:META-INF/ spring/applicationContext-security.xml </param-value> </context-param>

  • Источник данных: приложения gvNIX, работающие на JBoss EAP 6.2.0+, должны настроить действительный источник данных JNDI для доступа к данным. Поэтому вам нужно изменить конфигурацию источника данных в файле applicationContext.xml следующим образом:

    1. Комментарий текущий BasicDatasource
    2. Добавьте следующую конфигурацию источника данных JNDI:

      <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/> <tx:jta-transaction-manager /> <jee:jndi-lookup id="entityManagerFactory" jndi-name="java:jboss/medaleaEntityManagerFactory" expected-type="javax.persistence.EntityManagerFactory" />

    3. Измените тип транзакции на JTA в файле persistence.xml. Ваш файл persistence.xml будет выглядеть следующим образом:

      [...] <persistence-unit name="persistenceUnit" transaction-type="JTA"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-data-source>java:jboss/datasources/YOURDATASOURCENAME</jta-data-source> <properties> [...] <property name="jboss.entity.manager.factory.jndi.name" value="java:jboss/medaleaEntityManagerFactory"/> </properties> </persistence-unit> </persistence>

С изменениями, указанными выше, ваш проект должен работать на сервере JBoss EAP 6.2+;)

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