3 авг. 2012 г.

Миграция с JBoss AS 4/5/6 на JBoss AS 7.1

Предыдущая попытка мигрировать на JBoss 7.0 сразу после его релиза закончилась провалом - он был слишком сырой. После релиза JBoss 7.1.1.Final я попытался сделать это ещё раз (и успешно сделал). Чтобы опыт не забылся и не пропал зря, перечислю действия, которые были предприняты, чтобы проект (веб-приложение на Spring и Hibernate) успешно заработал на JBoss 7.1.
  1. 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 из манифеста.
  2. Зависимости от библиотек. Добавление зависимостей производится через 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
    (не забудьте о пустой строке)
  3. 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 (например, здесь и здесь).
  4. 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]
  5. Ресурсы. В предыдущих версиях JBoss AS папка server/<servername>/conf/ добавлялась в classpath приложения, чем пользовались некоторые разработчики, помещая в папку conf/ ресурсы, которыми пользовалось приложение. Для работы в JBoss 7.1 ресурсы приложения пришлось переместить из conf/ в WEB-INF/classes/.
  6. Полезное чтение. Неплохо прочитать вот эту документацию по миграции на 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...

Комментариев нет:

Отправить комментарий