Предыдущая попытка мигрировать на JBoss 7.0 сразу после его релиза закончилась провалом - он был слишком сырой. После релиза JBoss 7.1.1.Final я попытался сделать это ещё раз (и успешно сделал). Чтобы опыт не забылся и не пропал зря, перечислю действия, которые были предприняты, чтобы проект (веб-приложение на Spring и Hibernate) успешно заработал на JBoss 7.1.
P.S. Ещё один баг в JBoss 7.1.1 - не работает hot deploy для JSP (ну не видит он изменений в JSP). Работаем на JBoss 4.2.3, ждём релиза JBoss 7.2...
- Class-Path. Если приложение не деплоится, а в логе видно сообщение типа
IllegalArgumentException: Given parent is not an ancestor of this virtual file
at org.jboss.vfs.VirtualFile.getPathNameRelativeTo(VirtualFile.java:116)
at ... (неважно)
at org.jboss.as.server.deployment.module.ManifestClassPathProcessor.createAdditionalModule(ManifestClassPathProcessor.java:193) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
- это ошибка парсера манифеста в JBoss (наподобие этой), надо править Class-Path в MANIFEST.MF. У меня он всегда выглядел как Class-Path: . то есть был пустым по умолчанию, и предыдущие версии JBoss это воспринимали нормально. Теперь для запуска приложения пришлось удалить Class-Path из манифеста. - Зависимости от библиотек. Добавление зависимостей производится через Dependencies в MANIFEST.MF (как вариант - в jboss-deployment-structure.xml). При попытке запуска приложения в лог могут выдаваться сообщения о не найденных классах:
ClassNotFoundException: javax.wsdl.extensions.ExtensibilityElement from [Module "deployment.test.war:main" from Service Module Loader]
- при использовании веб-сервисов Spring (Spring-WS) нужна зависимость от javax.wsdl4j.api
ClassNotFoundException: org.dom4j.DocumentException from [Module "deployment.test.war:main" from Service Module Loader]и
ClassNotFoundException: antlr.TokenStream from [Module "deployment.test.war:main" from Service Module Loader]
- Spring зависит от org.dom4j и org.antlr. В итоге MANIFEST.MF у меня выглядит так:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.1
Created-By: 20.1-b02 (Sun Microsystems Inc.)
Dependencies: javax.wsdl4j.api, org.antlr, org.dom4j
(не забудьте о пустой строке) - Datasource и JDBC-драйвера. Настройка datasource производится в файле standalone*.xml (в каталоге configuration/ их четыре штуки - выбирайте нужный). Большинство параметров аналогичны имеющимся в файлах -ds.xml из прошлых версий JBoss. Пример:
<subsystem xmlns="urn:jboss:domain:datasources:1.0">
<datasources>
...
<datasource jta="true" jndi-name="java:jboss/test-oracle" pool-name="test-oracle" enabled="true" use-java-context="false" use-ccm="true">
<connection-url>jdbc:oracle:thin:@localhost:1521:orcl</connection-url>
<driver>ojdbc14</driver>
<security>
<user-name>user</user-name>
<password>password</password>
</security>
<statement>
<prepared-statement-cache-size>64</prepared-statement-cache-size>
<share-prepared-statements>true</share-prepared-statements>
</statement>
</datasource>
<datasource jta="true" jndi-name="java:jboss/test-psql" pool-name="test-psql" enabled="true" use-java-context="false" use-ccm="true">
<connection-url>jdbc:postgresql://localhost:4321/test</connection-url>
<driver>postgresql</driver>
<security>
<user-name>user</user-name>
<password>password</password>
</security>
<statement>
<prepared-statement-cache-size>64</prepared-statement-cache-size>
<share-prepared-statements>true</share-prepared-statements>
</statement>
</datasource>
<drivers>
...
<driver name="ojdbc14" module="com.oracle.ojdbc14">
<driver-class>oracle.jdbc.OracleDriver</driver-class>
<xa-datasource-class>oracle.jdbc.OracleDriver</xa-datasource-class>
</driver>
<driver name="postgresql" module="org.postgresql">
<driver-class>org.postgresql.Driver</driver-class>
<xa-datasource-class>org.postgresql.Driver</xa-datasource-class>
</driver>
</drivers>
</datasources>
</subsystem>Драйвера можно установить либо как модуль OSGi (в папке modules/) либо как приложение (рядом с нашим приложением) - об этом подробно и понятно написано в документации на JBoss (например, здесь и здесь). - Hibernate. JNDI-имя datasource в hibernate.properties вместо test пришлось записать как jboss/test (то есть в начало добавить jboss/). Если не удалить hibernate.transaction.manager_lookup_class из hibernate.properties (или где он ещё может быть прописан), то при попытке запуска будет выдаваться такое исключение:
Caused by: org.hibernate.TransactionException: Could not find UserTransaction in JNDI [UserTransaction]
at ... (неважно)
Caused by: javax.naming.NameNotFoundException: UserTransaction -- service jboss.naming.context.java.UserTransaction
at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:97)
at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:178)
at org.jboss.as.naming.InitialContext.lookup(InitialContext.java:113)
at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:214)
at javax.naming.InitialContext.lookup(InitialContext.java:392) [rt.jar:1.6.0_26]
at org.hibernate.transaction.JTATransactionFactory.getUserTransaction(JTATransactionFactory.java:163) [hibernate-core-3.6.5.Final.jar:3.6.5.Final] - Ресурсы. В предыдущих версиях JBoss AS папка server/<servername>/conf/ добавлялась в classpath приложения, чем пользовались некоторые разработчики, помещая в папку conf/ ресурсы, которыми пользовалось приложение. Для работы в JBoss 7.1 ресурсы приложения пришлось переместить из conf/ в WEB-INF/classes/.
- Полезное чтение. Неплохо прочитать вот эту документацию по миграции на JBoss AS 7: https://docs.jboss.org/author/display/AS71/How+do+I+migrate+my+application+from+AS5+or+AS6+to+AS7.
Заветная строчка:
INFO [org.jboss.as] (MSC service thread 1-1) JBAS015874: JBoss AS 7.1.1.Final "Brontes" started in 29104ms - Started 670 of 749 services (76 services are passive or on-demand)
P.S. Ещё один баг в JBoss 7.1.1 - не работает hot deploy для JSP (ну не видит он изменений в JSP). Работаем на JBoss 4.2.3, ждём релиза JBoss 7.2...
Комментариев нет:
Отправить комментарий