Guia de Migração

JBoss Enterprise Application Platform 6.1

Para uso com o JBoss Enterprise Application Plataform 6

Sande Gilda

Darrin Mison

David Ryan

Resumo

Este livro é um guia para migração de seu aplicativo a partir de versões anteriores do JBoss Enterprise Application Plataform.

Capítulo 1. Introdução

1.1. Guia da Migração

O JBoss Enterprise Application Plataform 6 é uma implementação poderosa, rápida e leve da especificação Java Enterprise Edition 6. A arquitetura é construída no Modular Service Container e ativa os serviços por demanda quando o seu aplicativo os requer. Devido à nova arquitetura, os aplicativos executando no JBoss Enterprise Application Plataform 5 podem necessitar de modificações para executarem no JBoss Enterprise Application Plataform 6.
O propósito deste guia é documentar as alterações que são requeridas a executarem com êxito e implantar os aplicativos da JBoss Enterprise Application Plataform 6. Isto fornece informação de como resolver a implantação e os problemas do período de execução e como prevenir alterações no aplicativo. Esta é a primeira abordagem em direção à nova plataforma. Uma vez que o aplicativo for implantado e executado com êxito, os planos podem ser feitos para atualização dos componentes individuais para uso das novas funções e recursos da JBoss Enterprise Application Plataform 6.

Capítulo 2. Preparação para a Migração

2.1. Preparação para a Migração

Uma vez que o servidor do aplicativo é estruturado de forma diferente da primeira versão, é possível realizar algumas pesquisas e planejamento antes de tentar migrar o seu aplicativo.
  1. Revisão das Novidades e Diferenças no JBoss Enterprise Application Plataform 6

    Diversas modificações foram realizadas neste lançamento que podem impactar na implantação dos aplicativos do JBoss Enterprise Application Plataform 5. Isto inclui modificações à estrutura do diretório do arquivo, configuração da implantação, carregamento da classe e pesquisas JNDI. Consulte a Seção 2.2, “Revisão das Novidades e Diferenças no JBoss Enterprise Application Plataform 6” para maiores detalhes.
  2. Revisão da documentação da Inicialização

    Certifique-se de revisar o capítulo nomeado Get Started Developing Applications no Development Guide para o JBoss Enterprise Application Plataform 6 no https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/. Isto contém informações importantes sobre o seguinte:
    • Java EE 6
    • O novo sistema de carregamento de classe modular
    • Alterações da estrutura do arquivo
    • Como baixar e instalar o JBoss Enterprise Application Plataform 6
    • Como baixar e instalar o JBoss Developer Studio
    • Como configurar o Maven para o seu ambiente de desenvolvimento
    • Como baixar e executar os aplicativo de amostra de iniciação rápida que lançam o produto.
  3. Análise e Entendimento de seu Aplicativo

    Cada aplicativo é único e você deve entender por completo os componentes e a arquitetura do aplicativo existente antes de tentar a migração.

Importante

Antes de realizar quaisquer modificações ao seu aplicativo, certifique-se de criar uma cópia como backup.

2.2. Revisão das Novidades e Diferenças no JBoss Enterprise Application Plataform 6

Introdução

Segue abaixo uma lista das diferenças notáveis de lançamentos anteriores do JBoss Enterprise Application Plataform 6.

Módulo baseado no carregamento da classe
No JBoss Enterprise Application Plataform 5, o carregamento de classe era hereditário. No JBoss Enterprise Application Plataform 6, o carregamento de classe é baseado no JBoss Modules. Isto oferece uma solução de aplicativo verdadeira, ocultando as classes de implementação do servidor e apenas realizando o carregamento às classes que seu aplicativo precisa. O carregamento de classe possui atualmente melhor desempenho. Os aplicativos gravados ao JBoss Enterprise Application Plataform 5 devem ser modificados para especificar as dependências do módulo e em alguns casos, reempacotar os arquivos. Refira-se ao Overview of Class Loading and Modules no capítulo Class Loading and Modules do Development Guide para o JBoss Enterprise Application Plataform 6 no https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.
Gerenciamento do Domain
No JBoss Enterprise Application Plataform 6, o servidor pode ser executado como um servidor autônomo ou num storage domain. Num storage domain, você pode configurar todos os grupos dos servidores de uma só vez, mantendo as configurações sincronizadas por toda a rede de servidores. Enquanto isto não deve impactar os aplicativos construídos, isto pode simplificar o gerenciamento de implantações para servidores múltiplos. Refira-se ao About Managed Domains no Administration and Configuration Guide para o JBoss Enterprise Application Plataform 6 no https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.

Nota

O modo domain não é suportado nos seguintes produtos do JBoss Enterprise:
  • JBoss Portal Platform 6
Configuração da Implantação
Servidores Autônomos e Managed Domains
O JBoss Enterprise Application Plataform 5 usava perfil baseado na configuração de implantação. Esses perfis estavam localizados no diretório EAP_HOME/server/. Os aplicativos sempre continham arquivos de configuração múltiplos para segurança, banco de dados, adaptador de recurso e outras configurações. No JBoss Enterprise Application Plataform 6, a configuração da implantação é feita usando um arquivo. Esse arquivo é usado para configurar todos os serviços e subsistemas usados para a implantação. Um servidor autônomo é configurado usando o arquivo EAP_HOME/standalone/configuration/standalone.xml. Para os servidores executando no storage domain, o servidor é configurado usando o arquivo EAP_HOME/domain/configuration/domain.xml. A informação contida nos arquivos de configuração do JBoss Enterprise Application Plataform 5 deve ser integrada ao novo arquivo de configuração única.
Ordenação das implantações
O JBoss Enterprise Application Plataform 6 usa uma rápida inicialização para a implantação, resultando num desempenho aprimorado e eficiência. Na maioria das vezes, o servidor do aplicativo está apto a determinar as dependências automaticamente com antecedência e escolher a estratégia de implantação mais eficiente. No entanto, os aplicativos do JBoss Enterprise Application Plataform 5, que consistem em módulos múltiplos implantados como EARs e usam pesquisas JNDI de legacia ao invés de injeção CDI ou entradas de referência de recurso, podem requerer alterações de configuração.
Estrutura de Diretório e Scripts
Como mencionado anteriormente, o JBoss Enterprise Application Plataform 6 não usa mais o perfil baseado na configuração da implantação, de forma que não há diretório EAP_HOME/server/. Os arquivos de configuração para servidores autônomos estão localizados no diretório EAP_HOME/standalone/configuration/ e as implantações localizadas no diretório EAP_HOME/standalone/deployments/. Para os servidores executando num storage domain, os arquivos de configuração podem ser encontrados no diretório EAP_HOME/domain/configuration/ e as implantações podem ser encontradas no diretório EAP_HOME/domain/deployments/.
No JBoss Enterprise Application Plataform 5, o script do Linux EAP_HOME/bin/run.sh ou o script do Windows EAP_HOME/bin/run.bat era usado para iniciar o servidor. No JBoss Enterprise Application Plataform 6, o script de iniciação do servidor depende de como você executa o seu servidor. O script do Linux EAP_HOME/bin/standalone.sh ou script do Windows EAP_HOME/bin/standalone.bat é usado para iniciar o servidor autônomo. O script do Linux EAP_HOME/bin/domain.sh ou o script do Windows EAP_HOME/bin/domain.bat é usado para iniciar um storage domain.
Pesquisas JNDI
O JBoss Enterprise Application Plataform 6 usa agora JNDI namespaces portáveis padronizados. Os aplicativos gravados no JBoss Enterprise Application Plataform 5, que usam as pesquisas JNDI, devem ser alterados para seguir a nova convenção de JNDI namespace gerenciado. Para maiores informações sobre a sintaxe de nomeação JNDI, consulte a Seção 3.1.8.2, “Sintaxe de Nomeação JNDI Portável”.
Refira-se ao New and Changed Features in JBoss Enterprise Application Platform 6 no capítulo Get Started Developing Applications do Development Guide para o JBoss Enterprise Application Plataform 6 no https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.

Capítulo 3. Migre seu Aplicativo

3.1. Alterações Requeridas para a maioria dos Aplicativos

3.1.1. Revisão das Alterações Requeridas para a Maioria dos Aplicativosg

As alterações do carregamento da classe e configuração no JBoss Enterprise Application Plataform 6 irão impactar em quase todos os aplicativos. O JBoss Enterprise Application Plataform 6 usa também uma nova sintaxe de nomeação JNDI portável default. Essas alterações irão impactar na maioria dos aplicativos, por isso sugerimos primeiramente a revisão da seguinte informação antes de você migrar seu aplicativo.

3.1.2. Alterações do Carregamento de Classe

3.1.2.1. Atualização do Aplicativo devido às Alterações do Carregamento da Classe

O carregamento da classe modular é uma mudança significativa no JBoss Enterprise Application Plataform 6 e irá impactar em quase todos os aplicativos. Revise a seguinte informação primeiramente quando você migrar o seu aplicativo.
  1. Primeiro, busque pelo empacotamento de seu aplicativo e suas dependências. Consulte a Seção 3.1.2.3, “Atualização das Dependências do Aplicativo devido às Alterações do Carregamento da Classe” para maiores informações.
  2. Caso o seu aplicativo não efetuar o log em registro, você precisará especificar as dependências de módulo corretas. Consulte a Seção 3.1.4.1, “Modificação das Dependências de Registro em Log” para maiores informações
  3. Devido às alterações de carregamento de classe modular, você talvez precise alterar a estrutura do empacotamento de seu EAR ou WAR. Consulte a Seção 3.1.5.1, “Modificação do Empacotamento dos EARS e WARs” para maiores informações.

3.1.2.2. Compreendendo as Dependências de Módulo

Sumário

Um módulo é apenas apto a acessar suas próprias classes e as classes de qualquer módulo pelo qual possui uma dependência explícita ou implícita.

Procedimento 3.1. Compreendendo as Dependências de Módulo

  1. Compreendendo as dependências implícitas

    Os implantadores com o servidor implicitamente automatizado, adicionam algumas das dependências do módulo comumente usadas, como por exemplo javax.api e sun.jdk. Isto faz as classes visíveis à implantação no período de rodagem e libera o desenvolvedor da tarefa de adicionar explicitamente as dependências. Para maiores detalhes de como e quando essas dependências são adicionadas, refira-se ao Implicit Module Dependencies no capítulo nomeado Class Loading and Modules no Development Guide do JBoss Enterprise Application Plataform 6 no https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.
  2. Compreendendo as dependências explícitas

    Para outras classes, os módulos devem ser especificados explicitamente ou as dependências faltantes resultam em erros de implantação ou do período de rodagem. Caso falte uma dependência, você verá traços ClassNotFoundExceptions ou NoClassDefFoundErrors no log do servidor. Caso mais de um módulo efetuar o carregamento ao mesmo JAR ou um módulo efetuar o carregamento numa classe que estende a classe com carregamento por um módulo diferente, você verá traços ClassCastExceptions no log do servidor. Para especificar as dependências, modifique o MANIFEST.MF ou crie um jboss-deployment-structure.xml do arquivo do descritor de implantação específico do JBoss. Para maiores informações sobre as dependências do módulo, refira-se ao Overview of Class Loading and Modules no capítulo chamado Class Loading and Module no Development Guide do JBoss Enterprise Application Plataform 6 no https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.

3.1.2.3. Atualização das Dependências do Aplicativo devido às Alterações do Carregamento da Classe

Sumário

O carregamento de classe no JBoss Enterprise Application Plataform 6 é consideravelmente diferente do que as versões anteriores do JBoss Enterprise Application Plataform. O carregamento de classe é agora baseado no projeto de Módulos do JBoss. Ao invés de um único carregador, carregador de classe hierárquico que carrega todos os JARS num caminho de classe plano, cada biblioteca torna-se um módulo que apenas conecta os módulos extras dos quais ela depende. As implantações no JBoss Enterprise Application Plataform 6 são módulos e não precisam ter acesso às classes que são definidas nos JARs de um servidor de aplicativo a não que uma dependência explicita seja definida nessa classe. Algumas das dependências do módulo definidas pelo servidor do aplicativo são configuradas automaticamente. Por exemplo: caso você esteja implantando um aplicativo Java EE, uma dependência no Java EE API é adicionada automaticamente ou implicitamente. Para uma lista de dependências adicionadas automaticamente pelo servidor, refira-se ao Implicit Module Dependencies no capítulo nomeado Class Loading and Modules no Development Guide para o JBoss Enterprise Application Plataform 6 no https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.

Tarefas

Quando você migrar seu aplicativo ao JBoss Enterprise Application Plataform 6, você pode precisar executar uma ou mais tarefas devido às alterações de carregamento de classe modular:

3.1.3. Alterações do Arquivo de Configuração

3.1.3.1. Criação ou Modificação dos Arquivos que controlam o Controle de Carregamento da Classe no JBoss Enterprise Application Plataform 6

Sumário

Devido à alteração no JBoss Enterprise Application Plataform 6 para uso do carregamento da classe modular, você talvez precise criar ou modificar um ou mais arquivos para adicionar dependências ou para prevenir dependências automáticas de serem carregadas. Para maiores informações sobre o carregamento de classe e a procedência do carregamento de classe, refira-se ao capítulo nomeado Class Loading and Modules no Development Guide para o JBoss Enterprise Application Plataform 6 no https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.

Os seguintes arquivos são usados para controlar o carregamento da classe no JBoss Enterprise Application Plataform 6.
jboss-web.xml
Caso tenha definido um elemento <class-loading> no arquivo jboss-web.xml, você precisará removê-lo. O comportamento que isto causou no JBoss Enterprise Application Plataform 5 é agora o comportamento do carregamento da classe default no JBoss Enterprise Application Plataform 6, portanto não é mais necessário. Caso você não remova mais esse elemento, você verá um ParseError e XMLStreamException no seu log do servidor.
Segue abaixo uma amostra do elemento <class-loading> no arquivo jboss-web.xml que está comentada.
<!DOCTYPE jboss-web PUBLIC
    "-//JBoss//DTD Web Application 4.2//EN"
    "http://www.jboss.org/j2ee/dtd/jboss-web_4_2.dtd">
<jboss-web>  
<!-- 
    <class-loading java2ClassLoadingCompliance="false">
        <loader-repository>
            seam.jboss.org:loader=MyApplication
            <loader-repository-config>java2ParentDelegation=false</loader-repository-config>
        </loader-repository>
    </class-loading>
 -->
 </jboss-web>


MANIFEST.MF
Editado manualmente
Dependendo de quais componentes ou módulos o seu aplicativo usa, você precisa adicionar uma ou mais dependências a este arquivo. Você pode adicioná-las tanto como Dependencies ou como entradas Class-Path.
Segue abaixo uma amostra MANIFEST.MF editada por um desenvolvedor:
Manifest-Version: 1.0
Dependencies: org.jboss.logmanager
Class-Path: OrderManagerEJB.jar

Caso você modifique esse arquivo, certifique-se de incluir um caractere com linha nova no final do arquivo.
Usando o Maven
Caso você use o Maven, você precisa modificar o seu arquivo pom.xml para gerar as dependências para o arquivo MANIFEST.MF. Caso seu aplicativo usar EJB 3.0, você pode possuir uma seção no arquivo pom.xml parecido com o seguinte:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-ejb-plugin</artifactId>
    <configuration>
        <ejbVersion>3.0</ejbVersion>
    </configuration>
</plugin>

Caso o código EJB 3.0 usar o org.apache.commons.log, você precisará daquela dependência no arquivo MANIFEST.MF. Com o objetivo de gerar aquela dependência, adicione o elemento <plugin> ao arquivo pom.xml, conforme abaixo:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-ejb-plugin</artifactId>
    <configuration>
        <ejbVersion>3.0</ejbVersion>
        <archive>
            <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>
        </archive>
    </configuration>
</plugin>

Na amostra acima, o arquivo src/main/resourcres/MANIFEST.MF precisa conter apenas a entrada da dependência:
Dependencies: org.apache.commons.logging
O Maven gerará o arquivo MANIFEST.MF completo:
Manifest-Version: 1.0
Dependencies: org.apache.commons.logging
jboss-deployment-structure.xml
Esse arquivo é um descritor de implantação específico do JBoss que pode ser usado para controlar o carregamento da classe de forma granulada. Assim como o MANIFEST.MF, esse arquivo pode ser usado para adicionar dependência. Isto pode também prevenir que dependências automáticas sejam adicionadas, definir módulos adicionais, alterar o comportamento de carregamento da classe isolado da implantação EAR e adicionar raízes de recurso adicional ao módulo.
Segue abaixo uma amostra do arquivo jboss-deployment-structure.xml que adiciona uma dependência para o módulo JSF 1.2 e previne o carregamento automático do módulo JSF 2.0.
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
  <deployment>
      <dependencies>
        <module name="javax.faces.api" slot="1.2" export="true"/>
              <module name="com.sun.jsf-impl" slot="1.2" export="true"/>
      </dependencies>
  </deployment>
  <sub-deployment name="jboss-seam-booking.war">
    <exclusions>
        <module name="javax.faces.api" slot="main"/>
              <module name="com.sun.jsf-impl" slot="main"/>
      </exclusions>
      <dependencies>
        <module name="javax.faces.api" slot="1.2"/>
              <module name="com.sun.jsf-impl" slot="1.2"/>
      </dependencies>
  </sub-deployment>
</jboss-deployment-structure>
Consulte a Seção 3.1.3.2, “jboss-deployment-structure.xml” para informações adicionais sobre este arquivo.
application.xml
Nas versões anteriores do JBoss Enterprise Application Plataform, você controlou a ordem das implantações com um EAR usando o arquivo jboss-app.xml. Isto não é mais a mesma situação. O Java EE6 spec fornece o elemento <initialize-in-order> no application.xml que permite o controle da ordem pela qual os módulos do Java EE com um EAR são implantados.
Na maioria das vezes, você não precisa especificar a ordem da implantação. Caso o seu aplicativo use injeções de dependência e referências de recurso para referenciar componentes em módulos externos, o elemento <initialize-in-order> não é requerido na maioria das vezes, uma vez que o servidor do aplicativo está apto a determinar implicitamente a maneira correta e ideal de ordenar os componentes.
Vamos assumir que você possui um aplicativo que contém um myBeans.jar e um myApp.war com um myApp.ear. Um servlet no myApp.war@EJB injeta um bean do myBeans.jar. Neste caso, o servidor do aplicativo possui um conhecimento apropriado para certificar-se de que o componente EJB está disponível antes do servlet ser iniciado e você não necessitar usar o elemento <initialize-in-order>.
No entanto, caso o servlet usar referências remotas de estilo de pesquisa JNDI de legacia como o seguinte para acesso ao bean, você poderá especificar a ordem do módulo.
init() {
  Context ctx = new InitialContext();
  ctx.lookup("TheBeanInMyBeansModule");
}
Neste caso, o servidor não está apto a determinar que o componente EJB está no myBeans.jar e você precisa reforçar que os componentes no myBeans.jar são inicializados e ativados antes dos componentes no myApp.war. Para isto, você configura o elemento <initialize-in-order> para true e especifica a ordem dos módulos myBeans.jar e myApp.war no arquivo application.xml.
Segue abaixo uma amostra que usa o elemento <initialize-in-order> para controlar a ordem de implantação. O myBeans.jar é implantado antes do arquivo myApp.war.
<application xmlns="http://java.sun.com/xml/ns/javaee" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="6"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
             http://java.sun.com/xml/ns/javaee/application_6.xsd">
    <application-name>myApp</application-name>
    <initialize-in-order>true</initialize-in-order>
    <module>
        <ejb>myBeans.jar</ejb>
    </module>
    <module>
        <web>
            <web-uri>myApp.war</web-uri>
            <context-root>myApp</context-root>
        </web>
    </module>
</application>
O esquema para o arquivo application.xml pode ser encontrado no http://java.sun.com/xml/ns/javaee/application_6.xsd.

Nota

Você deve estar ciente que a configuração do elemento <initialize-in-order> para true reduz a velocidade da implantação. É preferível definir as dependências de maneira apropriada usando injeções de dependência ou referências de recurso, uma vez que isto permite o contêiner maior flexibilidade na implantações ideais.
jboss-ejb3.xml
O descritor da implantaçãojboss-ejb3.xml substitui o descritor da implantação jboss.xml para substituir e adicionar os recursos fornecidos pelo Java Enterprise Edition (EE - Edição Java Enterprise) definido pelo descritor de implantação ejb3-jar.xml. O novo arquivo é incompatível com o jboss.xml e o jboss.xml é agora ignorado nas implantações.
login-config.xml
O arquivo login-config.xml não é mais usado para a configuração de segurança. A segurança é agora configurada no elemento <security-domain> no arquivo de configuração do servidor. Para um servidor autônomo, este é o arquivo standalone/configuration/standalone.xml. Caso você esteja executando o seu servidor num storage domain, esse é o arquivo domain/configuration/domain.xml.

3.1.3.2. jboss-deployment-structure.xml

O jboss-deployment-structure.xml é um novo descritor de implantação opcional para o JBoss Enterprise Application Plataform 6. Este descritor de implantação fornece controle sobre o carregamento da classe na implantação.
O esquema para este descritor de implantação é o EAP_HOME/docs/schema/jboss-deployment-structure-1_2.xsd

3.1.3.3. Recursos de Pacote para o Novo Sistema de Carregamento de Classe Modular

Sumário

Nas versões anteriores do JBoss Enterprise Application Plataform, todos os recursos dentro do diretório WEB-INF/ foram adicionados ao caminho de classe WAR. No JBoss Enterprise Application Plataform 6, os artefatos do aplicativo da web são apenas carregados a partir dos diretórios WEB-INF/classes e WEB-INF/lib. A falha em empacotar os artefatos do aplicativo nas localizações especificadas pode resultar em ClassNotFoundException, NoClassDefError ou outros erros do período de execução.

Para resolver esses erros de carregamento da classe, você deverá modificar a estrutura de seu arquivo do aplicativo ou definir um módulo personalizado.

Modificação do Empacotamento de Recurso
Para disponibilizar os recursos apenas para o aplicativo, você deve empacotar os arquivos de propriedades, JARs e outros artefatos com WAR, movendo-os ao diretório WEB-INF/classes/ ou WEB-INF/lib/. Essa abordagem está descrita com maiores detalhes na: Seção 3.1.3.4, “Alteração da Localização das Propriedades ResourceBundle”
Criação de um Módulo Personalizado
Caso deseje disponibilizar recursos personalizados a todos os aplicativos executando no servidor do JBoss Enterprise Application Plataform, você deverá criar um módulo personalizado. Essa abordagem está descrita em maiores detalhes na Seção 3.1.3.5, “Criação de um Módulo Personalizado”

3.1.3.4. Alteração da Localização das Propriedades ResourceBundle

Sumário

Nas versões anteriores do JBoss Enterprise Application Plataform, o diretório EAP_HOME/server/SERVER_NAME/conf/ estava no classpath e disponível ao aplicativo. Para disponibilizar as propriedades ao caminho da clase do aplicativo no JBoss Enterprise Application Plataform 6, você deve empacotá-las com seu aplicativo.

Procedimento 3.2. 

  1. Caso esteja implantando um arquivo WAR, você deve empacotar essas propriedades na pasta WEB-INF/classes/ do WAR.
  2. Caso deseje disponibilizar essas propriedades a todos os componentes num EAR, você deve empacotá-las à raiz do JAR na pasta lib/ do EAR.

3.1.3.5. Criação de um Módulo Personalizado

O seguinte procedimento descreve como criar um módulo personalizado com o objetivo de criar arquivos de propriedades e outros recursos disponíveis a todos os aplicativos sendo executados no servidor do JBoss Enterprise Application Plataform.

Procedimento 3.3. Criação de um Módulo Personalizado

  1. Crie e preencha a estrutura do diretório module/.
    1. Crie uma estrutura de diretório sob o diretório EAP_HOME/module para conter os arquivos e JARs. Por exemplo:
      $ cd EAP_HOME/modules/ $ mkdir -p myorg-conf/main/properties
      
      
    2. Mova os arquivos de propriedades ao diretório EAP_HOME/modules/myorg-conf/main/properties/ criado na etapa anterior.
    3. Crie um arquivo module.xml no diretório EAP_HOME/modules/myorg-conf/main/ contendo o seguinte XML:
      <module xmlns="urn:jboss:module:1.1" name="myorg-conf">
          <resources>
              <resource-root path="properties"/>
          </resources>
      </module>
      
      
  2. Modifique o subsistema ee no arquivo de configuração do servidor. Você pode usar o JBoss CLI ou pode editar manualmente o arquivo.
    • Siga as seguintes etapas para modificar o arquivo de configuração do servidor usando o JBoss CLI.
      1. Inicie o servidor e conecte-se ao Gerenciamento CLI.
        • Insira a seguinte linha de comando para o Linux:
          $ EAP_HOME/bin/jboss-cli.sh --connect
          $ Connected to standalone controller at localhost:9999
          
        • Insira a seguinte linha de comando para o Windows:
          C:\>EAP_HOME\bin\jboss-cli.bat --connect
          C:\> Connected to standalone controller at localhost:9999
          
      2. Para criar o elemento myorg-conf<global-modules> no subsistema ee, digite o seguinte na linha de comando:
        /subsystem=ee:write-attribute(name=global-modules, value=[{"name"=>"myorg-conf","slot"=>"main"}])
        
        Você deverá ver o seguinte resultado:
        {"outcome" => "success"}
        
    • Siga essas etapas caso prefira editar manualmente o arquivo da configuração do servidor.
      1. Interrompa o servidor e abra o arquivo de configuração do servidor num editor de texto. Caso você esteja executando um servidor autônomo, este é o arquivo EAP_HOME/standalone/configuration/standalone.xml ou caso esteja executando um storage domain, o arquivo é o EAP_HOME/domain/configuration/domain.xml.
      2. Encontre o subsistema ee e adicione o módulo global para myorg-conf. Segue abaixo uma amostra do elemento do subsistema ee modificado para inclusão do elemento myorg-conf:
        <subsystem xmlns="urn:jboss:domain:ee:1.0" >            
            <global-modules>
                <module name="myorg-conf" slot="main" />            
            </global-modules>
        </subsystem>
        
        
  3. Assumindo que você copiou um arquivo nomeado my.properties à localização de módulo correta, você poderá agora carregar os arquivos de propriedades usando o código similar ao seguinte:
    Thread.currentThread().getContextClassLoader().getResource("my.properties");
    

3.1.4. Alterações do Registro em Log

3.1.4.1. Modificação das Dependências de Registro em Log

Sumário

O JBoss LogManager suporta front ends para todos os frameworks de registro em log, de forma que você pode manter seu código de registro de log atual ou mover à nova infraestrutura de registro de log do JBoss. Independente de sua decisão, devido às alterações de carregamento de classe modular, você precisará provavelmente modificar seu aplicativo para adicionar as dependências requeridas.

3.1.4.2. Atualização do Código do Aplicativo para Frameworks de Registro de Log de Terceiros

Sumário

No JBoss Enterprise Application Plataform 6, as dependências de registro em log para frameworks de terceiros comuns como o Apache Commons Logging, Apache log4j, SLF4J e Java Logging são adicionados por default. No entanto, caso você esteja usando o log4j e você não deseja usar o subsistema de registro em log para configurar seus manuseadores (anexadores), você precisa excluir o módulo do log4j do JBoss Enterprise Application Plataform.

Procedimento 3.5. Configuração do JBoss Enterprise Application Plataform 6 para uso de um arquivo log4j.properties ou log4j.xml

  1. Criação de um jboss-deployment-structure.xml com o seguinte conteúdo:
    <jboss-deployment-structure>
        <deployment>
            <!-- Exclusions allow you to prevent the server from automatically adding some dependencies -->
            <exclusions>
                <module name="org.apache.log4j" />
            </exclusions>
        </deployment>
    </jboss-deployment-structure>
    
    
  2. Posicione o arquivo jboss-deployment-structure.xml tanto no diretório META-INF/ ou diretório WEB-INF/, caso esteja implantando um WAR ou no diretório META-INF/, caso você esteja implantando um EAR.
  3. Adicione o arquivo log4j.properties ou log4j.xml no diretório lib/ de seu EAR ou no diretório WEB-INF/classes/ de sua implantação WAR.
  4. Implante seu aplicativo.

Nota

Caso você deseje usar o arquivo de configuração log4j, você não estará mais apto à alterar a configuração do registro de log log4j no período de execução.

3.1.4.3. Modificação do Código para Uso do Novo Framework de Registro de Log do JBoss

Sumário

Para usar o novo framework, altere suas importações e código conforme abaixo:

Procedimento 3.6. Modifique o Código e Dependências para Uso do JBoss logging Framework

  1. Alteração de suas importações e código de registro em log

    Segue abaixo uma amostra do código que usa o novo framework do JBoss Logging:
    import org.jboss.logging.Level;
    import org.jboss.logging.Logger;
    
    private static final Logger logger = Logger.getLogger(MyClass.class.toString());
    
    if(logger.isTraceEnabled()) {
        logger.tracef("Starting...", subsystem);
    }
    
  2. Adição de dependência de registro em log

    O JAR contendo as classes do JBoss Logging está localizado no módulo nomeado org.jboss.logging. O seu arquivo MANIFEST-MF deve parecer com o seguinte:
    Manifest-Version: 1.0
    Dependencies: org.jboss.logging
    

3.1.5. Alterações do Empacotamento do Aplicativo

3.1.5.1. Modificação do Empacotamento dos EARS e WARs

Sumário

Quando você migrar seu aplicativo, você pode ter que alterar a estrutura de empacotamento de seu EAR ou WAR devido à alteração do carregamento da classe modular. As dependências de módulo contém o carregamento em ordem específica:

  1. Dependências do sistema
  2. Dependências do Usuário
  3. Recursos Locais
  4. Dependências inter-implantadas

Procedimento 3.7. Modificação do empacotamento do arquivo

  1. Empacotamento do WAR

    O WAR é um módulo único e todas as classes no WAR são carregados com a mesmo carregador de classe. Isto significa que as classes empacotadas no diretório WEB-INF/lib/ são tratadas da mesma forma que as classes no diretório WEB-INF/classes.
  2. Empacotamento de um EAR

    Um EAR consiste de módulos múltiplos. O diretório EAR/lib/ é um módulo único e cada WAR ou sub-implantação jar EJB com EAR é um módulo separado. As classes não possuem acesso às classes em outros módulos com o EAR, a não ser que as dependências tenham sido definidas. As sub-implantações sempre possuem uma dependência automática no módulo pai que as fornecem acesso às classes no diretório EAR/lib/. No entanto, as sub-implantações nem sempre possuem uma dependência automática para permiti-las acessar-se entre si. Este comportamento é controlado pela configuração do elemento <ear-subdeployments-isolated> na configuração do subsistema ee, conforme abaixo:
    <subsystem xmlns="urn:jboss:domain:ee:1.0" >            
      <ear-subdeployments-isolated>false</ear-subdeployments-isolated>
    </subsystem>
    
    Por default, isto é configurado para falso, permitindo que as sub-implantações vejam as classes pertencentes a demais sub-implantações com o EAR.
    Para maiores informações sobre o carregamento da classe, refira-se ao capítulo Class Loading and Modules no Development Guide para o JBoss Enterprise Application Plataform 6 no https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.

3.1.6. Alterações da Configuração do Adaptador de Recurso e Fonte de Dados

3.1.6.1. Atualização do Aplicativo devido às Alterações da Configuração

No JBoss Enterprise Application Plataform 5, os serviços e subsistemas foram configurados em diversos arquivos diferentes. No JBoss Enterprise Application Plataform 6, a configuração é agora realizada basicamente em um arquivo. Caso o seu aplicativo usar qualquer um dos recursos ou serviços, as alterações da configuração podem ser necessárias.
  1. Caso o seu aplicativo usar uma fonte de dados, consulte a Seção 3.1.6.2, “Atualização da Configuração da Fonte de Dados”.
  2. Caso o seu aplicativo usar JPA e empacotar o Hibernate JARs, consulte abaixo as opções de migração na Seção 3.1.6.4, “Configuração da Fonte de Dados para o Hibernate ou JPA”.
  3. Caso o seu aplicativo usar um adaptador de recurso, consulte a Seção 3.1.6.5, “Atualização da Configuração do Adaptador de Recurso”.
  4. Revise abaixo as informações de como configurar as alterações para segurança básica na Seção 3.1.7.1, “Configuração das Alterações de Segurança do Aplicativo”.

3.1.6.2. Atualização da Configuração da Fonte de Dados

Sumário

Nas versões anteriores do JBoss Enterprise Application Plataform, a configuração da fonte de dados JCA foi definida num arquivo com sufixo *-ds.xml. Esse arquivo foi implantado no diretório deploy/ do servidor ou empacotado com o aplicativo. O driver JDBC foi copiado ao diretório server/lib/ ou empacotado no diretório WEB-INF/lib/ do aplicativo. Enquanto esse método de configuração de fonte de dados não é suportado para o desenvolvimento, ele não é recomendado para produção uma vez que ele não é suportado pelas ferramentas de gerenciamento e administrativa do JBoss.

No JBoss Enterprise Application Plataform 6, a fonte de dados é configurada no arquivo de configuração do servidor. Caso a instância do JBoss Enterprise Application Plataform estiver sendo executada num storage domain, a fonte de dados é configurada no arquivo domain/configuration/domain.xml. Caso a instância do JBoss Enterprise Application Plataform estiver sendo executada como servidor autônomo, a fonte de dados é configurada no standalone/configuration/standalone.xml file. As fontes de dados configuradas dessa maneira podem ser gerenciadas e controladas usando as interfaces de gerenciamento do JBoss, incluindo o Web Management Console e a interface da linha de comando (CLI). Essas ferramentas facilitam o gerenciamento de implantações e configuram servidores múltiplos sendo executados no storage domain.
A seguinte seção descreve como modificar sua configuração de fonte de dados, de forma que ela pode ser gerenciada e suportada pelas ferramentas de gerenciamento disponíveis.
Migração para uma Configuração de Fonte de Dados Gerenciável para o JBoss Enterprise Application Plataform 6

Um driver compatível com JDBC 4.0 pode ser instalado como implantação ou como módulo core. Um driver que é compatível com o JDBC 4.0 contém um arquivo META-INF/services/java.sql.Driver que especifica o nome da classe do driver. Um driver que não é compatível com o JDBC 4.0 requer etapas adicionais. Para maiores detalhes de como fazer um driver compatível com o JDBC 4.0 e como atualizar sua configuração de fonte de dados atual para uma gerenciável pelo Web Management Console e CLI, consulte a Seção 3.1.6.3, “Instalação e Configuração do JDBC Driver”.

Caso seu aplicativo usar Hibernate ou JPA, ele poderá requerer alterações adicionais. Consulte a Seção 3.1.6.4, “Configuração da Fonte de Dados para o Hibernate ou JPA” para maiores informações.
Use a Ferramenta de Migração IronJacamar para Converter os Dados de Configuração

Você pode consultar a Seção 4.1.6, “Uso da Ferramenta IronJacamar para Migração da Fonte de Dados e Configurações do Adaptador de Recurso”. Essa ferramenta converte os arquivos de configuração do estilo *-ds.xml ao formato esperado pelo JBoss Enterprise Application Plataform 6.

3.1.6.3. Instalação e Configuração do JDBC Driver

Sumário

O JDBC driver pode ser instalado no contêiner em uma das duas seguintes maneiras:

  • como implantação
  • como módulo core
Os aspectos positivos e negativos de cada abordagem estão descritos abaixo.

No JBoss Enterprise Application Plataform 6, a fonte de dados é configurada no arquivo de configuração do servidor. Caso a instância do JBoss Enterprise Application Plataform estiver sendo executada num storage domain, a fonte de dados é configurada no arquivo domain/configuration/domain.xml. Caso a instância do JBoss Enterprise Application Plataform estiver sendo executada como um servidor autônomo, a fonte de dados é configurada no arquivo standalone/configuration/standalone.xml. A informação da referência do esquema, que é a mesma em ambos os modos, pode ser encontrada no diretório doc/ de instalação do JBoss Enterprise Application Plataform 6. Para propósitos desta discussão, assuma que o servidor está sendo executado como servidor autônomo e a fonte de dados está configurada no arquivo standalone.xml.

Procedimento 3.8. Instalação e Configuração do JDBC Driver

  1. Instalação do JBBC Driver

    1. Instale o JDBC Driver como uma implantação

      Esta é a maneira recomendada para instalar o driver. Quando o JDBC driver for instalado como uma implantação, ele é implantado como um JAR regular. Caso a instância do JBoss Enterprise Application Plataform estiver sendo executada como um servidor autônomo, copie o JDBC 4.0 compatível ao JAR no diretório EAP_HOME/standalone/deployments/. Caso o servidor estiver sendo executado num storage domain, copie o JAR ao diretório EAP_HOME/domain/deployments/.
      Segue abaixo uma amostra de um MySQL JDBC driver instalado como implantação ao servidor autônomo:
      $cp mysql-connector-java-5.1.15.jar EAP_HOME/standalone/deployments/
      Qualquer driver compatível com JDBC 4.0 é automaticamente reconhecido e instalado no sistema pelo nome e versão. Um JAR compatível com JDBC 4.0 contém um texto com arquivo nomeado META-INF/services/java.sql.Driver que especifica o(s) nome(s) da classe do driver. Caso o driver não for compatível com o JDBC 4.0, ele pode ser implantável em uma das seguintes maneiras:
      • Crie e adicione o arquivo java.sql.Driver ao JAR sob o caminho META-INF/services/. Esse arquivo deve conter o nome de classe do driver, por exemplo:
        com.mysql.jdbc.Driver
      • Crie um arquivo java.sql.Driver no diretório de implantação. Para uma instância do JBoss Enterprise Application Plataform 6 sendo executada como servidor autônomo, o arquivo deve ser posicionado aqui: EAP_HOME/standalone/deployments/META-INF/services/java.sql.Driver. Caso o servidor estiver num storage domain, o arquivo deve ser posicionado aqui: EAP_HOME/domain/deployments/META-INF/services/java.sql.Driver.
      Os aspectos positivos desta abordagem são:
      • Este é o método mais simples uma vez que não há necessidade de definir um módulo.
      • Quando o servidor estiver executando num storage domain, as implantações que usam esta abordagem são propagadas automaticamente a todos os servidores no domain. Isto significa que o administrador não precisa distribuir o driver JAR manualmente.
      Os aspectos negativos desta abordagem são:
      • Caso o JDBC driver consistir de mais de um JAR, por exemplo o driver JAR mais um JAR com licença independente ou JAR de localização, você não pode instalar o driver como uma implantação. Você deve instalar o JDBC driver como um módulo core.
      • Caso o driver não for compatível com o JDBC 4.0, um arquivo deve ser criado contendo o(s) nome(s) da classe do driver e deve ser importado num JAR ou sobreposto no diretório deployments/.
    2. Instale o JDBC Driver como módulo core

      Para instalar um JDBC driver como um módulo core, você deve criar uma estrutura do caminho do arquivo sob o diretório EAP_HOME/modules/. Esta estrutura contém o JDBC driver JAR, qualquer licença do fornecedor adicional ou JARs de localização e um arquivo module.xml para definir o módulo.
      • Instale o MySQL JDBC Driver como módulo core

        1. Crie uma estrutura de diretório EAP_HOME/modules/com/mysql/main/
        2. No subdiretório main/, crie um arquivo module.xml contendo a seguinte definição do módulo para o MySQL JDBC driver:
          <?xml version="1.0" encoding="UTF-8"?>
          <module xmlns="urn:jboss:module:1.0" name="com.mysql">
          <resources>
              <resource-root path="mysql-connector-java-5.1.15.jar"/>
          </resources>
          <dependencies>
              <module name="javax.api"/>
          </dependencies>
          </module>
          
          
          
          O nome do módulo, "com.mysql", coincide com a estrutura do diretório para esse módulo. O elemento <dependencies> é usado para especificar as dependências do módulo em outros módulos. Neste caso, como é o caso em todas as fontes de dados JDBC, isto é dependente do Java JDBC APIs que é definido em outro módulo nomeado javax.api. Este módulo está localizado sob o diretório modules/system/layers/base/javax/api/main/.

          Nota

          Certifique-se de que você NÃO possui espaço no início do arquivo module.xml ou você obterá um erro "New missing/unsatisfied dependencies" para este driver.
        3. Copie o MySQL JDBC driver JAR ao diretório EAP_HOME/modules/com/mysql/main/:
          $ cp mysql-connector-java-5.1.15.jar EAP_HOME/modules/com/mysql/main/
      • Instale o IBM DB2 JDBC driver e licença JAR como um módulo core

        Esta amostra é fornecida para apenas demonstrar como implantar drivers que requerem JARs além do JDBC Driver JAR.
        1. Crie a estrutura do diretório EAP_HOME/modules/com/ibm/db2/main/.
        2. No subdiretório main/ crie um arquivo module.xml contendo a seguinte definição do módulo para o IBM DB2 JDBC driver e licença:
          <?xml version="1.0" encoding="UTF-8"?>
          <module xmlns="urn:jboss:module:1.1" name="com.ibm.db2">
            <resources>
              <resource-root path="db2jcc.jar"/>
              <resource-root path="db2jcc_license_cisuz.jar"/>
            </resources>
            <dependencies>
              <module name="javax.api"/>
              <module name="javax.transaction.api"/>
            </dependencies>
          </module>
          
          

          Nota

          Certifique-se de que você NÃO possui espaço no início do arquivo module.xml ou você obterá um erro "New missing/unsatisfied dependencies" para este driver.
        3. Copie o JDBC driver e a licença JAR ao diretório EAP_HOME/modules/com/ibm/db2/main/.
          $ cp db2jcc.jar EAP_HOME/modules/com/ibm/db2/main/
          $ cp db2jcc_license_cisuz.jar EAP_HOME/modules/com/ibm/db2/main/
      Os aspectos positivos desta abordagem são:
      • Esta é a única abordagem que funciona quando o JDBC driver consiste de mais de um JAR.
      • Com esta abordagem, os drivers que não são compatíveis com o JDBC 4.0 podem ser instalados sem modificar o driver JAR ou criando uma sobreposição de arquivo.
      Os aspectos negativos desta abordagem são:
      • É mais difícil configurar um módulo.
      • O módulo deve ser manualmente copiado para cada servidor executando num storage domain.
  2. Configuração da fonte de dados

    1. Adição do driver do banco de dados

      Adicione o elemento <driver> ao elemento <drivers> de mesmo arquivo. Isto contém algumas das informações que foram definidas anteriormente no arquivo *-ds.xml.
      Primeiro determine se o driver JAR é compatível com o JDBC 4.0. Um JAR que é compatível com o JDBC 4.0 contém um arquivo META-INF/services/java.sql.Driver que especifica o nome de classe do driver. O servidor usa este arquivo para encontrar o nome da(s) classe(s) de driver no JAR. Um driver que é compatível com o JDBC 4.0 não requer um elemento <driver-class>, uma vez que ele já está especificado no JAR. Esta é uma amostra do elemento do driver para um JDBC 4.0 compatível com o driver MySQL:
      <driver name="mysql-connector-java-5.1.15.jar" module="com.mysql"/>
      
      Um driver que não seja compatível com o JDBC 4.0 requer um atributo <driver-class> para identificar a classe do driver desde que não haja um arquivo META-INF/services/java.sql.Driver que especifique o nome da classe do driver. Segue abaixo uma amostra do elemento driver para o driver não compatível com o JDBC 4.0:
      <driver name="mysql-connector-java-5.1.15.jar" module="com.mysql"><driver-class>com.mysql.jdbc.Driver</driver-class></driver>
      
      
    2. Criação da fonte de dados

      Crie um elemento <datasource> na seção <datasources> do arquivo standalone.xml. Este arquivo contém bastante informações da fonte de dados anteriormente definida no arquivo *-ds.xml.

      Importante

      Você deve interromper o servidor antes de editar o arquivo de configuração do servidor para a sua alteração ser persistente na iniciação do servidor.
      Segue abaixo uma amostra de um elemento de fonte de dados MySQL no arquivo standalone.xml:
      <datasource jndi-name="java:/YourDatasourceName" pool-name="YourDatasourceName">
        <connection-url>jdbc:mysql://localhost:3306/YourApplicationURL</connection-url>
        <driver>mysql-connector-java-5.1.15.jar</driver>
        <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
        <pool>
          <min-pool-size>100</min-pool-size>
          <max-pool-size>200</max-pool-size>
        </pool>
        <security>
          <user-name>USERID</user-name>
          <password>PASSWORD</password>
        </security>
        <statement>
          <prepared-statement-cache-size>100</prepared-statement-cache-size>
          <share-prepared-statements/>
        </statement>
      </datasource>
      
      

3.1.6.4. Configuração da Fonte de Dados para o Hibernate ou JPA

Caso o seu aplicativo usar o JPA e empacotar atualmente JBoss JARss, você deverá usar o Hibernate que está incluso com o JBoss Enterprise Application Plataform 6. Para uso dessa versão do Hibernate, você deve remover o pacote antigo do Hibernate de seu aplicativo.

Procedimento 3.9. Remoção do pacote Hibernate

  1. Remova o Hibernate JARs de suas pastas da biblioteca do aplicativo.
  2. Remova ou comente o elemento <hibernate.transaction.manager_lookup_class> em seu arquivo persistence.xml uma vez que este elemento não é necessário.

3.1.6.5. Atualização da Configuração do Adaptador de Recurso

Sumário

Nas versões anteriores do servidor do aplicativo, a configuração do adaptador do recurso era definido num arquivo com um sufixo *-ds.xml. No JBoss Enterprise Application Plataform 6, o adaptador de recurso é configurado no arquivo de configuração do servidor. Caso você esteja rodando num storage domain, o arquivo de configuração é o arquivo EAP_HOME/domain/configuration/domain.xml. Caso você esteja rodando como um servidor autônomo, configure o adaptador de recurso no arquivo EAP_HOME/standalone/configuration/standalone.xml. A informação da referência do esquema, que é a mesma para ambos os módulos, pode ser encontrada no Resource adapter descriptors.

Importante

Você deve interromper o servidor antes de editar o arquivo de configuração do servidor para a sua alteração ser persistente na iniciação do servidor.
Definição do adaptador de recurso

A informação do descritor do adaptador de recurso está definida no elemento do seguinte subsistema no arquivo de configuração do servidor:

<subsystem xmlns="urn:jboss:domain:resource-adapters:1.0"/>
Você usará algumas das informações definidas anteriormente no arquivo *-ds.xml do adaptador de recurso.

Segue abaixo uma amostra do elemento do adaptador de recurso no arquivo de configuração do servidor:
<resource-adapters>
  <resource-adapter>
    <archive>multiple-full.rar</archive>
    <config-property name="Name">ResourceAdapterValue</config-property>
    <transaction-support>NoTransaction</transaction-support>
    <connection-definitions>
      <connection-definition
      class-name="org.jboss.jca.test.deployers.spec.rars.multiple.MultipleManagedConnectionFactory1"
      enabled="true" jndi-name="java:/eis/MultipleConnectionFactory1"
      pool-name="MultipleConnectionFactory1">
    <config-property name="Name">MultipleConnectionFactory1Value</config-property>
      </connection-definition>
      <connection-definition
      class-name="org.jboss.jca.test.deployers.spec.rars.multiple.MultipleManagedConnectionFactory2"
      enabled="true" jndi-name="java:/eis/MultipleConnectionFactory2"
      pool-name="MultipleConnectionFactory2">
    <config-property name="Name">MultipleConnectionFactory2Value</config-property>
      </connection-definition>
    </connection-definitions>
    <admin-objects>
      <admin-object
      class-name="org.jboss.jca.test.deployers.spec.rars.multiple.MultipleAdminObject1Impl"
      jndi-name="java:/eis/MultipleAdminObject1">
    <config-property name="Name">MultipleAdminObject1Value</config-property>
      </admin-object>
      <admin-object class-name="org.jboss.jca.test.deployers.spec.rars.multiple.MultipleAdminObject2Impl"
      jndi-name="java:/eis/MultipleAdminObject2">
    <config-property name="Name">MultipleAdminObject2Value</config-property>
      </admin-object>
      </admin-objects>
  </resource-adapter>
</resource-adapters>

3.1.7. Alterações de Segurança

3.1.7.1. Configuração das Alterações de Segurança do Aplicativo

Configure a segurança para a autenticação básica

O UsersRolesLoginModule sempre bloqueava os arquivos das propriedades no classpath. Nas versões anteriores do JBoss Enterprise Application Plataform, os arquivos das propriedades posicionados no diretório EAP_HOME/server/SERVER_NAME/conf/ encontravam-se no classpath e podiam ser facilmente encontrados pelo UsersRolesLoginModule. No JBoss Enterprise Application Plataform 6, a estrutura do diretório foi alterada. Os arquivos das propriedades devem ser empacotados com o aplicativo e disponibilizá-los na classpath.

Importante

Você deve interromper o servidor antes de editar o arquivo de configuração do servidor para a sua alteração ser persistente na iniciação do servidor.
Para configurar a segurança para uma autenticação básica, adicione um novo security domain sob o security-domains para o standalone/configuration/standalone.xml ou o arquivo de configuração do servidor domain/configuration/domain.xml:
<security-domain name="example">
    <authentication>
        <login-module code="UsersRoles" flag="required">
            <module-option name="usersProperties" 
                    value="${jboss.server.config.dir}/example-users.properties"/>
            <module-option name="rolesProperties" 
                    value="${jboss.server.config.dir}/example-roles.properties"/>
        </login-module>
    </authentication>
</security-domain>
Caso a instância do JBoss Enterprise Application Plataform 6 estiver sendo executada como um servidor autônomo, o ${jboss.server.config.dir} refere-se ao diretório EAP_HOME/standalone/configuration/. Caso a instância estiver executando num managed domain, o ${jboss.server.config.dir} refere-se ao diretório EAP_HOME/domain/configuration/.
Modificação dos nomes do security domain

Os security domains não usam mais o prefixo java:/jaas/ no JBoss Enterprise Application Plataform 6.

  • Você deve remover esse prefixo das configurações do security domain para os aplicativos da Web no jboss-web.xml.
  • Você deve remover esse prefixo das configurações do security domain para os aplicativos Enterprise no jboss-web.xml. Esse arquivo foi substituído pelo jboss.xml no JBoss Enterprise Application Plataform 6.

3.1.8. Alterações JNDI

3.1.8.1. Atualização dos Nomes JNDI Namespace do Aplicativo

Sumário

O EJB 3.1 introduziu um JNDI namespace global padronizado e uma série de namespaces que mapeiam vários escopos do aplicativo Java EE. Os três namespaces JNDI usados para pesquisas JNDI portáveis são java:global, java:module e java:app. Os aplicativos que usam as pesquisas JNDI devem ser alterados para seguir uma nova convenção de JNDI namespace padronizado.

Amostra de Mapeamentos JNDI

As amostras de espaços de nome JNDI dos lançamentos anteriores e como eles são especificados no JBoss Enterprise Application Plataform 6 podem ser encontradas na: Seção 3.1.8.5, “Amostras do JNDI Namespaces nas Versões Anteriores e como elas são especificadas no JBoss Enterprise Application Plataform.”

3.1.8.2. Sintaxe de Nomeação JNDI Portável

Sumário

Existem quatro namespaces lógicos, cada um com o seu próprio escopo. Três desses namespaces são usados para pesquisas JNDI portáveis. A seguinte tabela descreve quando e como usar cada namespace.

Tabela 3.1. Namespaces JNDI Portáveis

JNDI Namespace Descrição
java:global
Os nomes neste namespace são compartilhados em todos os aplicativos implantados numa instância do servidor do aplicativo. Use nomes no namespace para encontrar os EJBs remotos.
Segue abaixo uma amostra do java:global namespace: java:global/jboss-seam-booking/jboss-seam-booking.jar/HotelBookingAction
java:module
Os nomes neste namespace são compartilhados por todos os componentes num módulo, por exemplo: todos os enterprise beans num módulo EJB único ou todos os componentes num módulo da web.
Segue abaixo uma amostra do java:module namespace: java:module/HotelBookingAction!org.jboss.seam.example.booking.HotelBooking
java:app
Os nomes neste namespace são compartilhados por todos os componentes num aplicativo único. Por exemplo, um WAR e um arquivo EJB jar no mesmo arquivo EAR teria acesso recursos no java:app namespace.
Segue abaixo uma amostra do java:app namespace: java:app/jboss-seam-booking.jar/HotelBookingAction
Você pode encontrar maiores informações sobre os contextos de nomeação JNDI na seção EE.5.2.2, "Application Component Environment Namespaces" no "JSR 316: JavaTM Platform, Enterprise Edition (Java EE) Specification, v6". Você pode baixar a especificação a partir do http://jcp.org/en/jsr/detail?id=316

3.1.8.3. Revisão das Regras JNDI Namespace

Sumário

O JBoss Enterprise Application Plataform 6 aprimorou os nomes do JNDI namespace, não apenas para fornecer regras consistentes e premeditadas para cada nome limitado no servidor do aplicativo, mas também para prevenir problemas futuros de compatibilidade. Isto significa que você poderá ter problemas com os namespaces atuais no seu aplicativo, caso eles não seguirem as novas regras.

Os namespaces devem seguir as seguintes regras:

  1. Os nomes relativos não qualificados como o DefaultDS ou jdbc/DefaultDS devem ser relativamente qualificados para o java:comp/env, java:module/env ou java:jboss/env, dependendo do contexto.
  2. Os nomes absolute não qualificados como /jdbc/DefaultDS devem ser relativamente qualificados a um nome java:jboss/root.
  3. Os nomes absolute qualificados como o java:/jdbc/DefaultDS devem ser qualificados da mesma forma que os nomes absolute não qualificados acima.
  4. O espaço do nome java:jboss especial é compartilhado por toda a instância do servidor AS.
  5. Qualquer nome relative com o prefixo java: deve estar em um dos cinco espaços do nome: comp, module, app, global ou jboss proprietário. Qualquer nome começando com java:xxx onde xxx não combina com nenhum dos cinco acima e resultaria num erro de nome inválido.

3.1.8.4. Modificação do Aplicativo para Seguir as Novas Regras do JNDI Namespace (Espaço do Nome JNDI)

  • Segue abaixo uma amostra da pesquisa JNDI no JBoss Enterprise Application Plataform 5.1. Este código é normalmente encontrado num método de inicialização.
    private ProductManager productManager;
    try {
        context = new InitialContext();
        productManager = (ProductManager) context.lookup("OrderManagerApp/ProductManagerBean/local");
    } catch(Exception lookupError) {
        throw new ServletException("Unable to find the ProductManager bean", lookupError);
    }
    
    Note que o nome de pesquisa é OrderManagerApp/ProductManagerBean/local.
  • Segue abaixo uma amostra de como a mesma pesquisa pode ser codificada no JBoss Enterprise Application Plataform 6.
    @EJB(lookup="java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager")
    private ProductManager productManager;
    
    Os valores de pesquisa são definidos como variáveis do associado e usam o novo nome java:app JNDI namespace java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager.

3.1.8.5. Amostras do JNDI Namespaces nas Versões Anteriores e como elas são especificadas no JBoss Enterprise Application Plataform.

Tabela 3.2.

Namespace no JBoss Enterprise Application Plataform 5.x O Namespace no JBoss Enterprise Application Plataform 6 Comentários adicionais
OrderManagerApp/ProductManagerBean/local java:module/ProductManagerBean!services.ejb.ProductManager O EE6 binding default é apenas acessível com o mesmo módulo
OrderManagerApp/ProductManagerBean/local java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager O EE6 binding default é apenas acessível com o mesmo aplicativo
OrderManagerApp/ProductManagerBean/local java:global/OrderManagerApp/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager O EE6 binding default é acessível globalmente
java:comp/UserTransaction java:comp/UserTransaction Isto é acessível para os EE threads, ex.: Os threads que seu aplicativo cria diretamente
java:comp/UserTransaction java:jboss/UserTransaction Acessível globalmente. Use isto, caso o java:comp/UserTransaction não esteja disponível
java:/TransactionManager java:jboss/TransactionManager
java:/TransactionSynchronizationRegistry java:jboss/TransactionSynchronizationRegistry

3.2. As Alterações Dependem nos Componentes e na sua Arquitetura do Aplicativo

3.2.1. Revisão das Alterações Dependentes em seus Componentes e Arquitetura do Aplicativo

Caso o seu aplicativo usar qualquer um dos seguintes componentes e tecnologias, você poderá precisar realizar modificações ao seu aplicativo quando migrar ao JBoss Enterprise Application Plataform 6.
Hibernate e JPA
Caso o seu aplicativo usar o Hibernate ou JPA, o seu aplicativo pode precisar de algumas modificações. Consulte a Seção 3.2.2.1, “Atualização dos Aplicativos que usam Hibernate e/ou JPA” para maiores informações.
REST
Caso seu aplicativo usar JAX-RS, você deve estar ciente de que ao JBoss Enterprise Application Plataform 6 configura automaticamente o RESTEasy, de forma de que você não precisa mais configurá-lo automaticamente. Consulte a Seção 3.2.4.1, “Configuração das Alterações JAX-RS e RESTEasy” para maiores informações.
LDAP
O realm de segurança LDAP é configurado de forma diferente no JBoss Enterprise Application Plataform 6. Caso o seu aplicativo usar o LDAP, refira-se ao seguinte tópico para maiores informações na Seção 3.2.5.1, “Configuração das Alterações LDAP Security Realm”.
Messaging
O JBoss Messaging não está mais incluído no JBoss Enterprise Application Plataform 6. Caso o seu aplicativo usar o JBoss Messaging como provedor messaging, você precisará substituir o código do JBoss Messag como o HornetQ. A seguinte Seção 3.2.6.3, “Migração de seu Aplicativo para uso do HornetQ como um Provedor JMS” descreve o que você precisa realizar.
Clustering
A maneira que você ativa o clustering foi alterada no JBoss Enterprise Application Plataform 6. Consulte a Seção 3.2.7.1, “Realize Alterações ao seu Aplicativo para o Clustering” para maiores detalhes.
Implantação de estilo de serviço
Embora o JBoss Enterprise Application Plataform 6 não usa mais os descritores de estilo de serviço, o contêiner suporta essas implantações de estilo de serviço sem alterações onde possível. Consulte a Seção 3.2.8.1, “Atualização dos Aplicativos que usam as Implantações de estilo de Serviço ” para maiores informações.
Invocação remota
Caso o seu aplicativo realizar invocações remota, você pode continuar usando o JNDI para pesquisar um proxy para o seu bean e invocar aquele proxy retornado. Consulte a Seção 3.2.9.1, “Migração dos Aplicativos Implantados do JBoss Enterprise Application Plataform 5 que realiza Invocações Remotas ao JBoss Enterprise Application Plataform 6” para maiores informações sobre as alterações dos namespaces e a sintaxe requerida.
Seam 2.2
Caso o seu aplicativo usar o Seam 2.2, refira-se à seguinte Seção 3.2.11.1, “Migração dos Arquivos Seam 2.2 para o JBoss Enterprise Application Plataform 6” para melhor entendimento das alterações necessárias que você precisa realizar.
Spring
Consulte a Seção 3.2.12.1, “Aplicativos Spring de Migração” caso seu aplicativo usar o Spring.
Outras alterações que podem afetar sua migração
Para alterações adicionais do JBoss Enterprise Application Plataform 6 que podem impactar o seu aplicativo, consulte a Seção 3.2.13.1, “Outras alterações que podem afetar sua Migração”.

3.2.2. Alterações JPA e Hibernate

3.2.2.2. Configuração das Alterações para Aplicativos que usam o Hibernate e o JPA

Sumário

Caso o seu aplicativo contenha um arquivo persistence.xml ou código usando anotações @PersistenceContext ou @PersistenceUnit, o JBoss Enterprise Application Plataform 6 detectará isto durante a implantação e assumirá que o aplicativo usa o JPA. Ele adiciona o Hibernate 4 mais algumas outras dependências no seu classpath do aplicativo.

Caso o seu aplicativo estiver usando as bibliotecas do Hibernate 3, na maioria das vezes você estará apto à alterar ao uso do Hibernate 4 e executar com sucesso. No entanto, caso você ver ClassNotFoundExceptions quando implantando seu aplicativo, você pode tentar resolvê-las usando uma das abordagens seguintes.

Importante

Os aplicativos que usam o Hibernate diretamente com o Seam 2.2 podem usar a versão do Hibernate 3 empacotados dentro do aplicativo. O Hibernate 4, que é fornecido através do módulo org.hibernate do JBoss Enterprise Application Plataform 6, não é suportado pelo Seam 2.2. Esta amostra possui por intenção ajudá-lo a executar seu aplicativo no JBoss Enterprise Application Plataform 6 como primeira etapa. Por favor certifique-se de que o empacotamento do Hibernate 3 com o aplicativo Seam 2.2 não é uma configuração suportada.

Procedimento 3.12. Configuração do Aplicativo

  1. Copie o Hibernate 3 JARs requerido para sua biblioteca do aplicativo.

    Você pode estar apto a resolver o problema copiando o Hibernate 3 JARs específico que contém classes ausentes no diretório lib/ do aplicativo ou adicionando-as ao classpath usando algum outro método. Em alguns casos, isto pode resultar no ClassCastExceptions ou outros problemas de carregamento de classe devido ao uso misturado das versões Hibernate. Caso isto aconteça, você precisará usar a próxima abordagem.
  2. Instrução do servidor para uso apenas das bibliotecas HIbernate 3.

    O JBoss Enterprise Application Plataform 6 permite você empacotar os jars do provedor de persistência Hibernate 3.5 (ou superior) com o aplicativo. Para direcionar o servidor para uso apenas das bibliotecas Hibernate 3 e excluir as bibliotecas do Hibernate 4, você precisa configurar o jboss.as.jpa.providerModule para hibernate3-bundled no persistence.xml, conforme abaixo:
    <?xml version="1.0" encoding="UTF-8"?>
    <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
        <persistence-unit name="plannerdatasource_pu">
            <description>Hibernate 3 Persistence Unit.</description>
            <jta-data-source>java:jboss/datasources/PlannerDS</jta-data-source>
            <properties>
                <property name="hibernate.show_sql" value="false" />
                <property name="jboss.as.jpa.providerModule" value="hibernate3-bundled" />
            </properties>
        </persistence-unit>
    </persistence>
    
    
    O implantador do Java Persistence API (JPA - API de Persistência Java) detectará a presença de um provedor de persistência no aplicativo e uso das bibliotecas do Hibernate 3. Consulte a Seção 3.2.2.3, “Propriedades da Unidade de Persistência” para maiores informações sobre as propriedades de persistência JPA.
  3. Desativação do cache de segundo nível

    O cache de segundo nível para o Hibernate 3 não exibe o mesmo comportamento com o JBoss Enterprise Application Plataform 6 assim como fazia nas versões anteriores. Caso você esteja usando o cache de segundo nível com o seu aplicativo, você deve desativá-lo até atualizá-lo para o Hibernate 4. Para desativar o cache de segundo nível, configure o <hibernate.cache.use_second_level_cache> para false no arquivo persistence.xml.

3.2.2.3. Propriedades da Unidade de Persistência

Propriedades da Configuração Hibernate 4.x

O JBoss Enterprise Application Plataform 6 configura automaticamente as seguintes propriedades da configuração Hibernate 4.x:

Tabela 3.3. Propriedades da Unidade de Persistência Hibernate

Nome da Propriedade Valor Default Propósito
hibernate.id.new_generator_mappings verdadeiro
Esta configuração é relevante caso você use @GeneratedValue(AUTO) para gerar valores de chave de indexe único. Os novos aplicativos devem manter o valor default true. Os aplicativos existentes que usavam o Hibernate 3.3.x talvez tenham que alterar isto para false com o objetivo de continuar usando o objeto de sequência ou tabela baseada no gerador e manter a compatibilidade reversa. O aplicativo pode substituir esse valor no arquivo persistence.xml.
Maiores informações sobre este comportamento são fornecidas abaixo.
hibernate.transaction.jta.platform Instância da Interface org.hibernate.service.jta.platform.spi.JtaPlatform
Essa classe passa o gerenciador de transação, a transação do usuário e o registro de sincronização da transação no Hibernate.
hibernate.ejb.resource_scanner Instância da Interface org.hibernate.ejb.packaging.Scanner
Essa classe sabe como usar o indexe de anotação do JBoss Enterprise Application Plataform para fornecer uma implantação mais rápida.
hibernate.transaction.manager_lookup_class
Essa propriedade é removida caso encontrada no persistence.xml uma vez que isto pode entrar em conflito com o hibernate.transaction.jta.platform
hibernate.session_factory_name QUALIFIED_PERSISTENCE_UNIT_NAME
Isto é configurado para o nome do aplicativo + o nome da unidade da persistência. O aplicativo pode especificar um valor diferente, mas ele deve ser único por todas as implantações do aplicativo na instância do JBoss Enterprise Application Plataform.
hibernate.session_factory_name_is_jndi falso
Isto é configurado apenas se o aplicativo não tiver especificado um valor para o hibernate.session_factory_name.
hibernate.ejb.entitymanager_factory_name QUALIFIED_PERSISTENCE_UNIT_NAME
Isto é configurado para o nome do aplicativo + o nome da unidade da persistência. O aplicativo pode especificar um valor diferente, mas ele pode ser único por todas as implantações do aplicativo na instância do JBoss Enterprise Application Plataform.
No Hibernate 4.x, caso o new_generator_mappings esteja configurado para true:
  • O @GeneratedValue(AUTO) mapeia para org.hibernate.id.enhanced.SequenceStyleGenerator.
  • O @GeneratedValue(TABLE) mapeia para org.hibernate.id.enhanced.TableGenerator.
  • O @GeneratedValue(SEQUENCE) mapeia para org.hibernate.id.enhanced.SequenceStyleGenerator.
No Hibernate 4.x, caso o new_generator_mappings esteja configurado para false:
  • O @GeneratedValue(AUTO) mapeia para o Hibernate "native".
  • O @GeneratedValue(TABLE) mapeia para o org.hibernate.id.MultipleHiLoPerTableGenerator.
  • O @GeneratedValue(SEQUENCE) mapeia para o Hibernate "seqhilo".
Consulte o http://www.hibernate.org/docs e veja o Hibernate 4.1 Developer Guide para maiores informações sobre essa propriedade.
Propriedades de Persistência JPA

As seguintes propriedades JPA são suportadas na definição de unidade de persistência no arquivo persistence.xml:

Tabela 3.4. Propriedades da Unidade de Persistência JPA

Nome da Propriedade Valor Default Propósito
jboss.as.jpa.providerModule org.hibernate
O nome do fornecedor de persistência.
O valor deve ser hibernate3-bundled caso os Hibernate 3 JARs estiverem no arquivo do aplicativo.
Caso o fornecedor de persistência for empacotado com o aplicativo, este valor deve ser application.
jboss.as.jpa.adapterModule org.jboss.as.jpa.hibernate:4
O nome das classes de integração que ajuda o JBoss Enterprise Application Plataform a funcionar com o fornecedor de persistência.
Os valores válidos e corretos são:
  • org.jboss.as.jpa.hibernate:4: Este é para as classes de integração do Hibernate 4
  • org.jboss.as.jpa.hibernate:3: Este é para as classes de integração Hibernate 3

3.2.2.4. Atualização de seu Aplicativo Hibernate 3 para uso do Hibernate 4

Sumário

Quando você atualizar seu aplicativo para uso do Hibernate 4, algumas atualizações são gerais e válidas independente da versão Hibernate sendo usada no momento pelo aplicativo. Para as demais atualizações, você deve determinar qual versão o aplicativo está usando.

Procedimento 3.13. Atualização do aplicativo para uso do Hibernate 4

  1. O comportamento default gerador da sequência de auto-incremento foi alterado no JBoss Enterprise Application Plataform 6. Consulte a Seção 3.2.2.5, “Mantenha o Comportamento Existente do Valor Gerado Automaticamente da Identidade Hibernate” para maiores informações.
  2. Determine a versão do Hibernate sendo utilizado pelo aplicativo e escolha o procedimento de atualização correto abaixo.
  3. Consulte a Seção 3.2.2.8, “Modificação das Propriedades de Persistência para o Seam Migrado” caso deseje executar seu aplicativo num ambiente com cluster.

3.2.2.5. Mantenha o Comportamento Existente do Valor Gerado Automaticamente da Identidade Hibernate

O Hibernate 3.5 introduziu uma propriedade core nomeada hibernate.id.new_generator_mappings que direciona como as colunas de sequência e identidade são geradas usando o @GeneratedValue. No JBoss Enterprise Application Plataform 6, o valor default para esta propriedade é configurado como o seguinte:
  • Quando você implanta um aplicativo native Hibernate, o valor default é false.
  • Quando você implanta um aplicativo JPA, o valor default é true.
Instruções para Novos Aplicativos

Os novos aplicativos que usam a anotação @GeneratedValue devem determinar o valor para a propriedade hibernate.id.new_generator_mappings para true. Esta é a configuração preferida uma vez que ela é mais portável entre bancos de dados diferentes. Na maioria das vezes ela é mais eficiente e, na maioria dos casos, ela endereça compatibilidade com a especificação JPA 2.

  • Para novos aplicativos JPA, o JBoss Enterprise Application Plataform 6 efetua o default na propriedade hibernate.id.new_generator_mappings para true e isto não deve ser alterado.
  • Para novos aplicativos native Hibernate, o JBoss Enterprise Application Plataform 6 efetua o default na propriedade hibernate.id.new_generator_mappings para false. Você deve configurar essa propriedade para true.
Instruções para os Aplicativos do JBoss Enterprise Application Plataform 5

Os aplicativos existentes que usam a anotação @GeneratedValue devem certificar-se de que o mesmo gerador é usado para criar valores de chave primária para novas entidades quando o aplicativo é migrado ao JBoss Enterprise Application Plataform 6.

  • Para aplicativos JPA existentes, o JBoss Enterprise Application Plataform 6 efetua o default na propriedade hibernate.id.new_generator_mappings para true. Você deve configurar esta propriedade para false no arquivo persistence.xml.
  • Para aplicativos native Hibernate, o JBoss Enterprise Application Plataform 6 efetua o default no hibernate.id.new_generator_mappings para false e isto não deve ser alterado.
Consulte a Seção 3.2.2.3, “Propriedades da Unidade de Persistência” para maiores informações sobre essas configurações de propriedade.

3.2.2.6. Migração de seu Aplicativo Hibernate 3.3.x para o Hibernate 4.x

Procedimento 3.14. 

  1. Mapeie os tipos de text Hibernate para JDBC LONGVARCHAR

    Nas versões anteriores do Hibernate 3.5, o tipo de text era mapeado para JDBC CLOB. Um novo tipo de Hibernate, materialized_clob, foi adicionado ao Hibernate 4 para mapear as propriedades Java String para JDBC CLOB. Caso o seu aplicativo possuir propriedades configuradas como type="text" que possuem por intenção serem mapeadas para JDBC CLOB, você deve fazer o seguinte:
    1. Caso o seu aplicativo usar arquivos de mapeamento hbm, altere a propriedade para type="materialized_clob".
    2. Caso seu aplicativo usar anotações, você deve substituir @Type(type = "text") por @Lob.
  2. Revise o código para encontrar alterações em tipos de valores retornados

    As projeções de critério agregado numérico retornam agora o mesmo tipo de valor de seus counterparts HQL. Como resultado, os tipos de retorno das projeções seguintes no org.hibernate.criterion foram alteradas.
    1. Devido às alterações no CountProjection, Projections.rowCount(), Projections.count(propertyName) e Projections.countDistinct(propertyName), as projeções count e count distinct retornam agora um valor Long.
    2. Devido às alterações no Projections.sum(propertyName), as projeções sum retornam agora um tipo de valor que depende do tipo de propriedade.

      Nota

      Falha ao modificar o seu código do aplicativo num java.lang.ClassCastException.
      1. Para propriedades mapeadas com tipos de número primitivo, Número, Longo ou Curto, o valor Longo é retornado;
      2. Para propriedades mapeadas como tipos de ponto flutuante primitivo, Duplo ou Flutuante, o valor Duplo é retornado.

3.2.2.7. Migração de seu Aplicativo Hibernate 3.5.x para o Hibernate 4.x

Procedimento 3.15. 

  1. Mescle o AnnotationConfiguration na Configuração

    Embora o AnnotationConfiguration tenha sido substituído, ele não deve afetar a sua migração.
    Caso você esteja usando um arquivo hbm.xml, você deve estar ciente que o JBoss Enterprise Application Plataform 6 usa o org.hibernate.cfg.EJB3NamingStrategy no AnnotationConfiguration ao invés do org.hibernate.cfg.DefaultNamingStrategy que foi usado em versões anteriores. Isto pode resultar em incompatibilidade de nomeação. Caso você baseie-se na estratégia de nomeação para o default do nome de uma tabela associada (muitos-para-muitos e coleções de elementos), você poderá ver esse problema. Para resolver isto, você pode solicitar ao Hibernate a usar o org.hibernate.cfg.DefaultNamingStrategy de legacia chamando o Configuration#setNamingStrategy e passando-o ao org.hibernate.cfg.DefaultNamingStrategy#INSTANCE.
  2. Modifique os namespaces para estarem de acordo com os novos arquivos Hibernate DTD.

    Tabela 3.5.

    DTD Namespace anterior Novo DTD Namespace
    http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd
    http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd
  3. Modifique as variáveis do ambiente

    1. Caso você esteja usando o Oracle e usando as propriedades materialized_clob ou materialized_blob, a variável de ambiente global hibernate.jdbc.use_streams_for_binary deve ser configurada para verdadeiro.
    2. Caso você esteja usando o PostgreSQL e usando as propriedades CLOB ou BLOB, o hibernate.jdbc.use_streams_for_binary da variável do ambiente global deve ser configurado para falso.

3.2.2.8. Modificação das Propriedades de Persistência para o Seam Migrado

Caso você migrar o aplicativo gerenciado pelo contêiner JPA, as propriedades que influenciam a serialização dos contextos de persistência estendidos são automaticamente passadas ao sistema.
No entanto, devido às alterações no Hibernate, você pode executar em problemas de serialização caso você executar seu Seam migrado ou aplicativo Hibernate num ambiente com cluster. Você poderá observar mensagens de erro similares à seguinte:
javax.ejb.EJBTransactionRolledbackException: JBAS010361: Failed to deserialize 
....
Caused by: java.io.InvalidObjectException: could not resolve session factory during session deserialization [uuid=8aa29e74373ce3a301373ce3a44b0000, name=null]
Para solucionar esses erros, você pode modificar as propriedades no arquivo de configuração. Na maioria das vezes, este é o arquivo persistence.xml. Para aplicativos native Hibernate API, este é o arquivo hibernate.cfg.xml.

Procedimento 3.16. Configuração das propriedades a serem executadas num ambiente com cluster

  1. Determine o valor hibernate.session_factory_name a um nome único. Este nome deve ser único por todas as implantações de aplicativo na instância do JBoss Enterprise Application Plataform. Por exemplo:
    <property name="hibernate.session_factory_name" value="jboss-seam-booking.ear_session_factory"/>
    
    
  2. Determine o valor hibernate.ejb.entitymanager_factory_name a este nome único. Este nome deve ser único por todas as implantações do aplicativo na instância do JBoss Enterprise Application Plataform. Por exemplo:
    <property name="hibernate.ejb.entitymanager_factory_name" value="seam-booking.ear_PersistenceUnitName"/>
    
    
Para maiores informações sobre as configurações do Hibernate JPA Persistence Unit Property, consulte a Seção 3.2.2.3, “Propriedades da Unidade de Persistência”.

3.2.2.9. Atualização de seu Aplicativo para ficar de acordo com a Especificação JPA 2.0

Sumário

A especificação JPA 2.0 requer que um contexto de persistência não seja propagado fora da transação JTA. Caso o seu aplicativo use apenas contextos de persistência de transação com escopo, o comportamento é o mesmo que no JBoss Enterprise Application Plataform 6 assim como era nas versões anteriores do servidor do aplicativo e nenhuma alteração é requerida. No entanto, caso o seu aplicativo use um extended persistence context (XPC - contexto de persistência estendida) para permitir o enfileiramento ou as modificações de dados em lote, você talvez tenha que alterar o seu aplicativo.

Comportamento de propagação de contexto de persistência

Caso o seu aplicativo possua um bean de sessão stateful, Bean1, que use um contexto de persistência estendido e chame um bean de sessão stateless, Bean2, que usa um contexto de persistência de transação com escopo, você pode esperar que o seguinte comportamento ocorra:

  • Caso o Bean1 iniciar uma transação JTA e realizar a invocação do método Bean2 com a transação JTA ativa, o comportamento no JBoss Enterprise Application Plataform 6 é o mesmo que dos lançamentos anteriores e nenhuma alteração será necessária.
  • Caso o Bean1 não inciar uma transação JTA e realizar a invocação do método Bean2, o JBoss Enterprise Application Plataform 6 não propaga o contexto de persistência estendida ao Bean2. Esse comportamento é diferente ao dos lançamentos anteriores que propagavam o contexto de persistência estendido ao Bean2. Caso o seu aplicativo esperar que o contexto de persistência estendido seja propagado ao bean com o gerenciador de entidade transacional, você precisa alterar o seu aplicativo para realizar a invocação com uma transação JTA ativa.

3.2.2.10. Substituição do Cache de Segundo Nível JPA/Hibernate com o Infinispan

Sumário

O JBoss Cache foi substituído pelo Infinispan para o cache de segundo nível (2LC) Hibernate. Isso requer uma alteração ao arquivo persistence.xml. A sintaxe é um pouco diferente, dependendo de você usar o JPA ou o cache de segundo nível Hibernate. Essas amostras assumem que você está usando o Hibernate.

Segue abaixo uma amostra de como as propriedades para o cache e segundo nível foram especificadas no arquivo persistence.xml do JBoss Enterprise Application Plataform 5.x.
<property name="hibernate.cache.region.factory_class"
     value="org.hibernate.cache.jbc2.JndiMultiplexedJBossCacheRegionFactory"/>
<property name="hibernate.cache.region.jbc2.cachefactory" value="java:CacheManager"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.region.jbc2.cfg.entity" value="mvcc-entity"/>
<property name="hibernate.cache.region_prefix" value="services"/>

As seguintes etapas usarão essa amostra para configurar o Infinispan no JBoss Enterprise Application Plataform 6.

Procedimento 3.17. Modificação do arquivo persistence.xml para uso Infinispan

  1. Configuração Infinispan para o aplicativo JPA no JBoss Enterprise Application Plataform 6

    Esta é a forma de como você especifica as propriedades para arquivo de mesma configuração para o aplicativo JPA usando o Infinispan no JBoss Enterprise Application Plataform 6:
    <property name="hibernate.cache.use_second_level_cache" value="true"/>
    
    
    Além disso, você precisa especificar um shared-cache-mode com um valor de ENABLE_SELECTIVE ou ALL conforme abaixo:
    • O ENABLE_SELECTIVE é o default e valor recomendado. Isto significa que as entidades não possuem cache a não que você marque-as como com cache.
      <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
      
      
    • ALL significa que as entidades sempre possuem cache mesmo que você as marque sem cache.
      <shared-cache-mode>ALL</shared-cache-mode>
      
      
  2. Configure o Infinispan para o aplicativo Hibernate native no JBoss Enterprise Application Plataform 6

    Esta é a forma de como você especifica a mesma configuração para o aplicativo Hibernate native usando o Infinispan com o JBoss Enterprise Application Plataform 6:
    <property name="hibernate.cache.region.factory_class"
         value="org.jboss.as.jpa.hibernate4.infinispan.InfinispanRegionFactory"/>
    <property name="hibernate.cache.infinispan.cachemanager"
         value="java:jboss/infinispan/container/hibernate"/>     
    <property name="hibernate.transaction.manager_lookup_class"
         value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
    <property name="hibernate.cache.use_second_level_cache" value="true"/>
    
    
    
    Você deve adicionar o seguinte ao arquivo MANIFEST.MF:
    Manifest-Version: 1.0
    Dependencies: org.infinispan, org.hibernate
    
Para maiores informações sobre as propriedades do cache Hibernate, consulte: Seção 3.2.2.11, “Propriedades do Cache Hibernate”.

3.2.2.11. Propriedades do Cache Hibernate

Tabela 3.6. Propriedades

Nome da Propriedade Descrição
hibernate.cache.provider_class
O nome da classe de um CacheProvider personalizado.
hibernate.cache.use_minimal_puts
Booliano. Otimiza a operação do cache de segundo nível para minimizar as gravações, ao custo de leituras mais frequentes. Essa configuração é mais útil para caches com cluster, sendo que o Hibernate3 é habilitado por default para as implantações do cache com cluster.
hibernate.cache.use_query_cache
Booliano. Habilita o cache da consulta. As consultas individuais continuam sendo configuradas com o cache.
hibernate.cache.use_second_level_cache
Booliano. Usado para desativar completamente o cache de segundo nível, que é habilitado por default para classes que especificam um mapeamento <cache>.
hibernate.cache.query_cache_factory
O nome da classe da interface QueryCache default. O valor default é um StandardQueryCache interno.
hibernate.cache.region_prefix
O prefixo para uso dos nomes de região do cache de segundo nível.
hibernate.cache.use_structured_entries
Booliano. Força o Hibernate a aplicar o store nos dados no cache de segundo nível num formato mais fácil para o usuário.
hibernate.cache.default_cache_concurrency_strategy
Configuração usada para gerar o nome do org.hibernate.annotations.CacheConcurrencyStrategy default de uso quando tanto o @Cacheable ou @Cache forem usados. O @Cache(strategy="..") é usado para substituir este default.

3.2.2.12. Migração para o Validador Hibernate 4

Sumário

O Validador Hibernate 4.x é uma nova base de código que implementa o JSR 303 - Bean Validation. O processo de migração do Validator 3.x para 4.x é bastante simples, mas existem algumas alterações que você deve realizar quando migrando seu aplicativo.

Procedimento 3.18. Você pode precisar executar uma ou mais dessas tarefas

  1. Acesso ao ValidatorFactory default

    O JBoss Enterprise Application Plataform 6 bind (associa) o ValidatorFactory default ao contexto JNDI sob o nome java:comp/ValidatorFactory.
  2. Compreendendo o ciclo de vida da validação trigger

    Quando usado em combinação com o Hibernate Core 4, o ciclo de vida baseado na validação é automaticamente ativado pelo Hibernate Core.
    1. A validação ocorre nas operações INSERT, UPDATE e DELETE de entidade.
    2. Você pode configurar os grupos a serem validados pelo tipo de evento usando as seguintes propriedades:
      • javax.persistence.validation.group.pre-persist,
      • javax.persistence.validation.group.pre-update, and
      • javax.persistence.validation.group.pre-remove.
      Os valores dessas propriedades são de vírgula separada, nomes de classe inteiramente qualificada dos grupos a serem validados.
      Os grupos de validação são um novo recurso da especificação da Validação Bean. Caso você não deseje aproveitar as vantagens desse novo recurso, não existem alterações requeridas na migração para o Hibernate Validator 4.
    3. Caso você desativar o ciclo de vida baseado na validação pela configuração da propriedade javax.persistence.validation.mode para none. Outros valores válidos para esta propriedade são auto (o default), callback e ddl.
  3. Configuração de seu aplicativo para uso da validação

    1. Caso você deseje manualmente controlar a validação, você pode criar um Validador em algumas das seguintes maneiras:
      • Crie uma instância Validator a partir do ValidatorFactory usando o método getValidator().
      • Injete as Instâncias do Validador em seu EJB. O bean CDI ou qualquer outro recurso injetável do Java EE.
    2. Você pode usar o ValidatorContext retornado pelo ValidatorFactory.usingContext() para personalizar sua instância do Validador. Você pode configurar um MessageInterpolator, TraverableResolver e ConstraintValidatorFactory personalizado usando o API. Essas interfaces são específicas na especificação do Bean Validation e são novas ao Hibernate Validator 4.
  4. Modificação do código para uso de novas restrições do Bean Validation

    As novas restrições de validação de nível Bean solicitam alterações de código quando migrando ao Hibernate Validator 4.
    1. Você deve usar as restrições nos seguintes pacotes para atualização ao Validador Hibernate 4:
      • javax.validation.constraints
      • org.hibernate.validator.constraints
    2. Todas as restrições que existiam no Hibernate Validator 3 continuam disponíveis no Hibernate Validator 4. Para usá-las, você precisa importar a classe especificada e em alguns casos alterar o nome ou tipo de parâmetro de restrição.
  5. Uso de restrição personalizada

    No Hibernate Validator 3, é necessária uma restrição personalizada para implantar a interface org.hibernate.validator.Validator. No Hibernate Validator 4, você precisa implantar a interface javax.validation.ConstraintValidator. Essa interface contém os mesmos métodos initialize() e isValid() da interface anterior, no entanto, o método de assinatura foi alterado. Além disso, a alteração DDL não é mais suportada no Hibernate Validator 4.

3.2.3. Alterações do JSF

3.2.3.1. Ativação de Aplicativos para Uso de Versões Antigas do JSF

Sumário

Caso seu aplicativo usar uma versão antiga do JSF, você não precisará atualizar para o JSF 2.0. Ao invés disso, você pode criar um arquivo jboss-deployment-structure.xml para solicitar que o JBoss Enterprise Application Plataform 6 use o JSF 1.2 ao invés do JSF 2.0 com a sua implantação de aplicativo. Este descritor de implantação específico do JBoss é usado para controlar o carregador de classe e é posicionado no diretório META-INF/ ou WEB-INF/do seu WAR, ou no diretório META-INF/ do seu EAR.

Segue abaixo uma amostra de um arquivo jboss-deployment-structure.xml que adiciona a dependência para o módulo JSF 1.2 e exclui ou previne o carregamento automático do módulo JSF 2.0.
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
    <deployment>
        <dependencies>
            <module name="javax.faces.api" slot="1.2" export="true"/>
            <module name="com.sun.jsf-impl" slot="1.2" export="true"/>
        </dependencies>
    </deployment>
    <sub-deployment name="jboss-seam-booking.war">
        <exclusions>
            <module name="javax.faces.api" slot="main"/>
            <module name="com.sun.jsf-impl" slot="main"/>
        </exclusions>
        <dependencies>
            <module name="javax.faces.api" slot="1.2"/>
            <module name="com.sun.jsf-impl" slot="1.2"/>
        </dependencies>
    </sub-deployment>
</jboss-deployment-structure>

3.2.4. Alterações JAX-RS e RESTEasy

3.2.4.1. Configuração das Alterações JAX-RS e RESTEasy

O JBoss Enterprise Application Plataform automaticamente configura o RESTEasy, de forma que você não precisa configurá-lo. Portanto, você deve remover toda configuração RESTEasy existente de seu arquivo web.xml e substituí-la por uma das três opções abaixo:

  1. Sub-classifique o javax.ws.rs.core.Application e use a anotação @ApplicationPath.
    Esta é a opção mais fácil e não requer qualquer configuração xml. Apenas sub-classifique o javax.ws.rs.core.Application em seu aplicativo e anote-o com o caminho que deseja para disponibilizar as classes JAX-RS. Por exemplo:
    @ApplicationPath("/mypath")
    public class MyApplication extends Application {
    }
    
    Na amostra acima, os seus recursos JAX-RS estão disponíveis no caminho /MY_WEB_APP_CONTEXT/mypath/.

    Nota

    Perceba que o caminho deve ser especificado como /mypath e não /mypath/*. Não deve ter nenhum asterísco ou barra.
  2. Sub-classifique javax.ws.rs.core.Application e use o arquivo web.xml para configurar o mapeamento JAX-RS.
    Caso você não deseje usar a anotação @ApplicationPath, você terá que sub-classificar da mesma forma o javax.ws.rs.core.Application. Você então irá configurar o mapeamento JAX-RS no arquivo web.xml. Por exemplo:
    public class MyApplication extends Application {
    }
    
    <servlet-mapping>
       <servlet-name>com.acme.MyApplication</servlet-name>
       <url-pattern>/hello/*</url-pattern>
    </servlet-mapping>
    
    Na amostra acima, os seus recursos JAX-RS estão disponíveis no /MY_WEB_APP_CONTEXT/hello do caminho.

    Nota

    Você pode usar também esta abordagem para substituir um caminho de aplicativo que foi configurado usando a anotação @ApplicationPath.
  3. Modificação do arquivo web.xml.
    Caso você deseje sub-classificar o Application, você pode configurar o mapeamento JAX-RS no arquivo web.xml, conforme abaixo:
    <servlet-mapping>
       <servlet-name>javax.ws.rs.core.Application</servlet-name>
       <url-pattern>/hello/*</url-pattern>
    </servlet-mapping>
    
    Na amostra acima, os seus recursos JAX-RS estão disponíveis no /MY_WEB_APP_CONTEXT/hello do caminho.

    Nota

    Caso você escolha esta opção, você precisará apenas adicionar o mapeamento. Você não precisa adicionar o servlet correspondente. O servidor é responsável pela adição do servlet correspondente automaticamente.

3.2.5. Alterações do Realm de Segurança LDAP

3.2.5.1. Configuração das Alterações LDAP Security Realm

No JBoss Enterprise Application Plataform 5, o LDAP security realm foi configurado num elemento <application-policy> do arquivo login-config.xml. No JBoss Enterprise Application Plataform 6, o LDAP security realm é configurado no elemento <security-domain> do arquivo do servidor do aplicativo. Para um servidor autônomo, este é o arquivo standalone/configuration/standalone.xml. Caso você esteja executando o seu servidor num storage domain, este é o arquivo domain/configuration/domain.xml.
Segue abaixo a configuração realm de segurança LDAP no arquivo login-config.xml do JBoss Enterprise Application Plataform 5:
<application-policy name="mcp_ldap_domain">
  <authentication>
    <login-module code="org.jboss.security.auth.spi.LdapExtLoginModule" flag="required">
      <module-option name="java.naming.factory.initial">com.sun.jndi.ldap.LdapCtxFactory</module-option>
      <module-option name="java.naming.security.authentication">simple</module-option>
      ....
    </login-module>
  </authentication>
</application-policy>
Segue abaixo uma amostra da configuração LDAP no arquivo de configuração do servidor no JBoss Enterprise Application Plataform 6:
<subsystem xmlns="urn:jboss:domain:security:1.0">
  <security-domains>
    <security-domain name="mcp_ldap_domain" type="default">
      <authentication>
        <login-module code="org.jboss.security.auth.spi.LdapLoginModule" flag="required">
          <module-option name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory"/>
          <module-option name="java.naming.security.authentication" value="simple"/>
          ...
        </login-module>
      </authentication>
    </security-domain>
  </security-domains>
</subsystem>

Nota

O pesquisador XML foi alterado no JBoss Enterprise Application Plataform 6. No JBoss Enterprise Application Plataform 5, você especificava as opções de módulo como conteúdo de elemento como, por exemplo:
<module-option name="java.naming.factory.initial">com.sun.jndi.ldap.LdapCtxFactory</module-option>
Agora, as opções de módulo devem ser especificadas como atributos de elemento com "value=" conforme abaixo:
<module-option name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory"/>

3.2.6. Alterações do HornetQ

3.2.6.1. HornetQ e NFS

Na maioria das vezes, o NFS não é um método apropriado de storing de dados JMS para uso com o HornetQ, quando usando o NIO como um tipo de diário devido à maneira de sincronização que o mecanismo de bloqueio funciona. No entanto, o NFS pode ser usado em determinadas circunstâncias, apenas nos servidores do Red Hat Enterprise Linux. Isto é devido à implantação NFS usada pelo Red Hat Enterprise Linux.
A implantação NFS do Red Hat Enterprise Linux suportar ambos I/O diretos (arquivos de abertura com o conjunto de aviso O_DIRECT) e kernel baseado no I/O assíncrono. É possível o uso do NFS com ambos recursos presentes e é possível usar o NFS como opção de storage compartilhado, sob as seguintes regras:
  • O HornetQ deve ser configurado para uso do tipo de diário ASYNCIO.
  • O cache do cliente NFS do Red Hat Enterprise Linux deve ser desabilitado.

Importante

O log do servidor deve ser checado após o JBoss Enterprise Appliaction Plataform 6 for iniciado para certificar-se de que a biblioteca native seja carregada com sucesso e que o tipo de diário ASYNCIO está sendo usado. Caso a biblioteca native falhar no carregamento, o HornetQ falhará no tipo de diário NIO e isto será mencionado no log do servidor.

Importante

A biblioteca native que implementa o I/O assíncrono requer que o libaio seja instalado no sistema do Red Hat Enterprise Linux onde o JBoss Enterprise Application Plataform está sendo executado.

3.2.6.2. Configuração do JMS Bridge para Migração de JMS Messages Existentes ao JBoss Enterprise Application Plataform 6

O JBoss Enterprise Application Plataform 6 substituiu o JBoss Messaging pelo HornetQ como implantação JMS default. A maneira mais fácil de migrar mensagens JMS a partir de um ambiente a outro é usar o JMS Bridge. Embora o JBoss Enterprise Application Plataform 6 não possua atualmente um JMS bridge disponível, você pode implantar um JMS bridge ao JBoss Enterprise Application Plataform 5.x para mover as mensagens ao JBoss Enterprise Application Plataform 6. Com o objetivo de evitar conflitos nas classes entre lançamentos, você deve usar o seguinte procedimento para configurar o JMS Bridge. Os nomes do diretório SAR e bridge são arbitrários e podem ser alterados caso seja necessário.

Procedimento 3.19. Configuração do JMS Bridge

  1. Crie um subdiretório no diretório de implantação do JBoss Enterprise Application Plataform 5 para conter o SAR, por exemplo: EAP5_HOME/server/PROFILE_NAME/deploy/myBridge.sar
  2. Crie um subdiretório nomeado META-INF no EAP5_HOME/server/PROFILE_NAME/deploy/myBridge.sar/.
  3. Crie um arquivo jboss-service.xml que contém informação similar ao seguinte no diretório EAP5_HOME/server/PROFILE_NAME/deploy/myBridge.sar/META-INF/.
    <server>
       <loader-repository>
          com.example:archive=unique-archive-name
          <loader-repository-config>java2ParentDelegation=false</loader-repository-config>
       </loader-repository> 
    
       <!-- JBoss Enterprise Application Platform 6 JMS Provider --> 
       <mbean code="org.jboss.jms.jndi.JMSProviderLoader" name="jboss.messaging:service=JMSProviderLoader,name=EnterpriseApplicationPlatform6JMSProvider">
          <attribute name="ProviderName">EnterpriseApplicationPlatform6JMSProvider</attribute>
          <attribute name="ProviderAdapterClass">org.jboss.jms.jndi.JNDIProviderAdapter</attribute>
          <attribute name="FactoryRef">jms/RemoteConnectionFactory</attribute> 
          <attribute name="QueueFactoryRef">jms/RemoteConnectionFactory</attribute>  
          <attribute name="TopicFactoryRef">jms/RemoteConnectionFactory</attribute>      
          <attribute name="Properties">
             java.naming.factory.initial=org.jboss.naming.remote.client.InitialContextFactory
             java.naming.provider.url=remote://EnterpriseApplicationPlatform6host:4447
             java.naming.security.principal=jbossuser
             java.naming.security.credentials=jbosspass
          </attribute>
       </mbean> 
    
       <mbean code="org.jboss.jms.server.bridge.BridgeService" name="jboss.jms:service=Bridge,name=MyBridgeName" xmbean-dd="xmdesc/Bridge-xmbean.xml">      
          <depends optional-attribute-name="SourceProviderLoader">jboss.messaging:service=JMSProviderLoader,name=JMSProvider</depends>          
          <depends optional-attribute-name="TargetProviderLoader">jboss.messaging:service=JMSProviderLoader,name=EnterpriseApplicationPlatform6JMSProvider</depends>          
          <attribute name="SourceDestinationLookup">/queue/A</attribute>      
          <attribute name="TargetDestinationLookup">jms/queue/test</attribute>       
          <attribute name="QualityOfServiceMode">1</attribute>           
          <attribute name="MaxBatchSize">1</attribute>      
          <attribute name="MaxBatchTime">-1</attribute>           
          <attribute name="FailureRetryInterval">60000</attribute>      
          <attribute name="MaxRetries">-1</attribute>      
          <attribute name="AddMessageIDInHeader">false</attribute>
          <attribute name="TargetUsername">jbossuser</attribute>
          <attribute name="TargetPassword">jbosspass</attribute>
       </mbean>
    </server>
            
    
    

    Nota

    O <load-repository> está presente para garantir que o SAR já foi um classloader isolado. Além disso, perceba que ambos bridge "target" e bridge look-up incluem credenciais de segurança para o usuário "jbossuser" com senha "jbosspass". Isto é devido ao JBoss Enterprise 6 possuir segurança por default. O usuário nomeado "jbossuser" com senha "jbosspass" foi criado no ApplicationRealm com a função guest usando o script EAP_HOME/bin/add_user.sh.
  4. Copie os seguintes JARs a partir do diretório EAP_HOME/modules/system/layers/base/ no diretório EAP5_HOME/server/PROFILE_NAME/deploy/myBridge.sar/. Substitua cada VERSION_NUMBER pelo número de versão em sua distribuição do JBoss Enterprise Application Plataform 6.
    • org/hornetq/main/hornetq-core-VERSION_NUMBER.jar
    • org/hornetq/main/hornetq-jms-VERSION_NUMBER.jar
    • org/jboss/ejb-client/main/jboss-ejb-client-VERSION_NUMBER.jar
    • org/jboss/logging/main/jboss-logging-VERSION_NUMBER.jar
    • org/jboss/logmanager/main/jboss-logmanager-VERSION_NUMBER.jar
    • org/jboss/marshalling/main/jboss-marshalling-VERSION_NUMBER.jar
    • org/jboss/marshalling/river/main/jboss-marshalling-river-VERSION_NUMBER.jar
    • org/jboss/remote-naming/main/jboss-remote-naming-VERSION_NUMBER.jar
    • org/jboss/remoting3/main/jboss-remoting-VERSION_NUMBER.jar
    • org/jboss/sasl/main/jboss-sasl-VERSION_NUMBER.jar
    • org/jboss/netty/main/netty-VERSION_NUMBER.jar
    • org/jboss/remoting3/remote-jmx/main/remoting-jmx-VERSION_NUMBER.jar
    • org/jboss/xnio/main/xnio-api-VERSION_NUMBER.jar
    • org/jboss/xnio/nio/main.xnio-nio-VERSION_NUMBER.jar

    Nota

    Não copie simplesmente o EAP_HOME/bin/client/jboss-client.jar uma vez que as classes javax API classes entrarão em conflito com aquelas do JBoss Enterprise Application Plataform 5.x.

3.2.6.3. Migração de seu Aplicativo para uso do HornetQ como um Provedor JMS

O JBoss Messaging não está mais incluído no JBoss Enterprise Application Plataform. Caso o seu aplicativo use o JBoss Messaging como um fornecedor messaging, você precisará substituir o código do JBoss Messaging com o HornetQ.

Procedimento 3.20. Antes de começar

  1. Encerre o cliente e o servidor
  2. Realize uma cópia do backup de quaisquer dados do JBoss Messaging. Os dados da mensagem são stored num banco de dados com tabelas pré-fixadas com o JBM_.

Procedimento 3.21. Altere seu provedor para o HornetQ

  1. Transfira configurações

    A transferência das configurações do JBoss Messaging à configuração do JBoss Enterprise Application Plataform. As seguintes configurações podem ser encontradas nos descritores de implantação localizados no servidor do JBoss Messaging:
    • Configuração do Serviço de Criações da Conexões
      Esta configuração descreve as criações da conexão JMS implantada com o servidor do JBoss Messaging. O JBoss Messaging configura as criações da conexão num arquivo nomeado connection-factories-service.xml, que está localizado no diretório de implantação do servidor do aplicativo.
    • Configuração de Destinação
      Esta configuração descreve as filas JMS e tópicos implantados com o servidor do JBoss Messaging. Por default, o JBoss Messaging configura as destinações num arquivo nomeado destinations-service.xml que está localizado no diretório de implantação no servidor do aplicativo.
    • Configuração do Serviço da Bridge de Mensagem
      Esta configuração inclui os serviços de ponte implantados com o servidor do JBoss Messaging. Nenhum dos bridges é implantado por default, de forma que o nome do arquivo da implantação varia, dependendo de sua instalação.
  2. Modificação de seu código de arquivo

    Caso o código do aplicativo usar o JMS default, nenhuma alteração do código será solicitada. No entanto, caso o aplicativo seja conectado a um cluster, você deverá revisar com cuidado a documentação HornetQ das semânticas de clustering. O clustering está fora do escopo da especificação JMS e o HornetQ e o JBoss Messaging tomaram abordagens diferentes em suas respectivas implementações de funcionalidade de clustering.
    Caso o aplicativo usar recursos específicos do JBoss Messaging, você deverá modificar o código para uso dos recursos equivalentes disponíveis no HornetQ.
    Para maiores informações sobre a configuração do messaging com o HornetQ, consulte: Seção 3.2.6.4, “Configuração de Mensagens com HornetQ”.
  3. Migração de mensagens existentes

    Mova quaisquer mensagens do banco de dados do JBoss Messaging ao diário HornetQ usando a ponte JMS. As instruções para configuração da ponte JMS podem ser encontrados na: Seção 3.2.6.2, “Configuração do JMS Bridge para Migração de JMS Messages Existentes ao JBoss Enterprise Application Plataform 6”.

3.2.6.4. Configuração de Mensagens com HornetQ

O método recomendado de configuração de mensagem no JBoss Entrerprise Application Plataform 6 é tanto o Management Console ou Management CLI. Você pode fazer com que estas alterações sejam persistentes com qualquer uma dessas ferramentas sem a necessidade de editar manualmente os arquivos de configuração standalone.xml ou domain.xml. Isto é útil, no entanto recomendamos familiarizar-se com os componentes de mensagem, sendo que as amostras da documentação usando as ferramentas de gerenciamento fornecem snippets do arquivo de configuração default para referência.

3.2.7. Alterações de Clustering

3.2.7.1. Realize Alterações ao seu Aplicativo para o Clustering

Procedimento 3.22. 

  1. Inicie o JBoss Enterprise Application Plataform 6 com o clustering ativado

    Para ativar o clustering no JBoss Enterprise Application Plataform 5.x, você precisava iniciar suas instâncias do servidor usando o perfil all ou alguma derivação do mesmo, como por exemplo:
    $ EAP5_HOME/bin/run.sh -c all
    No JBoss Enterprise Application Plataform 6, o método para ativação do clustering depende dos servidores serem autônomos ou serem executados num storage domain.
    1. Ativação do cluster para servidores rodando num storage domain

      Para ativar o clustering para servidores iniciados usando o controlador do domain, atualize o seu domain.xml e determine um grupo de servidor para uso do seu perfil ha e grupo binding de socket ha-sockets. Por exemplo:
      <server-groups>
        <server-group name="main-server-group" profile="ha">
          <jvm name="default">
            <heap size="64m" max-size="512m"/>
          </jvm>
          <socket-binding-group ref="ha-sockets"/>
        </server-group>
      </server-group>
      
    2. Ativação do cluster para servidores autônomos

      Para ativar o clustering para os servidores autônomos, inicie o servidor usando o arquivo de configuração apropriado conforme o seguinte: $ EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=UNIQUE_NODE_NAME
  2. Especificação do endereço bind

    No JBoss Enterprise Application Plataform 5.x, você normalmente indicaria o endereço bind usado para o clustering usando o argumento da linha de comando -b parecido com: $ EAP_HOME/bin/run.sh -c all -b 192.168.0.2
    No JBoss Enteprise Application Plataform 6, os endereços bind são claramente definidos pelos bindings de sockets relevantes com os arquivos da configuração do JBoss Enterprise Application Plataform 6. Para os servidores iniciados usando o controlador do domain, os endereços bind são especificados com o arquivo domain/configuration/host.xml. Para os servidores autônomos, os endereços bind são especificados com o arquivo standalone-ha.xml:
    <interfaces>
          <interface name="management">
        <inet-address value="192.168.0.2"/>
          </interface>
          <interface name="public">
        <inet-address value="192.168.0.2"/>
      </interface>
      </interfaces>
    
    <socket-binding-groups>
          <socket-binding-group name="ha-sockets" default-interface="public">
        <!-- ... -->
          </socket-binding-group>
      </socket-binding-groups>
    
    A interface public é especificada na amostra acima como interface default para todos os sockets com o grupo binding de socket ha-sockets.
  3. Configure o jvmRoute para suportar o mod_jk e mod_proxy

    No JBoss Enterprise Application Plataform 5, o servidor da web jvmRoute foi configurado usando a propriedade no arquivo server.xml. No JBoss Enterprise Application Plataform 6, o atributo jvmRoute é configurado no subsistema da web do arquivo de combinação do servidor usando o atributo instance-id conforme o seguinte:
    <subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host" native="false" instance-id="{JVM_ROUTE_SERVER}">
    
    
    O {JVM_ROUTE_SERVER} acima deve ser substituído pela ID do servidor jvmRoute.
    O instance-id pode ser determinado usando o Management Console.
  4. Especificação do endereço multicast e porta

    No JBoss Enterprise Application Plataform 5.x, você pode especificar o endereço multicast e a porta usada para a comunicação infra-cluster usando os argumentos da linha de comando -u e -m, respectivamente, como por exemplo: $ EAP_HOME/bin/run.sh -c all -u 228.11.11.11 -m 45688
    No JBoss Enterprise Application Plataform 6, o endereço e porta multicast usados para a comunicação do cluster são definidos pelo socket-binding referenciado pela pilha do protocolo JGroups relevante, conforme abaixo:
    <subsystem xmlns="urn:jboss:domain:jgroups:1.0" default-stack="udp">
        <stack name="udp">
            <transport type="UDP" socket-binding="jgroups-udp"/>
            <!-- ... -->
        </stack>
    </subsystem>
    
    <socket-binding-groups>
        <socket-binding-group name="ha-sockets" default-interface="public">
            <!-- ... -->
            <socket-binding name="jgroups-udp" port="55200" multicast-address="228.11.11.11" multicast-port="45688"/>
            <!-- ... -->
        </socket-binding-group>
    </socket-binding-groups>
    
    
    Caso você preferir especificar o endereço multicast e a porta na linha de comando, você pode definir o endereço multicast e as portas como propriedades de sistema e usá-las na linha de comando quando você inciar o servidor. A seguinte amostra, jboss.mcast.addr é o nome da variável para o endereço multicast e o jboss.mcast.port é o nome da variável para a porta.
    <socket-binding name="jgroups-udp" port="55200"
     multicast-address="${jboss.mcast.addr:230.0.0.4}" multicast-port="${jboss.mcast.port:45688}"/>
    
    
    Você pode inciar o seu servidor usando os argumentos da linha de comando: $ EAP_HOME/bin/domain.sh -Djboss.mcast.addr=228.11.11.11 -Djboss.mcast.port=45688
  5. Uso da pilha de protocolo alternativo

    No JBoss Enterprise Application Plataform 5.x, você pode manipular a pilha de protocolo default para todos os serviços de clustering usando a propriedade de sistema jboss.default.jgroups.stack. $ EAP_HOME/bin/run.sh -c all -Djboss.default.jgroups.stack=tcp
    No JBoss Enterprise Application Plataform 6, a pilha do protocolo default é definida pelo subsistema JGroups com o domain.xml ou standalone-ha.xml:
    <subsystem xmlns="urn:jboss:domain:jgroups:1.0" default-stack="udp">
        <stack name="udp">
            <!-- ... -->
        </stack>
    </subsystem>
    

3.2.7.2. Implantação de um HA Singleton

Sumário

No JBoss Enterprise Application Plataform 5, os arquivos HA singleton eram implantados no diretório deploy-hasingleton/ separados de outras implantações. Isto era realizado para prevenir a implantação automática e garantir que o serviço HASingletonDeployer controlava a implantação do arquivo e que arquivos fossem implantados apenas no nó mestre do cluster. Não havia recurso da implantação instantânea (hot deployment), de forma que a implantação solicitava a reinicialização do servidor. Além disso, caso o nó mestre falhasse solicitando outro nó a assumir posição do nó mestre, o serviço singleton tinha que passar por todo o processo de implantação com o objetivo de fornecer o serviço.

No JBoss Enterprise Application Plataform 6 isto foi alterado. O serviço de destino é instalado em cada nó no cluster, mas é apenas iniciado em um nó a cada período gerado, quando usando um SingletonService. Este procedimento simplifica as solicitações de implantação e reduz o período solicitado de relocação do serviço mestre singleton entre os nós.

Procedimento 3.23. Implantação do Serviço HA Singleton

  1. Grave o aplicativo do serviço HA singleton.

    Segue abaixo uma amostra simples de um Serviço que está encapsulado com o decorador SingletonService a ser implantado como um serviço singleton.
    1. Crie um serviço singleton.

      A seguinte listagem é uma amostra do serviço singleton:
      package com.mycompany.hasingleton.service.ejb;
      
      import java.util.concurrent.atomic.AtomicBoolean;
      import java.util.logging.Logger;
      
      import org.jboss.as.server.ServerEnvironment;
      import org.jboss.msc.inject.Injector;
      import org.jboss.msc.service.Service;
      import org.jboss.msc.service.ServiceName;
      import org.jboss.msc.service.StartContext;
      import org.jboss.msc.service.StartException;
      import org.jboss.msc.service.StopContext;
      import org.jboss.msc.value.InjectedValue;
      
      /**
       * @author <a href="mailto:wfink@redhat.com">Wolf-Dieter Fink</a>
       */
      public class EnvironmentService implements Service<String> {
          private static final Logger LOGGER = Logger.getLogger(EnvironmentService.class.getCanonicalName());
          public static final ServiceName SINGLETON_SERVICE_NAME = ServiceName.JBOSS.append("quickstart", "ha", "singleton");
          /**
           * A flag whether the service is started.
           */
          private final AtomicBoolean started = new AtomicBoolean(false);
      
          private String nodeName;
      
          private final InjectedValue<ServerEnvironment> env = new InjectedValue<ServerEnvironment>();
      
          public Injector<ServerEnvironment> getEnvInjector() {
              return this.env;
          }
      
          /**
           * @return the name of the server node
           */
          public String getValue() throws IllegalStateException, IllegalArgumentException {
              if (!started.get()) {
                  throw new IllegalStateException("The service '" + this.getClass().getName() + "' is not ready!");
              }
              return this.nodeName;
          }
      
          public void start(StartContext arg0) throws StartException {
              if (!started.compareAndSet(false, true)) {
                  throw new StartException("The service is still started!");
              }
              LOGGER.info("Start service '" + this.getClass().getName() + "'");
              this.nodeName = this.env.getValue().getNodeName();
          }
      
          public void stop(StopContext arg0) {
              if (!started.compareAndSet(true, false)) {
                  LOGGER.warning("The service '" + this.getClass().getName() + "' is not active!");
              } else {
                  LOGGER.info("Stop service '" + this.getClass().getName() + "'");
              }
          }
      }
      
      
    2. Crie um singleton EJB para iniciar o serviço como um SingletonServiço na iniciação do servidor.

      A seguinte listagem é uma amostra de um singleton EJB que inicia um Singleton na iniciação do servidor:
      package com.mycompany.hasingleton.service.ejb;
      
      import java.util.Collection;
      import java.util.EnumSet;
      
      import javax.annotation.PostConstruct;
      import javax.annotation.PreDestroy;
      import javax.ejb.Singleton;
      import javax.ejb.Startup;
      
      import org.jboss.as.clustering.singleton.SingletonService;
      import org.jboss.as.server.CurrentServiceContainer;
      import org.jboss.as.server.ServerEnvironment;
      import org.jboss.as.server.ServerEnvironmentService;
      import org.jboss.msc.service.AbstractServiceListener;
      import org.jboss.msc.service.ServiceController;
      import org.jboss.msc.service.ServiceController.Transition;
      import org.jboss.msc.service.ServiceListener;
      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      
      
      /**
       * A Singleton EJB to create the SingletonService during startup.
       * 
       * @author <a href="mailto:wfink@redhat.com">Wolf-Dieter Fink</a>
       */
      @Singleton
      @Startup
      public class StartupSingleton {
        private static final Logger LOGGER = LoggerFactory.getLogger(StartupSingleton.class);
      
        /**
         * Create the Service and wait until it is started.<br/>
         * Will log a message if the service will not start in 10sec. 
         */
        @PostConstruct
        protected void startup() {
          LOGGER.info("StartupSingleton will be initialized!");
      
          EnvironmentService service = new EnvironmentService();
          SingletonService<String> singleton = new SingletonService<String>(service, EnvironmentService.SINGLETON_SERVICE_NAME);
          // if there is a node where the Singleton should deployed the election policy might set,
          // otherwise the JGroups coordinator will start it
          //singleton.setElectionPolicy(new PreferredSingletonElectionPolicy(new NamePreference("node2/cluster"), new SimpleSingletonElectionPolicy()));
          ServiceController<String> controller = singleton.build(CurrentServiceContainer.getServiceContainer())
              .addDependency(ServerEnvironmentService.SERVICE_NAME, ServerEnvironment.class, service.getEnvInjector())
              .install();
      
          controller.setMode(ServiceController.Mode.ACTIVE);
          try {
            wait(controller, EnumSet.of(ServiceController.State.DOWN, ServiceController.State.STARTING), ServiceController.State.UP);
            LOGGER.info("StartupSingleton has started the Service");
          } catch (IllegalStateException e) {
            LOGGER.warn("Singleton Service {} not started, are you sure to start in a cluster (HA) environment?",EnvironmentService.SINGLETON_SERVICE_NAME);
          }
        }
      
        /**
         * Remove the service during undeploy or shutdown
         */
        @PreDestroy
        protected void destroy() {
          LOGGER.info("StartupSingleton will be removed!");
          ServiceController<?> controller = CurrentServiceContainer.getServiceContainer().getRequiredService(EnvironmentService.SINGLETON_SERVICE_NAME);
          controller.setMode(ServiceController.Mode.REMOVE);
          try {
            wait(controller, EnumSet.of(ServiceController.State.UP, ServiceController.State.STOPPING, ServiceController.State.DOWN), ServiceController.State.REMOVED);
          } catch (IllegalStateException e) {
            LOGGER.warn("Singleton Service {} has not be stopped correctly!",EnvironmentService.SINGLETON_SERVICE_NAME);
          }
        }
      
        private static <T> void wait(ServiceController<T> controller, Collection<ServiceController.State> expectedStates, ServiceController.State targetState) {
          if (controller.getState() != targetState) {
            ServiceListener<T> listener = new NotifyingServiceListener<T>();
            controller.addListener(listener);
            try {
              synchronized (controller) {
                int maxRetry = 2;
                while (expectedStates.contains(controller.getState()) && maxRetry > 0) {
                  LOGGER.info("Service controller state is {}, waiting for transition to {}", new Object[] {controller.getState(), targetState});
                  controller.wait(5000);
                  maxRetry--;
                }
              }
            } catch (InterruptedException e) {
              LOGGER.warn("Wait on startup is interrupted!");
              Thread.currentThread().interrupt();
            }
            controller.removeListener(listener);
            ServiceController.State state = controller.getState();
            LOGGER.info("Service controller state is now {}",state);
            if (state != targetState) {
              throw new IllegalStateException(String.format("Failed to wait for state to transition to %s.  Current state is %s", targetState, state), controller.getStartException());
            }
          }
        }
      
        private static class NotifyingServiceListener<T> extends AbstractServiceListener<T> {
          @Override
          public void transition(ServiceController<? extends T> controller, Transition transition) {
            synchronized (controller) {
              controller.notify();
            }
          }
        }
      }
      
      
    3. Crie um Bean de Sessão Stateless para acesso ao serviço a partir de um cliente.

      Segue abaixo uma amostra de um bean de sessão stateless que acessa o serviço de um cliente:
      package com.mycompany.hasingleton.service.ejb;
      
      import javax.ejb.Stateless;
      
      import org.jboss.as.server.CurrentServiceContainer;
      import org.jboss.msc.service.ServiceController;
      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      
      /**
       * A simple SLSB to access the internal SingletonService.
       * 
       * @author <a href="mailto:wfink@redhat.com">Wolf-Dieter Fink</a>
       */
      @Stateless
      public class ServiceAccessBean implements ServiceAccess {
          private static final Logger LOGGER = LoggerFactory.getLogger(ServiceAccessBean.class);
      
          public String getNodeNameOfService() {
              LOGGER.info("getNodeNameOfService() is called()");
              ServiceController<?> service = CurrentServiceContainer.getServiceContainer().getService(
                      EnvironmentService.SINGLETON_SERVICE_NAME);
              LOGGER.debug("SERVICE {}", service);
              if (service != null) {
                  return (String) service.getValue();
              } else {
                  throw new IllegalStateException("Service '" + EnvironmentService.SINGLETON_SERVICE_NAME + "' not found!");
              }
          }
      }
      
      
    4. Crie uma interface de lógica comercial para o SingletonService.

      A seguinte amostra é uma interface lógica comercial para o SingletonService:
      package com.mycompany.hasingleton.service.ejb;
      
      import javax.ejb.Remote;
      
      /**
       * Business interface to access the SingletonService via this EJB
       * 
       * @author <a href="mailto:wfink@redhat.com">Wolf-Dieter Fink</a>
       */
      @Remote
      public interface ServiceAccess {
          public abstract String getNodeNameOfService();
      } 
      
      
      
  2. Inicie cada instância do JBoss Enterprise Application Plataform 6 com o clustering habilitado.

    O método de ativação com cluster depende se os servidores forem autônomos ou rodando num storage domain.
    1. Habilite o clustering para servidores executando num storage domain.

      Você pode habilitar o clustering usando o Management CLI ou você pode editar manualmente o arquivo de configuração.
      • Habilite o clustering usando o Management CLI.

        1. Inicie o seu controlador de domain.

        2. Abra a janela comando para o seu sistema operacional.

        3. Conecte ao Management CLI passando o endereço IP do controlador de domain ou nome DNS.

          Nesta amostra, assuma que o endereço IP do controlador de domain é 192.168.0.14.
          • Insira a seguinte linha de comando para o Linux:
            $ EAP_HOME/bin/jboss-cli.sh --connect --controller=192.168.0.14
            $ Connected to domain controller at 192.168.0.14
            
          • Insira a seguinte linha de comando para o Windows:
            C:\>EAP_HOME\bin\jboss-cli.bat --connect --controller=192.168.0.14
            C:\> Connected to domain controller at 192.168.0.14
            
        4. Adicione o grupo de servidor main-server.

          [domain@192.168.0.14:9999 /] /server-group=main-server-group:add(profile="ha",socket-binding-group="ha-sockets") 
          {
              "outcome" => "success",
              "result" => undefined,
              "server-groups" => undefined
          }
          
        5. Crie um servidor nomeado server-one e adicione-o ao grupo do servidor main-server.

          [domain@192.168.0.14:9999 /]  /host=station14Host2/server-config=server-one:add(group=main-server-group,auto-start=false)
          {
              "outcome" => "success",
              "result" => undefined
          }
          
        6. Configure o JVM para o grupo do servidor main-server.

          [domain@192.168.0.14:9999 /] /server-group=main-server-group/jvm=default:add(heap-size=64m,max-heap-size=512m)
          {
              "outcome" => "success",
              "result" => undefined,
              "server-groups" => undefined
          }
          
        7. Crie um servidor nomeado server-two, coloque-o num grupo de servidor separado e configure a porta de deslocamento para 100.

          [domain@192.168.0.14:9999 /]  /host=station14Host2/server-config=server-two:add(group=distinct2,socket-binding-port-offset=100)
          {
              "outcome" => "success",
              "result" => undefined
          }
          
      • Habilite o clustering editando manualmente os arquivos de configuração do servidor.

        1. Interrompa o servidor do JBoss Enterprise Application Plataform.

          Importante

          Você deve interromper o servidor antes de editar o arquivo de configuração do servidor para que sua alteração seja persistida na iniciação do servidor.
        2. Abra o arquivo de configuração domain.xml para edição

          Determine um grupo de servidor para uso do seu perfil ha e grupo binding de socket ha-sockets conforme abaixo:
          <server-groups>
            <server-group name="main-server-group" profile="ha">
              <jvm name="default">
                <heap size="64m" max-size="512m"/>
              </jvm>
              <socket-binding-group ref="ha-sockets"/>
            </server-group>
          </server-groups>
          
          
        3. Abra o arquivo de configuração host.xml para edição

          Modifique o arquivo conforme o seguinte:
          <servers>
            <server name="server-one" group="main-server-group" auto-start="false"/>
            <server name="server-two" group="distinct2">
              <socket-bindings port-offset="100"/>
            </server>
          <servers>
          
          
        4. Inicie o servidor.

          • Digite EAP_HOME/bin/domain.sh para o Linux
          • Digite EAP_HOME\bin\domain.bat para o Microsoft Windows
    2. Ativação do cluster para servidores autônomos

      Para ativar o cluster para servidores autônomos, inicie o servidor usando o nome do nó e o arquivo da configuração standalone-ha.xml conforme abaixo:
      • Digite EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=UNIQUE_NODE_NAME para Linux
      • Digite EAP_HOME\bin\standalone.bat --server-config=standalone-ha.xml -Djboss.node.name=UNIQUE_NODE_NAME para Microsoft Windows

    Nota

    Configure o arquivo standalone-ha.xml para cada instância do servidor efetuar o bind numa interface separada, com o objetivo de evitar conflitos quando executando múltiplos servidores numa máquina. Alternativamente, você pode iniciar as instâncias do servidor subsequentes com uma porta de deslocamento usando o argumento conforme a seguinte linha de comando: -Djboss.socket.binding.port-offset=100.
  3. Implantação do aplicativo aos servidores

    Caso você use o Maven para implantar seu aplicativo, use o seguinte comando Maven para implantar o servidor rodando nas portas default:
    mvn clean install jboss-as:deploy
    Para implantar os servidores adicionais, passe o nome do servidor e o número da porta com a linha de comando:
    mvn clean package jboss-as:deploy -Ddeploy.hostname=localhost -Ddeploy.port=10099

3.2.8. Alterações do Desenvolvimento do estilo de Serviço

3.2.8.1. Atualização dos Aplicativos que usam as Implantações de estilo de Serviço

Sumário

Embora o JBoss Enterprise Application Plataform 6 não use mais os descritores de estilo de serviço, o contêiner suporta essas implantações de estilo de serviço sem alteração quando possível. Isto significa que se você usar descritores de implantação jboss-service.xml ou jboss-beans.xml em seu aplicativo do JBoss Enterprise Application Plataform 5.x, eles devem ser executados com pouca ou sem nenhuma modificação no JBoss Enterprise Application Plataform 6. Você pode continuar a empacotar os arquivos no EAR ou SAR, ou você pode substituir os arquivos diretamente no diretório de implantações. Caso você esteja executando um servidor autônomo, o diretório de implantações encontra-se no: EAP_HOME/standalone/deployments/. Caso você esteja executando um storage domain, a pasta de implantações encontra-se localizada no EAP_HOME/domain/deployments/.

3.2.9. Alterações da Invocação Remota

3.2.9.1. Migração dos Aplicativos Implantados do JBoss Enterprise Application Plataform 5 que realiza Invocações Remotas ao JBoss Enterprise Application Plataform 6

Sumário

Existem duas maneiras de tornar as invocações remotas ao servidor no JBoss Enterprise Application Plataform 6:

  • Você pode usar o novo API do cliente EJB específico do JBoss para realizar a invocação.
  • Você pode usar o JNDI para pesquisar um proxy para seu bean e invocar no proxy retornado.
Essa seção cobre a opção 2: alterações de codificação requeridas para os clientes que usam o JNDI.

No JBoss Enterprise Application Plataform 5, a interface remota do EJB foi limitada ao JNDI, por default, sob o nome "ejbName/local" para interfaces locais e "ejbName/remote" para interfaces remotas. O aplicativo do cliente pesquisa então o bean usando o "ejbName/remote".
No JBoss Enterprise Application Plataform 6, você pode usar o ejb:NAMESPACE_NAME para acesso remoto ao EJBs com a seguinte sintaxe: Para beans stateless:
ejb:<app-name>/<module-name>/<distinct-name>/<bean-name>!<fully-qualified-classname-of-the-remote-interface>

Para beans stateful:
ejb:<app-name>/<module-name>/<distinct-name>/<bean-name>!<fully-qualified-classname-of-the-remote-interface>?stateful

Os valores a serem substituídos na sintaxe acima são:
  • <app-name> - o nome do aplicativo dos EJBs implantados. Isto é tipicamente o nome ear sem o sufixo .ear, no entanto, o nome pode ser substituído no arquivo application.xml. Caso o aplicativo não seja implantado com um .ear, esse valor é uma sequência vazia. Vamos assumir que esta amostra não estava implantada como um EAR.
  • <module-name> - o nome do módulo dos EJBs implantados no servidor. Isto é tipicamente o nome jar da implantação EJB, sem o sufixo .jar, mas pode ser substituído usando o ejb-jar.xml. Nessa amostra, assuma que os EJBs foram implantados num jboss-as-ejb-remote-app.jar, de forma que o nome do módulo é jboss-as-ejb-remote-app.
  • <distinct-name> - é um nome distinto opcional para o EJB. Essa amostra não usa um nome distinto, portanto usa uma sequência vazia.
  • <bean-name> - por default é um nome de classe simples da classe de implantação do bean.
  • <fully-qualified-classname-of-the-remote-interface> - o nome da classe inteiramente qualificado de visualização remota.
Atualização do código do cliente

Assuma que você implantou o seguinte EJB stateless a um servidor do JBoss Enterprise Application Plataform 6. Perceba que isto o expõe uma visualização remota para o bean.

@Stateless
@Remote(RemoteCalculator.class)
public class CalculatorBean implements RemoteCalculator {
 
    @Override
    public int add(int a, int b) {
        return a + b;
    }
 
    @Override
    public int subtract(int a, int b) {
        return a - b;
    }
}
No JBoss Enterprise Application Plataform 5, a pesquisa EJB do cliente e a invocação foi codificada como o seguinte:
InitialContext ctx = new InitialContext();
RemoteCalculator calculator = (RemoteCalculator) ctx.lookup("CalculatorBean/remote");
int a = 204;
int b = 340;
int sum = calculator.add(a, b);
No JBoss Enterprise Application Plataform 6, a pesquisa do cliente e a invocação com o uso da informação descrita acima, é codificada como o seguinte:
final Hashtable jndiProperties = new Hashtable();
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
final Context context = new InitialContext(jndiProperties);
final String appName = "";
final String moduleName = "jboss-as-ejb-remote-app";
final String distinctName = "";
final String beanName = CalculatorBean.class.getSimpleName();
final String viewClassName = RemoteCalculator.class.getName();
final RemoteCalculator statelessRemoteCalculator =  (RemoteCalculator) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName);
 
int a = 204;
int b = 340;
int sum = statelessRemoteCalculator.add(a, b);
Caso o seu cliente estiver acessando um EJB stateful, você deve anexar "?stateful" ao final da pesquisa do contexto como abaixo:
final RemoteCalculator statefulRemoteCalculator =  (RemoteCalculator) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName + "?stateful")

Uma amostra de trabalho completa, incluindo ambos código do cliente e servidor pode ser encontrada nas Inicializações Rápidas. Para maiores informações, consulte Review the Quickstart Tutorials no capítulo Get Started Developing Applications do Development Guide para o JBoss Enterprise Application Plataform 6 no https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.
Para maiores informações sobre as invocações remotas usando o JNDI, refira-se ao Invoke a Session Bean Remotely using JNDI no capítulo Enterprise JavaBeans do Development Guide para o JBoss Enterprise Application Plataform 6 no https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.

3.2.9.2. Invoque o Bean de Sessão Remotamente usando o JNDI

Essa tarefa descreve como adicionar e suportar um cliente remoto para a invocação dos beans de sessão usando o JNDI. Essa tarefa assume que o projeto está sendo construído usando o Maven.
A inicialização rápida ejb-remote contém os projetos Maven operantes que demostram essa funcionalidade. A inicialização rápida contém projetos para ambos beans de sessão para implantação e ao cliente remoto.
Essa tarefa assume que os beans de sessão não requerem autenticação.

Pré-requisitos

Os seguintes pré-requisitos devem satisfazer o seguinte antes da inicialização:
  • Você deve possuir um projeto Maven criado e pronto para uso.
  • Configuração para o repositório Maven do JBoss Enterprise Application Plataform 6 já ter sido adicionada.
  • Os beans de sessão que você deseja invocar já terem sido implantados.
  • Os beans de sessão implantados devem implantar interfaces comerciais.
  • As interfaces comerciais remotas dos beans de sessão estão disponíveis como uma dependência Maven. Caso as interfaces comerciais remotas estiverem ainda disponíveis como um arquivo JAR, é recomendável adicionar o JAR ao seu repositório como um artefato. Refira-se à documentação Maven para as metas install:install-file como orientação, http://maven.apache.org/plugins/maven-install-plugin/usage.html
  • Você precisa saber do hostname e a porta JNDI do servidor hosting dos beans de sessão.
Você deverá configurar o projeto corretamente com o objetivo de invocar um bean de sessão de um cliente remoto.

Procedimento 3.24. Adição da Configuração do Projeto Maven para a Invocação Remota dos Beans de Sessão

  1. Adicione as dependências do projeto solicitadas

    O pom.xml para o projeto deve ser atualizado para incluir as dependências necessárias.
  2. Adicione o arquivo jboss-ejb-client.properties

    O API do cliente JBoss EJB espera encontrar um arquivo na raiz do projeto nomeado jboss-ejb-client.properties que contém a informação da conexão para o serviço JNDI. Adicione este arquivo ao diretório src/main/resources/ de seu projeto com o seguinte conteúdo.
    remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
    
    remote.connections=default
    
    remote.connection.default.host=localhost
    remote.connection.default.port = 4447
    remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
    
    
    Altere o portal e o nome do host para coincidir com o seu servidor. O 4447 é o número de porta default. Configure a linha SSL_ENABLED para true e descomente as linhas SSL_STARTTLS. A interface remota no contêiner suporta as conexões com e sem segurança usando a mesma porta.
  3. Adicione dependências para as interfaces comerciais

    Adicione as dependências Maven ao pom.xml para interfaces comerciais remotas dos beans de sessão.
    <dependency>
       <groupId>org.jboss.as.quickstarts</groupId>
       <artifactId>jboss-as-ejb-remote-server-side</artifactId>
       <type>ejb-client</type>
       <version>${project.version}</version>
    </dependency>
    
Agora que o projeto já foi configurado corretamente, você pode adicionar o código de acesso e invocar os beans de sessão.

Procedimento 3.25. Obtenção de um Proxy Bean usando o JNDI e Métodos de Invocação do Bean

  1. Manuseia as exceções checadas

    Os métodos usados no seguinte código (InitialContext() e lookup()) possuem uma exceção de checagem do tipo javax.naming.NamingException. Essas chamadas de método devem tanto ser inseridas num bloco de tentativa/captura que captura o NamingException ou num método que é declarado ao lançar o NamingException. A inicialização rápida ejb-remote usa a segunda técnica.
  2. Criação do Contexto JNDI

    O objetivo do Contexto JNDI fornece o mecanismo de solicitação de recursos a partir do servidor. Crie um contexto JNDI usando o seguinte código:
    final Hashtable jndiProperties = new Hashtable();
    jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
    final Context context = new InitialContext(jndiProperties);
    
    As propriedades de conexão para o serviço JNDI são lidas a partir do arquivo jboss-ejb-client.properties.
  3. Use o método lookup() do Contextp JNDI para obter um proxy de bean

    Invoque o método lookup() do proxy do bean e passe-o ao nome JNDI do bean de sessão que você requer. Isto retornará um objeto que deve ser convertido ao tipo de interface comercial remota que contém os métodos que você deseje invocar.
    
    final RemoteCalculator statelessRemoteCalculator = (RemoteCalculator) context.lookup(
        "ejb:/jboss-as-ejb-remote-server-side/CalculatorBean!" + 
        RemoteCalculator.class.getName());
    
    
    Os nomes do JNDI do bean de sessão são definidos usando a síntese especial.
  4. Métodos de Invocação

    Agora que você possui um objeto de bean de proxy você pode invocar qualquer um dos métodos contidos na interface comercial remota.
    int a = 204;
    int b = 340;
    System.out.println("Adding " + a + " and " + b + " via the remote stateless calculator deployed on the server");
    int sum = statelessRemoteCalculator.add(a, b);
    System.out.println("Remote calculator returned sum = " + sum);
    
    O bean passa a solicitação de invocação do método ao bean de sessão no servidor, onde isto é executado. O resultado é retornado ao bean do proxy que então o retorna ao chamador. A comunicação entre o bean de proxy e o bean de sessão remota é transparente ao chamador.
Agora você deve estar apto a configurar o projeto Maven para suportar a invocação dos beans de sessão num servidor remoto e escrever a invocação do código nos métodos de beans de sessão usando o bean proxy restaurado a partir do servidor usando o JNDI.

3.2.10. Alterações EJB 2.x

3.2.10.1. Atualização dos Aplicativos que usam o EJB 2.x

O JBoss Enterprise Apllication Plataform 6 fornece suporte para o EJB 2.x. No entanto, você precisa realizar algumas modificações no código e iniciar o servidor com o perfil completo.

Procedimento 3.26. Execute o EJB 2.x no JBoss Enterprise Application Plataform 6

  1. Modifique o Código em uso para as Novas Regras do JNDI Namespace

    A partir do EJB 3.0, você deverá usar o prefixo completo do JNDI com o EJB 2.x. Consulte a Seção 3.1.8.1, “Atualização dos Nomes JNDI Namespace do Aplicativo” para maiores informações sobre as amostras de regras e códigos do JNDI.
    As amostras que apresentam como atualizar os JNDI namespaces a partir das liberações antigas podem ser encontradas na Seção 3.1.8.5, “Amostras do JNDI Namespaces nas Versões Anteriores e como elas são especificadas no JBoss Enterprise Application Plataform.”.
  2. Substitua os Interceptores do JBoss AOP

    O JBoss AOP (Aspect Oriented Programming - Programação Orientada do Aspecto) não está mais incluído no JBoss Enterprise Application Plataform 6. Nas liberações anteriores, o JBoss AOP era usado pelo contêiner EJB. No entanto, no JBoss Enterprise Application Plataform 6, o contêiner EJB usa um novo mecanismo. Caso o seu aplicativo usar o JBoss AOP, você precisará modificar o seu código do aplicativo como abaixo.

    • As configurações EJB3 padrões que eram realizadas no arquivo ejb3-interceptors-aop.xml são agora realizadas no arquivo de configuração. Isto é um arquivo standalone/configuration/standalone-full.xml para o servidor autônomo. Caso você esteja executando o seu servidor num storage domain, este é o arquivo domain/configuration/domain.xml.
    • Os aplicativos que integram os interceptores na camada EJB devem ser redesignados para uso dos interceptores EJB3 e CDI. Os interceptores ao lado do servidor podem ser alterados para os interceptores EJB3.
  3. Modificação do Descritor do Arquivo jboss-web.xml

    Modifique o <jndi-name> para cada <ejb-ref> usar o novo formato de observação inteiramente qualificado JNDI.
  4. Substitua o arquivo do descritor da implantação jboss.xml

    O descritor da implantação jboss-ejb3.xml substitui o descritor da implantação jboss.xml para substituição e adição à recursos fornecidos pelo Java Enterprise Edition (EE - Edição do Java Enterprise) definidos no descritor da implantação ejb-jar.xml. O novo arquivo é incompatível com o jboss.xml e o jboss.xml é agora ignorado nas implantações.
  5. Inicie o Servidor com os Perfis Completos

    O EJB 2.x requer o Perfil Completo da Edição do Java Enterprise 6. Passe o argumento -c standalone-full.xml à linha de comando quando iniciando o servidor, com o objetivo de iniciar o JBoss Enterprise Application Plataform 6 com o perfil completo.

3.2.11. Aplicativos Seam 2.2 de Migração

3.2.11.1. Migração dos Arquivos Seam 2.2 para o JBoss Enterprise Application Plataform 6

Visão Geral

Quando você migrar um aplicativo Seam 2.2, você precisa configurar a fonte de dados e especificar quaisquer dependências de módulo. Você precisa determinar também se o aplicativo possui quaisquer dependências em arquivos que não lançam o JBoss Enterprise Application Plataform 6 e copiar quaisquer JARs dependentes no diretório lib/ do aplicativo.

Importante

Os aplicativos que usam o Hibernate diretamente com o Seam 2.2 podem usar a versão do Hibernate 3 empacotados dentro do aplicativo. O Hibernate 4, que é fornecido através do módulo org.hibernate do JBoss Enterprise Application Plataform 6, não é suportado pelo Seam 2.2. Esta amostra possui por intenção ajudá-lo executar o seu aplicativo no JBoss Enterprise Application Plataform 6 como primeira etapa. Por favor certifique-se de que o empacotamento do Hibernate 3 com o aplicativo Seam 2.2 não é uma configuração suportada.

Procedimento 3.27. Migração dos Arquivos Seam 2.2

  1. Atualização da configuração da fonte de dados

    Algumas das amostras Seam 2.2 usam a fonte de dados JDBC default nomeada java:/ExampleDS. A fonte de dados default foi alterada no JBoss Enterprise Application Plataform 6 para java:jboss/datasources/ExampleDS. Caso seu aplicativo usar a fonte de dados da amostra, você pode realizar o seguinte:
    • Caso você deseje usar um banco de dados de amostra que lança o JBoss Enterprise Application Plataform 6, modifique o arquivo META-INF/persistence.xml para substituir o elemento jta-data-source existente com o nome JNDI da fonte de dados do banco de dados de amostra:
      <!-- <jta-data-source>java:/ExampleDS</jta-data-source> -->
      <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
      
    • Caso você preferir manter um banco de dados existente, você pode adicionar a definição da fonte de dados ao arquivo EAP_HOME/standalone/configuration/standalone.xml.

      Importante

      Você deve interromper o servidor antes de editar o arquivo de configuração do servidor para a sua alteração ser persistente na iniciação do servidor.
      A seguinte definição é uma cópia da fonte de dados HSQL default definida no JBoss Enterprise Application Plataform 6:
      <datasource name="ExampleDS" jndi-name="java:/ExampleDS" enabled="true" jta="true" use-java-context="true" use-ccm="true">
         <connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1</connection-url>
         <driver>h2</driver>
         <security>
            <user-name>sa</user-name>
            <password>sa</password>
         </security>
      </datasource>
      
    • Você pode também adicionar a definição da fonte de dados usando a interface da linha de comando jbossadmin. Segue abaixo uma amostra da sintaxe que você deve usar para adicionar a fonte de dados. O "\" no final da linha indica a continuação do comando na linha seguinte.

      Exemplo 3.1. Amostra da sintaxe para adição da definição da fonte de dados

      $ EAP_HOME/bin/jboss-cli --connect 
      [standalone@localhost:9999 /] data-source add --name=ExampleDS --jndi-name=java:/ExampleDS \ 
            --connection-url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1 --driver-name=h2 \ 
            --user-name=sa --password=sa
      
    Para maiores informações de como configurar a fonte de dados, consulte a Seção 3.1.6.2, “Atualização da Configuração da Fonte de Dados”.
  2. Adição de quaisquer dependências requeridas

    Uma vez que os aplicativos Seam 2.2 usam o JSF 1.2, você precisa adicionar dependências para os módulos JSF 1.2 e excluir os módulos JSF 2.0. Para completar este procedimento, você precisa criar um arquivo jboss-deployment-structure.xml no diretório META-INF/ do EAR que contém os seguintes dados:
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
      <deployment>
          <dependencies>
            <module name="javax.faces.api" slot="1.2" export="true"/>
                  <module name="com.sun.jsf-impl" slot="1.2" export="true"/>
          </dependencies>
      </deployment>
      <sub-deployment name="jboss-seam-booking.war">
        <exclusions>
            <module name="javax.faces.api" slot="main"/>
                  <module name="com.sun.jsf-impl" slot="main"/>
          </exclusions>
          <dependencies>
            <module name="javax.faces.api" slot="1.2"/>
                  <module name="com.sun.jsf-impl" slot="1.2"/>
          </dependencies>
      </sub-deployment>
    </jboss-deployment-structure>
    
    Caso seu aplicativo usar frameworks de registro em log de terceiros, você precisa adicionar as dependências descritas na: Seção 3.1.4.1, “Modificação das Dependências de Registro em Log”.
  3. Caso o seu aplicativo usar o Hibernate 3.x, primeiro tente executar o aplicativo usando as bibliotecas do Hibernate 4

    Caso o seu aplicativo não usar o Contexto Persistente Gerenciado Seam, busca Hibernate, validação ou quaisquer outros recursos com o Hibernate 4, você pode estar apto a executar com as bibliotecas do Hibernate 4. No entanto, caso você observar o ClassNotFoundExceptions ou ClassCastExceptions que direcionam às classes Hibernate ou verificar erros similares aos seguintes, você terá que seguir as instruções da próxima etapa e modificar o seu aplicativo para uso das bibliotecas do Hibernate 3.3.
            Caused by: java.lang.LinkageError: loader constraint violation in interface itable initialization: when resolving method "org.jboss.seam.persistence.HibernateSessionProxy.getSession(Lorg/hibernate/EntityMode;)Lorg/hibernate/Session;" the class loader (instance of org/jboss/modules/ModuleClassLoader) of the current class, org/jboss/seam/persistence/HibernateSessionProxy, and the class loader (instance of org/jboss/modules/ModuleClassLoader) for interface org/hibernate/Session have different Class objects for the type org/hibernate/Session used in the signature
    
  4. Cópia dos arquivos dependentes a partir dos frameworks externos ou de outras localizações

    Caso o seu aplicativo usar o Hibernate 3.x e você não estiver apto a usar o Hibernate 4 com sucesso no seu aplicativo, você precisará usar uma cópia do Hibernate 3-x JARs no diretório /lib e excluir o módulo Hibernate na seção de implantações do META-INF/jboss-deployment-structure.xml, conforme o seguinte:
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
     <deployment>
       <exclusions>
         <module name="org.hibernate"/>
       </exclusions>
     <deployment>
    </jboss-deployment-structure>
    
    Não existe nenhuma etapa adicional que você deve realizar quando você aplicar o bundle no seu aplicativo. Consulte a Seção 3.2.2.2, “Configuração das Alterações para Aplicativos que usam o Hibernate e o JPA” para maiores informações.
  5. Depuração e resolução dos erros Seam 2.2 JNDI

    Quando você migrar o aplicativo Seam 2.2, você poderá ver erros javax.naming.NameNotFoundException no log conforme o seguinte:
    javax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''
    Caso você não deseje modificar as pesquisas JNDI através do código, você pode modificar o arquivo components.xml do aplicativo, conforme abaixo:
    1. Substituição do elemento core-init existente

      Primeiro, você pode substituir o elemento core-init existente, conforme abaixo:
      <!-- <core:init jndi-pattern="jboss-seam-booking/#{ejbName}/local" debug="true" distributable="false"/>   -->
      <core:init debug="true" distributable="false"/>
      
      
    2. Encontre as mensagens INFO JNDI binding INFO no log do servidor

      A seguir, encontre as mensagens INFO binding JNDI que são emitidas no log do servidor quando o aplicativo é implantado. As mensages binding JNIDI devem parecer-se com o seguinte:
      INFO org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor (MSC service thread 1-1) JNDI bindings for session bean
      named AuthenticatorAction in deployment unit subdeployment "jboss-seam-booking.jar" of deployment "jboss-seam-booking.ear" are as follows:
          java:global/jboss-seam-booking/jboss-seam-booking.jar/AuthenticatorAction!org.jboss.seam.example.booking.Authenticator
          java:app/jboss-seam-booking.jar/AuthenticatorAction!org.jboss.seam.example.booking.Authenticator
          java:module/AuthenticatorAction!org.jboss.seam.example.booking.Authenticator
          java:global/jboss-seam-booking/jboss-seam-booking.jar/AuthenticatorAction
          java:app/jboss-seam-booking.jar/AuthenticatorAction
          java:module/AuthenticatorAction
      
    3. Adição dos elementos do componente

      Para cada mensagem INFO binding JNIDI, adicione um elemento component correspondente ao arquivo components.xml:
      <component class="org.jboss.seam.example.booking.AuthenticatorAction" jndi-name="java:app/jboss-seam-booking.jar/AuthenticatorAction" />
      
    Para maiores informações sobre como depurar e resolver os problemas de migração, consulte a Seção 4.2.1, “Depuração e Solução dos Problemas de Migração”.
    Para uma lista de problemas de migração conhecidos com os arquivos, consulte a Seção 3.2.11.2, “Problemas de Migração do Seam 2.2 Archive”.
Resultado

O arquivo Seam 2.2 é implantado e executado com êxito no JBoss Enterprise Application Plataform 6.

3.2.11.2. Problemas de Migração do Seam 2.2 Archive

O Seam 2.2 Drools e Java 7 não são compatíveis
O Seam 2.2 Drools e Java 7 são incompatíveis e falham com um org.drools.RuntimeDroolsException: o valor '1.7' não é um erro de nível de linguagem válido.
O Seam 2.2.5 determinado como cglib.jar não permite o funcionamento da amostra Spring
Quando a amostra Spring estiver executando usando o cglib.jar assinado que lançou o Seam 2.2.5 no JBoss Enterprise Application Plataform 5, ocorre uma falha com a seguinte causa:
java.lang.SecurityException: class "org.jboss.seam.example.spring.UserService$$EnhancerByCGLIB$$7d6c3d12"'s signer information does not match signer information of other classes in the same package
A solução para este problema é sair do cglib.jar, conforme abaixo:
zip -d $SEAM_DIR/lib/cglib.jar META-INF/JBOSSCOD\*
A amostra Seambay falha com o NotLoggedInException
A causa deste problema é o cabeçalho da mensagem estar nulo enquanto processando a mensagem no SOAPRequestHandler e, consequentemente, a ID de conversação não ser enviada.
Para resolver esse problema substitua o org.jboss.seam.webservice.SOAPRequestHandler.handleOutbound, conforme descrito no https://issues.jboss.org/browse/JBPAPP-8376.
A amostra Seambay falha com o UnsupportedOperationException: nenhuma transação
Este problema é causado pelas alterações no nome JNDI do UserTransaction no JBoss Enterprise Application Plataform 6.
A solução para este problema é substituir o org.jboss.seam.transaction.Transaction.getUserTransaction, conforme descrito no https://issues.jboss.org/browse/JBPAPP-8322.
A amostra Seambay falha com o NotLoggedInException
A causa deste problema é o cabeçalho da mensagem estar nulo enquanto processando a mensagem no SOAPRequestHandler e, consequentemente, a ID de conversação não ser enviada.
Para resolver esse problema substitua o org.jboss.seam.webservice.SOAPRequestHandler.handleOutbound, conforme descrito no https://issues.jboss.org/browse/JBPAPP-8376.
A amostra de tarefas lança o org.jboss.resteasy.spi.UnhandledException: não foi possível cancelar o marshall da mensagem solicitada
Este problema é causado pelo incompatibilidade entre o seam-resteasy-2.2.5 incluído no JBoss Enterprise Application Plataform 5.1.2) e o RESTEasy 2.3.1.GA incluído no JBoss Enterprise Application Plataform 6.
Para solucionar este problema use jboss-deployment-structure.xml para excluir resteasy-jaxrs, resteasy-jettison-provider e resteasy-jaxb-provider da implantação principal e resteasy-jaxrs, resteasy-jettison-provider, resteasy-jaxb-provider e resteasy-yaml-provider do jboss-seam-tasks.war, conforme descrito no https://issues.jboss.org/browse/JBPAPP-8315. Então, é necessário incluir as bibliotecas RESTEasy empacotadas com o Seam 2.2 no EAR.
Deadlock entre o org.jboss.seam.core.SynchronizationInterceptor e bloqueio EJB da instância de componente stateful durante uma solicitação AJAX
Uma página de erro "Causado pelo javax.servlet.ServletException" é exibida com a mensagem: "javax.el.ELException: /main.xhtml @36,71 value="#{hotelSearch.pageSize}": org.jboss.seam.core.LockTimeoutException: não foi possível adquirir o bloqueio no componente @Synchronized hotelSearch" ou com mensagem de erro similar.
O problema é que o Seam 2 realiza o próprio bloqueio fora do bloqueio bean de sessão stateful (SFSB) e com escopo diferente. Isto significa que se um thread acessar um EJB duas vezes na mesma transação, após a primeira invocação isto terá o SFSB bloqueado, mas o seam não será bloqueado. Um segundo thread pode adquirir o bloqueio seam, que então atingirá o bloqueio EJB e entrará em espera. Quando o primeiro thread tentar sua segunda invocação, ele bloqueará no deadlock e interceptor seam 2. No Java EE 5, os EJBs lançariam uma exceção imediatamente no acesso atual. Esse comportamento foi alterado no Java EE 6.
Para solucionar este problema, adicione o @AccessTimeout(0) ao EJB. Isto fará com que o ConcurrentAccessException seja lançado imediatamente quando esta situação ocorrer.
A amostra Dvdstore cria falhas ordenadas com o javax.ejb.EJBTransactionRolledbackException
A amostra do dvdstore display o seguinte erro:
JBAS011437: Found extended persistence context in SFSB invocation call stack but that cannot be used because the transaction already has a transactional context associated with it. This can be avoided by changing application code, either eliminate the extended persistence context or the transactional context. See JPA spec 2.0 section 7.6.3.1.
Este problema é devido às alterações na especificação JPA.
A solução para este problema é alterar o contexto de persistência para transactional no CheckoutAction e classes ShowOrdersAction e usar a operação de mesclagem do gerenciador de entidade nos métodos cancelOrder e detailOrder.
O provedor do JBoss Cache Seam Cache não pode ser usado no JBoss Enterprise Application Plataform 6
O JBoss Cache não é suportado no JBoss Enteprise Application Plataform 6. Isto leva o provedor do JBoss Cache Seam a falhar no aplicativo Seam do servidor do aplicativo com:
java.lang.NoClassDefFoundError: org/jboss/util/xml/JBossEntityResolver
.
O Hibernate 3.3.x Auto scan para o problema das entidades JPA com a JBoss Enterprise Aplication Plataform 6
A correção para este problema é listar todas as classes no arquivo persistence.xml manualmente. Por exemplo:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
    <persistence-unit name="example_pu">
        <description>Hibernate 3 Persistence Unit.</description>
        <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
        <properties>
            <property name="jboss.as.jpa.providerModule" value="hibernate3-bundled" />
        </properties>
        <class>com.acme.Foo</class>
        <class>com.acme.Bar</class>
    </persistence-unit>
</persistence>

3.2.12. Aplicativos Spring de Migração

3.2.12.1. Aplicativos Spring de Migração

A informação a respeito da migração dos aplicativos Spring pode ser encontrada na documentação JBoss Web Framework Kit. Você pode baixar este documento a partir do Portal do Cliente no https://access.redhat.com. Clique em KnowledgeProduct Documentation, encontre o JBoss Enterprise Middleware e clique no link JBoss Web Framework Kit.

3.2.13. Outras Alterações que Afetam a Migração

3.2.13.1. Outras alterações que podem afetar sua Migração

Segue abaixo uma lista de alterações do JBoss Enterprise Application Plataform 6 que podem afetar suas etapas de migração.

3.2.13.2. Alteração do Nome Maven Plug-in

O jboss-maven-plugin não foi atualizado e não funciona no JBoss Enterprise Application Plataform 6. Você deve usar o org.jboss.as.plugins:jboss-as-maven-plugin para implantar ao diretório correto.

3.2.13.3. Modificação dos Aplicativos do Cliente

Caso deseje migrar um aplicativo de cliente que conectará ao JBoss Enterprise Application Plataform 6, você deve estar ciente que o nome e a localização do JAR que agrupam as bibliotecas dos clientes foram alterados. Esse JAR é agora nomeado jboss-client.jar e está localizado no diretório JBOSS_HOME/bin/client/. Isto substitui o JBOSS_HOME/client/jbossall-client.jar e contém todas as dependências requeridas ao conectar ao JBoss Enterprise Application Plataform 6 a partir do cliente remoto.

Capítulo 4. Ferramentas e Dicas

4.1. Recursos para Assisti-lo com a Migração

4.1.1. Recursos que podem assisti-lo em sua Migração

Segue abaixo uma lista de recursos que podem orientá-lo na migração de um aplicativo para o JBoss Enterprise Application Plataform 6.
Ferramentas
Existem diversas ferramentas que ajudam automaticamente algumas das alterações da configuração. Consulte a Seção 4.1.2, “Familiarize-se com as Ferramentas que podem assisti-lo na Migração” para maiores informações.
Dicas de Depuração
Para uma lista das causas e resoluções de problemas e erros você poderá encontrar enquanto migrando o seu aplicativo, consulte a Seção 4.2.1, “Depuração e Solução dos Problemas de Migração”.
Amostra de Migração
Para amostras de aplicativos que foram migrados ao JBoss Enterprise Application Plataform, consulte a Seção 4.3.1, “Revise a Migração dos Aplicativos da Amostra”.

4.1.2. Familiarize-se com as Ferramentas que podem assisti-lo na Migração

Sumário

Existem algumas ferramentas que podem assisti-lo no processo de sua migração. Segue abaixo uma lista dessas ferramentas juntamente com a descrição do que elas fazem.

Tattletale
Você precisa encontrar e retificar as dependências do aplicativo com a mudança no carregamento de classe modular. O Tattletale pode ajudá-lo a identificar os nomes do módulo de dependência e gerar o XML da configuração para seu aplicativo.
Ferramenta de Migração IronJacamar
No JBoss Enterprise Application Plataform 6, as fontes de dados e adaptadores de recurso não são mais configurados em um arquivo separado. Eles estão apenas definidos no arquivo de configuração do servidor e usam novos esquemas. A Ferramenta de Migração IronJacamar pode ajudar a converter a configuração antiga em um formato esperado pelo JBoss Enterprise Application Plataform 6.

4.1.3. Uso do Tattle para encontrar Dependências do Aplicativo

Sumário

Devido às alterações de carregamento de classe no JBoss Enterprise Application Plataform 6, você poderá ver os traços do ClassNotFoundException ou ClassCastException no log do Jboss quando você migrar o seu aplicativo. Para resolver esses erros, você precisa encontrar os JARs que contém as classes especificadas pelas exceções.

O Tattletale é uma excelente ferramenta de terceiros que escaneia recursivamente o seu aplicativo e fornece relatórios detalhados sobre seu conteúdo. O Tattletale 1.2.0.Beta2 ou mais avançado contém suporte adicional para orientação com o novo carregamento da classe de Módulos do JBoss usados no JBoss Enterprise Application Plataform 6. O relatório do "JBoss EAP 6" do Tattletale pode ser usado para identificar automaticamente e gerar os nomes do módulo de dependência para inclusão de seu arquivo jboss-deployment-structure.xml do aplicativo.

Procedimento 4.1. Instalação e execução do Tattletale para encontrar dependências do aplicativo

Nota

O Tattletale é uma ferramenta de terceiros e não é suportada como parte do JBoss Enterprise Application Plataform 6. Leia o website http://www.jboss.org/tattletale para a documentação mais recente de como instalar e usar o Tattletale.

4.1.4. Download e Instalação do Tattletale

Procedimento 4.2. 

  1. Realize o download do Tattletale de versão 1.2.0.Beta2 ou mais recente a partir do http://sourceforge.net/projects/jboss/files/JBoss%20Tattletale.
  2. Descomprima o arquivo ao diretório de sua escolha.
  3. Modifique o arquivo TATTLETALE_HOME/jboss-tattletale.properties realizando o seguinte:
    1. Adicione o ee6 e as7 à propriedade profiles.
      profiles=java5, java6, ee6, as7
    2. Descomente as propriedades scan e reports.

Nota

O Tattletale é uma ferramenta de terceiros e não é suportada como parte do JBoss Enterprise Application Plataform 6. Leia o website http://www.jboss.org/tattletale para a documentação mais recente de como instalar e usar o Tattletale.

4.1.5. Criação e Revisão do Relatório Tattletale

Procedimento 4.3. 

  1. Crie um relatório Tattletale emitindo o comando: java -jar TATTLETALE_HOME/tattletale.jarAPPLICATION_ARCHIVEOUTPUT_DIRECTORY
    Por exemplo: java -jar tattletale-1.2.0.Beta2/tattletale.jar applications/jboss-seam-booking.ear output-results/
  2. Num navegador, abra o arquivo OUTPUT_DIRECTORY/index.html e clique em "JBoss EAP 6" na seção "Reports".
    1. A coluna na esquerda lista os arquivos usados pelo aplicativo. Clique no link ARCHIVE_NAME para detalhes de visualização sobre o arquivo, tal como sua localização, informação de manifesto e classes que isto contém.
    2. O link jboss-deployment-structure.xml na coluna da direita apresenta como especificar a dependência do módulo para o arquivo nomeado na coluna da esquerda. Clique neste link para verificar como definir a informação do módulo de dependência da implantação para este arquivo.

Nota

O Tattletale é uma ferramenta de terceiros e não é suportado como parte do EAP 6. Para a maioria da documentação sobre como instalar e usar o Tattletale, visite o website Tattletale no http://www.jboss.org/tattletale.

4.1.6. Uso da Ferramenta IronJacamar para Migração da Fonte de Dados e Configurações do Adaptador de Recurso

Sumário

Nas versões anteriores do servidor do aplicativo, as fontes de dados e adaptadores de recurso eram configurados e implantados usando um arquivo com sufixo *-ds.xml. A distribuição IronJacamar 1.1 contém uma ferramenta de migração que pode ser usada para converter esses arquivos de configuração ao formato esperado pelo JBoss Enterprise Application Plataform 6. As ferramentas analisam o arquivo de configuração da fonte a partir do lançamento anterior, e cria e grava a configuração XML a um arquivo resultante num novo formato. Esse XML pode ser copiado e colado sob o subsistema no arquivo de configuração do servidor do JBoss Enterprise Application Plataform 6. Essas ferramentas fazem o seu melhor trabalho para converter atributos e elementos antigos em novo formato. No entanto, pode ser necessário realizar modificações adicionais ao arquivo gerado.

Nota

A ferramenta de Migração IronJacamar é uma ferramenta de terceiros e não é suportada como parte do JBoss Enterprise Application Plataform 6. Para maiores informações sobre o IronJacamar, consulte http://www.jboss.org/ironjacamar. Para maiores informações da documentação mais recente de como instalar e usar essa ferramenta, consulte http://docs.jboss.org/ironjacamar/userguide/1.1/en-US/html/tools.html#tools_migration.

4.1.7. Download e Instalação da Ferramenta de Migração IronJacamar

Nota

A ferramenta de migração está apenas disponível na versão IronJacamar 1.1 ou superior.

Procedimento 4.5. 

  1. Baixe o IronJacamar 1.1 ou distribuição ampla a partir do: http://www.jboss.org/ironjacamar/downloads/
  2. Descomprime o arquivo baixado num diretório de sua escolha.
  3. Encontre o script conversor na distribuição IronJacamar.
    • O script Linux está localizado no: IRONJACAMAR_HOME/doc/as/converter.sh
    • O arquivo em lote do Windows está localizado no: IRONJACAMAR_HOME/doc/as/converter.bat

Nota

A ferramenta de Migração IronJacamar é uma ferramenta de terceiros e não é suportada como parte do JBoss Enterprise Application Plataform 6. Para maiores informações sobre o IronJacamar, consulte http://www.jboss.org/ironjacamar. Para maiores informações da documentação mais recente de como instalar e usar essa ferramenta, consulte http://docs.jboss.org/ironjacamar/userguide/1.1/en-US/html/tools.html#tools_migration.

4.1.8. Uso da Ferramenta de Migração IronJacamar para converter um Arquivo de Configuração da Fonte de Dados

Procedimento 4.6. 

  1. Abra uma linha de comando e navegue ao diretório IRONJACAMAR_HOME/docs/as/.
  2. Execute o script conversor digitando o seguinte comando:
    • No Linux: ./converter.sh -ds SOURCE_FILE TARGET_FILE
    • No Microsoft Windows: ./converter.bat -ds SOURCE_FILE TARGET_FILE
    O SOURCE_FILE é o arquivo -ds.xml da fonte de dados do lançamento anterior. O TARGET_FILE contém uma nova configuração.
    Por exemplo, para converter o arquivo de configuração da fonte de dados jboss-seam-booking-ds.xml localizado no diretório atual, você digitaria:
    • No Linux: ./converter.sh -ds jboss-seam-booking-ds.xml new-datasource-config.xml
    • No Microsoft Windows: ./converter.bat -ds jboss-seam-booking-ds.xml new-datasource-config.xml
    Perceba que o parâmetro para a conversão da fonte de dados é -ds.
  3. Copie o elemento <datasource> a partir do arquivo de destino e cole-o no arquivo de configuração do servidor sob o elemento <subsystem xmlns="urn:jboss:domain:datasources:1.0"><datasources>.

    Importante

    Você deve interromper o servidor antes de editar o arquivo de configuração do servidor para que sua alteração seja persistida na inicialização do servidor.
    • Caso você esteja executando num storage domain, copie o XML no arquivo EAP_HOME/domain/configuration/domain.xml.
    • Caso você esteja executando num servidor autônomo, copie o XML no arquivo EAP_HOME/standalone/configuration/standalone.xml.
  4. Modificação do XML gerado ao novo arquivo de configuração.
    Segue abaixo uma amostra do arquivo de configuração da fonte de dados jboss-seam-booking-ds.xml para a amostra do Seam 2.2 Booking que foi lançado com o JBoss Enterprise Application Plataform 5.x:
    <?xml version="1.0" encoding="UTF-8"?>
    <datasources>
      <local-tx-datasource>
        <jndi-name>bookingDatasource</jndi-name>
        <connection-url>jdbc:hsqldb:.</connection-url>
        <driver-class>org.hsqldb.jdbcDriver</driver-class>
        <user-name>sa</user-name>
        <password></password>
      </local-tx-datasource>
    </datasources>
    
    Segue abaixo o arquivo de configuração que foi gerado pela execução do script conversor. O arquivo gerado contém um elemento <driver-class>. A maneira preferida de definir a classe do driver no JBoss Enterprise Application Plataform 6 é usar um elemento <driver>. Segue abaixo o XML resultando no arquivo de configuração do JBoss Enterprise Application Plataform 6 com modificações para comentar o elemento <driver-class> e adicionar o elemento <driver>:
    <subsystem xmlns="urn:jboss:domain:datasources:1.0">
      <datasources>
        <datasource enabled="true" jndi-name="java:jboss/datasources/bookingDatasource" jta="true"
                pool-name="bookingDatasource" use-ccm="true" use-java-context="true">
          <connection-url>jdbc:hsqldb:.</connection-url>
          <!-- Comment out the following driver-class element 
               since it is not the preferred way to define this.
               <driver-class>org.hsqldb.jdbcDriver</driver-class>     -->
          <transaction-isolation>TRANSACTION_NONE</transaction-isolation>
          <pool>
            <prefill>false</prefill>
            <use-strict-min>false</use-strict-min>
            <flush-strategy>FailingConnectionOnly</flush-strategy>
          </pool>
          <security>
            <user-name>sa</user-name>
            <password/>
          </security>
          <validation>
            <validate-on-match>false</validate-on-match>
            <background-validation>false</background-validation>
            <use-fast-fail>false</use-fast-fail>
          </validation>
          <timeout/>
          <statement>
            <track-statements>false</track-statements>
          </statement>
        </datasource>
        <drivers>
          <!-- The following driver element was not in the 
         XML target file. It was created manually. -->
          <driver name="h2" module="com.h2database.h2">
            <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
            </driver>
          </drivers>
      </datasources>
    </subsystem>
    
    

Nota

A ferramenta de Migração IronJacamar é uma ferramenta de terceiros e não é suportada como parte do JBoss Enterprise Application Plataform 6. Para maiores informações a respeito do IronJacamar, dirija-se ao http://www.jboss.org/ironjacamar. Para maiores informações de como instalar e usar essa ferramenta, consulte http://docs.jboss.org/ironjacamar/userguide/1.1/en-US/html/tools.html#tools_migration.

4.1.9. Uso da Ferramenta IronJacamar para Converter um Arquivo de Configuração do Adaptador de Recurso

Procedimento 4.7. 

  1. Abra uma linha de comando e navegue ao diretório IRONJACAMAR_HOME/docs/as/.
  2. Execute o script conversor digitando o seguinte comando:
    • No Linux: ./converter.sh -ra SOURCE_FILE TARGET_FILE
    • No Microsoft Windows: ./converter.bat -ra SOURCE_FILE TARGET_FILE
    O SOURCE_FILE é um arquivo -ds.xml adaptador de recurso do lançamento anterior. O TARGET_FILE contém uma nova configuração.
    Por exemplo, para converter o arquivo de configuração do adaptador de recurso mttestadapter-ds.xml localizado no diretório atual, você digitaria:
    • No Linux: ./converter.sh -ra mttestadapter-ds.xml new-adapter-config.xml
    • No Microsoft Windows: ./converter.bat -ra mttestadapter-ds.xml new-adapter-config.xml
    Perceba que o parâmetro para a conversão do adaptador de recurso é -ra.
  3. Copie todo o elemento <resource-adapters> do arquivo de destino e cole-o no arquivo de configuração sob o elemento <subsystem xmlns="urn:jboss:domain:resource-adapters:1.0">

    Importante

    Você deve interromper o servidor antes de editar o arquivo de configuração do servidor para sua alteração ser persistida na inicialização do servidor.
    • Caso você esteja executando um storage domain, copie o XML ao arquivo EAP_HOME/domain/configuration/domain.xml.
    • Caso você esteja executando um servidor autônomo, copie o XML ao arquivo EAP_HOME/standalone/configuration/standalone.xml.
  4. Modificação do XML gerado ao novo arquivo de configuração.
    Segue abaixo um exemplo do arquivo de configuração do adaptador de recurso a partir do JBoss Enterprise Application Plataform 5.x TestSuite:
    <?xml version="1.0" encoding="UTF-8"?>
      <!-- ==================================================================== -->
      <!-- ConnectionManager setup for jboss test adapter                       -->
      <!-- Build jmx-api (build/build.sh all) and view for config documentation -->
      <!-- ==================================================================== -->
    <connection-factories>
      <tx-connection-factory>
        <jndi-name>JBossTestCF</jndi-name>
        <xa-transaction/>
        <rar-name>jbosstestadapter.rar</rar-name>
        <connection-definition>javax.resource.cci.ConnectionFactory</connection-definition>
        <config-property name="IntegerProperty" type="java.lang.Integer">2</config-property>
        <config-property name="BooleanProperty" type="java.lang.Boolean">false</config-property>
        <config-property name="DoubleProperty" type="java.lang.Double">5.5</config-property>
        <config-property name="UrlProperty" type="java.net.URL">http://www.jboss.org</config-property>
        <config-property name="sleepInStart" type="long">200</config-property>
        <config-property name="sleepInStop" type="long">200</config-property>
      </tx-connection-factory>
      <tx-connection-factory>
        <jndi-name>JBossTestCF2</jndi-name>
        <xa-transaction/>
        <rar-name>jbosstestadapter.rar</rar-name>
        <connection-definition>javax.resource.cci.ConnectionFactory</connection-definition>
        <config-property name="IntegerProperty" type="java.lang.Integer">2</config-property>
        <config-property name="BooleanProperty" type="java.lang.Boolean">false</config-property>
        <config-property name="DoubleProperty" type="java.lang.Double">5.5</config-property>
        <config-property name="UrlProperty" type="java.net.URL">http://www.jboss.org</config-property>
        <config-property name="sleepInStart" type="long">200</config-property>
        <config-property name="sleepInStop" type="long">200</config-property>
      </tx-connection-factory>
      <tx-connection-factory>
        <jndi-name>JBossTestCFByTx</jndi-name>
        <xa-transaction/>
        <track-connection-by-tx>true</track-connection-by-tx>
        <rar-name>jbosstestadapter.rar</rar-name>
        <connection-definition>javax.resource.cci.ConnectionFactory</connection-definition>
        <config-property name="IntegerProperty" type="java.lang.Integer">2</config-property>
        <config-property name="BooleanProperty" type="java.lang.Boolean">false</config-property>
        <config-property name="DoubleProperty" type="java.lang.Double">5.5</config-property>
        <config-property name="UrlProperty" type="java.net.URL">http://www.jboss.org</config-property>
        <config-property name="sleepInStart" type="long">200</config-property>
        <config-property name="sleepInStop" type="long">200</config-property>
      </tx-connection-factory>
    </connection-factories>
    
    Segue abaixo o arquivo de configuração que foi gerado pela execução do script conversor. Substitua o valor do atributo do nome da classe "FIXME_MCF_CLASS_NAME" no XML gerado com o nome de classe correto da alocação de conexão gerenciada, neste caso o "org.jboss.test.jca.adapter.TestManagedConnectionFactory". Segue abaixo o XML resultante no arquivo de configuração do JBoss Enterprise Application Plataform 6 com modificações ao valor do elemento <class-name>.
    <subsystem xmlns="urn:jboss:domain:resource-adapters:1.0">
      <resource-adapters>
        <resource-adapter>
          <archive>jbosstestadapter.rar</archive>
          <transaction-support>XATransaction</transaction-support>
          <connection-definitions>
      <!-- Replace the "FIXME_MCF_CLASS_NAME" class-name value with the correct class name
      <connection-definition class-name="FIXME_MCF_CLASS_NAME" enabled="true"
        jndi-name="java:jboss/JBossTestCF" pool-name="JBossTestCF" 
        use-ccm="true" use-java-context="true"> -->
      <connection-definition 
        class-name="org.jboss.test.jca.adapter.TestManagedConnectionFactory" 
        enabled="true"
        jndi-name="java:jboss/JBossTestCF" pool-name="JBossTestCF" 
        use-ccm="true" use-java-context="true">
        <config-property name="IntegerProperty">2</config-property>
        <config-property name="sleepInStart">200</config-property>
        <config-property name="sleepInStop">200</config-property>
        <config-property name="BooleanProperty">false</config-property>
        <config-property name="UrlProperty">http://www.jboss.org</config-property>
        <config-property name="DoubleProperty">5.5</config-property>
        <pool>
          <prefill>false</prefill>
          <use-strict-min>false</use-strict-min>
          <flush-strategy>FailingConnectionOnly</flush-strategy>
        </pool>
        <security>
          <application/>
        </security>
        <timeout/>
        <validation>
          <background-validation>false</background-validation>
          <use-fast-fail>false</use-fast-fail>
        </validation>
      </connection-definition>
          </connection-definitions>
        </resource-adapter>
        <resource-adapter>
          <archive>jbosstestadapter.rar</archive>
          <transaction-support>XATransaction</transaction-support>
          <connection-definitions>
      <!-- Replace the "FIXME_MCF_CLASS_NAME" class-name value with the correct class name
       <connection-definition class-name="FIXME_MCF_CLASS_NAME" enabled="true"
        jndi-name="java:jboss/JBossTestCF2" pool-name="JBossTestCF2" 
        use-ccm="true" use-java-context="true"> -->
      <connection-definition 
        class-name="org.jboss.test.jca.adapter.TestManagedConnectionFactory" 
        enabled="true"
        jndi-name="java:jboss/JBossTestCF2" pool-name="JBossTestCF2" 
        use-ccm="true" use-java-context="true">
        <config-property name="IntegerProperty">2</config-property>
        <config-property name="sleepInStart">200</config-property>
        <config-property name="sleepInStop">200</config-property>
        <config-property name="BooleanProperty">false</config-property>
        <config-property name="UrlProperty">http://www.jboss.org</config-property>
        <config-property name="DoubleProperty">5.5</config-property>
        <pool>
          <prefill>false</prefill>
          <use-strict-min>false</use-strict-min>
          <flush-strategy>FailingConnectionOnly</flush-strategy>
        </pool>
        <security>
          <application/>
        </security>
        <timeout/>
        <validation>
          <background-validation>false</background-validation>
          <use-fast-fail>false</use-fast-fail>
        </validation>
      </connection-definition>
          </connection-definitions>
        </resource-adapter>
        <resource-adapter>
          <archive>jbosstestadapter.rar</archive>
          <transaction-support>XATransaction</transaction-support>
          <connection-definitions>
      <!-- Replace the "FIXME_MCF_CLASS_NAME" class-name value with the correct class name
      <connection-definition class-name="FIXME_MCF_CLASS_NAME" enabled="true"
         jndi-name="java:jboss/JBossTestCFByTx" pool-name="JBossTestCFByTx" 
         use-ccm="true" use-java-context="true"> -->
      <connection-definition 
        class-name="org.jboss.test.jca.adapter.TestManagedConnectionFactory" 
        enabled="true"
        jndi-name="java:jboss/JBossTestCFByTx" pool-name="JBossTestCFByTx" 
        use-ccm="true" use-java-context="true">
        <config-property name="IntegerProperty">2</config-property>
        <config-property name="sleepInStart">200</config-property>
        <config-property name="sleepInStop">200</config-property>
        <config-property name="BooleanProperty">false</config-property>
        <config-property name="UrlProperty">http://www.jboss.org</config-property>
        <config-property name="DoubleProperty">5.5</config-property>
        <pool>
          <prefill>false</prefill>
          <use-strict-min>false</use-strict-min>
          <flush-strategy>FailingConnectionOnly</flush-strategy>
        </pool>
        <security>
          <application/>
        </security>
        <timeout/>
        <validation>
          <background-validation>false</background-validation>
          <use-fast-fail>false</use-fast-fail>
        </validation>
      </connection-definition>
          </connection-definitions>
        </resource-adapter>
      </resource-adapters>
    </subsystem>
    
    

Nota

A ferramenta de Migração IronJacamar é uma ferramenta de terceiros e não é suportada como parte do JBoss Enterprise Application Plataform 6. Para maiores informações a respeito do IronJacamar, dirija-se ao http://www.jboss.org/ironjacamar. Para maiores informações de como instalar e usar essa ferramenta, consulte http://docs.jboss.org/ironjacamar/userguide/1.1/en-US/html/tools.html#tools_migration.

4.2. Problemas da Migração de Depuração

4.2.1. Depuração e Solução dos Problemas de Migração

Devido ao carregamento de classe, regras de nomeação JNDI e outras alterações no servidor do aplicativo, você poderá encontrar exceções ou outros erros caso você tente implantar seu aplicativo "como-está". Segue abaixo a descrição de como resolver algumas das exceções mais comuns e erros que você venha a encontrar.

4.2.2. Depuração e Solução do ClassNotFoundExceptions e NoClassDefFoundErrors

Sumário

O ClassNotFoundExceptions ocorre normalmente devido a uma dependência não-resolvida. Isto significa que você deve definir explicitamente as dependências em outros módulos ou copiar os JARs de fontes externas.

Procedimento 4.8. 

  1. Caso não haja um módulo para a classe ausente, a Seção 4.2.4, “Busca do JAR na Instalação Anterior”

4.2.3. Busque a Dependência de Módulo do JBoss

Para resolver a dependência, primeiro tente o módulo que contém a classe especificada pelo ClassNotFoundException pesquisando no diretório EAP_HOME/modules/system/layers/base/. Caso você encontrar um módulo para a classe, você deve adicionar a dependência à entrada do manifesto.
Por exemplo, caso você verificar este rastreamento ClassNotFoundException no log:
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.Log 
    from [Module "deployment.TopicIndex.war:main" from Service Module Loader]
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:188)
Encontre o módulo do JBoss contendo essa classe efetuando o seguinte:

Procedimento 4.9. 

  1. Determine primeiramente se existe um módulo claro para a classe.
    1. Navegue ao diretório EAP_HOME/modules/system/layers/base/ e busque pelo caminho do módulo combinando a classe nomeada no ClassNotFoundException.
      Você pode encontrar o org/apache/commons/logging/ de caminho modular.
    2. Abra o arquivo EAP_HOME/modules/system/layers/base/org/apache/commons/logging/main/module.xml e encontre o nome do módulo. Neste caso, isto é "org.apache.commons.logging".
    3. Adicione o nome do módulo às Dependências no arquivo MANIFEST.MF:
      Manifest-Version: 1.0
      Dependencies: org.apache.commons.logging
      
  2. Caso não haja caminho de módulo óbvio para a classe, você precisa encontrar a dependência em outra localização.
    1. Busque pela classe nomeada no ClassNotFoundException do Relatório Tattletale.
    2. Busque o módulo contendo o JAR no diretório EAP_HOME/modules e encontre o nome do módulo como na etapa anterior.

4.2.4. Busca do JAR na Instalação Anterior

Caso a classe não seja encontrada no JAR empacotado num módulo definido pelo servidor, busque o JAR em sua instalação EAP5_HOME ou seu diretório lib/ anterior do servidor.
Por exemplo, caso você veja este traço ClassNotFoundException no log:
Caused by: java.lang.NoClassDefFoundError: org/hibernate/validator/ClassValidator at java.lang.Class.getDeclaredMethods0(Native Method)
Busque pelo JAR contendo essa classe efetuando o seguinte:
  1. Abra o terminal e navegue ao diretório EAP5_HOME/.
  2. Emita o comando:
    grep 'org.hibernate.validator.ClassValidator' `find . \-name '*.jar'`
  3. Você poderá encontrar mais de um resultado. Neste caso, o seguinte resultado é o JAR que precisamos:
    Binary file ./jboss-eap-5.1/seam/lib/hibernate-validator.jar matches
  4. Copie esse JAR ao diretório lib/ do aplicativo.
    Caso você precisar de um número grande de JARs, será mais fácil definir um módulo para as classes. Para maiores informações sobre esse assunto, refira-se ao Modules no capítulo Get Started Developing Applications do Development Guide para o JBoss Enterprise Application Plataform 6 no https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.
  5. Reconstrução e reimplantação do aplicativo.

4.2.5. Depuração e Resolução dos ClassCastExceptions

Os ClassCastExceptions acontecem com frequência uma vez que a classe está sendo carregada por um carregador de classe que eles estendem. Eles podem também ser o resultado da mesma classe existente em JARs múltiplos.

Procedimento 4.10. 

  1. Busque pelo aplicativo para encontrar todos os JAR(s) que contém a classe nomeada pelo ClassNotFoundException. Caso exista um módulo definido para a classe, encontre e remova os JAR(s) duplicados a partir do WAR ou EAR do aplicativo.
  2. Encontre o módulo do JBoss contendo a classe e defina claramente a dependência no arquivo MANIFEST.MF ou no arquivo jboss-deployment-structure.xml. Refira-se ao Class Loading and Subdeployments no capítulo Class Loading and Modules do Development Guide para o JBoss Enterprise Application Plataform 6 no https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/ para maiores informações.
  3. Caso você não esteja apto a resolver isto usando as etapas acima, você pode normalmente determinar a causa do problema imprimindo a informação do carregador da classe ao log. Por exemplo, você observará o seguinte ClassCastException no log:
    java.lang.ClassCastException: com.example1.CustomClass1 cannot be cast to com.example2.CustomClass2
    1. No seu código, imprima a informação do carregador das classes nomeados pelo ClassCastException ao log, por exemplo:
      logger.info("Class loader for CustomClass1: " + 
            com.example1.CustomClass1.getClass().getClassLoader().toString());
      logger.info("Class loader for CustomClass2: " + 
            com.example2.CustomClass2.getClass().getClassLoader().toString());
      
    2. A informação no log apresenta quais módulos são carregados nas classes e, baseado no seu aplicativo, você precisa remover ou mover os JAR(s) em conflito.

4.2.6. Depuração e Solução do DuplicateServiceExceptions

Caso você obter um DuplicateServiceExceptions para uma subimplantação de um JAR ou uma mensagem que o aplicativo WAR já foi instalado quando você implantar seu JBoss Enterprise Application Plataform 6, isto pode ter sido uma decorrência de alterações da maneira em que o JBossWS manuseia a sua implantação.
O lançamento do JBossWS 3.3.0 introduziu um novo novo Algoritmo de Mapeamento Raiz de Contexto para servlet baseados nos pontos de extremidade que permitem isto tornar-se diretamente compatível com o TCK6. Caso o arquivo EAR do aplicativo conter um JAR com o mesmo nome, o JBossWS pode criar um contexto WAR e um contexto da web com o mesmo nome. O contexto da web conflita com o contexto WAR e isto resulta em erros de implantação. Resolva os problemas de implantação em uma das seguintes maneiras:
  • Renomeie o arquivo JAR a um nome que é diferente do que o WAR, de forma que a web gerada e os contextos WAR sejam únicos.
  • Forneça um elemento <context-root> ao arquivo jboss-web.xml.
  • Forneça um elemento <context-root> ao arquivo jboss-webservices.xml.
  • Personalize o elemento <context-root> para o WAR no arquivo application.xml.

4.2.7. Depuração e Resolução dos Erros da Página de Depuração do JBoss Seam

Após você migrar e implantar o seu aplicativo com sucesso, você pode encontrar um erro do período de execução que o redireciona à página "Depuração do JBoss Seam". O URL para esta página é "http://localhost:8080/APPLICATION_CONTEXT/debug.seam". Esta página permite que você visualize e inspecione os componentes Seam em qualquer dos contextos associados com a sessão de login atual.
Página de Depuração do JBoss Seam

Figura 4.1. Página de Depuração do JBoss Seam

A razão mais provável de você ter sido redirecionado à esta página é devido ao Seam ter pego uma Exceção que não foi manuseada no código do aplicativo. A causa principal da exceção pode ser normalmente encontrada em um dos links na "Página de Depuração do JBoss Seam".

Procedimento 4.11. 

  1. Expanda a seção Component na página e procure pelo componente org.jboss.seam.caughtException.
  2. A causa e o rastreamento de pilha deve levá-lo às dependências ausentes.
    Informação org.jboss.seam.caughtException do componente

    Figura 4.2. Informação org.jboss.seam.caughtException do componente

  3. Use a técnica descrita na Seção 4.2.2, “Depuração e Solução do ClassNotFoundExceptions e NoClassDefFoundErrors” para resolver as dependências do módulo.
    Na amostra acima, a solução mais simples é adicionar org.slf4j ao MANIFEST.MF
    Manifest-Version: 1.0
    Dependencies: org.slf4j
    
    Outra opção é adicionar uma dependência para o módulo ao arquivo jboss-deployment-structure.xml:
    <jboss-deployment-structure>
       <deployment>
            <dependencies>
              <module name="org.slf4j" />
            </dependencies>
        </deployment>
    </jboss-deployment-structure>
    

4.3. Revise a Migração dos Aplicativos da Amostra

4.3.1. Revise a Migração dos Aplicativos da Amostra

Visão Geral

Segue abaixo uma lista dos aplicativos de amostra do JBoss Enterprise Application Plataform 5.x que foram migrados ao JBoss Enterprise Application Plataform 6. Para visualizar os detalhes de como a alteração aconteceu num aplicativo em particular, clique no link abaixo.

4.3.2. Migração da Amostra Seam 2.2 JPA para o JBoss Enterprise Application Plataform 6

Sumário

A seguinte lista de tarefas resume as alterações necessárias para migração com êxito do aplicativo de amostra Seam 2.2 JPA para o JBoss Enterprise Application Plataform 6. Esse aplicativo de amostra pode ser encontrado na distribuição do JBoss Enterprise Application Plataform 5.1 sob EAP5.1_HOME/jboss-eap-5.1/seam/examples/jpa/

Importante

Os aplicativos que usam o Hibernate diretamente com o Seam 2.2 podem usar a versão do Hibernate 3 empacotados dentro do aplicativo. O Hibernate 4, que é fornecido através do módulo org.hibernate do JBoss Enterprise Application Plataform 6, não é suportado pelo Seam 2.2. Esta amostra possui por intenção ajudá-lo executar o seu aplicativo no JBoss Enterprise Application Plataform 6 como primeira etapa. Por favor certifique-se de que o empacotamento do Hibernate 3 com o aplicativo Seam 2.2 não é uma configuração suportada.

Procedimento 4.12. Migração da amostra Seam 2.2 JPA

  1. Remoção do arquivo jboss-web

    Remova o arquivo jboss-web.xml do diretório jboss-seam-jpa.war/WEB-INF/. O carregamento da classe definido no jboss-web.xml é agora o comportamento default.
  2. Remoção da propriedade obsoleta a partir do arquivo persistence.xml

    Remova ou comente a propriedade hibernate.cache.provider_class no arquivo jboss-seam-jpa.war/WEB-INF/classes/META-INF/persistence.xml:
    <!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->
    
  3. Adição das dependências Seam 2.2

    Copie os seguintes JARs da biblioteca Seam 2.2, SEAM_HOME/lib/, ao diretório jboss-seam-jpa.war/WEB-INF/lib/:

    • slf4j-api.jar
    • slf4j-log4j12.jar
    • hibernate-entitymanager.jar
    • hibernate-core.jar
    • hibernate-annotations.jar
    • hibernate-commons-annotations.jar
    • hibernate-validator.jar
  4. Criação de um arquivo jboss-deployment-structure para adicionar as dependências restantes

    Crie um arquivo jboss-deployment-structure.xml na pasta jboss-seam-jpa.war/WEB-INF/ contendo os seguintes dados:
    <jboss-deployment-structure>
       <deployment>
            <exclusions>
              <module name="javax.faces.api" slot="main"/>
              <module name="com.sun.jsf-impl" slot="main"/>
            </exclusions>
            <dependencies>
              <module name="org.apache.log4j" />
              <module name="org.dom4j" />
              <module name="org.apache.commons.logging" />
              <module name="org.apache.commons.collections" />
              <module name="javax.faces.api" slot="1.2"/>
              <module name="com.sun.jsf-impl" slot="1.2"/>
            </dependencies>
        </deployment>
    </jboss-deployment-structure>
    
Resultado:

O aplicativo da amostra Seam 2.2 implanta e executa com êxito no JBoss Enterprise Application Plataform 6.

4.3.3. Migração da Amostra do Seam 2.2 Booking para o JBoss Enterprise Application Plataform 6

Sumário

A migração do Seam 2.2 Booking EAR é mais complicada do que a amostra Seam 2.2 JPA WAR. A documentação para a migração da amostra Seam 2.2 JPA WAR pode ser encontrada na Seção 4.3.2, “Migração da Amostra Seam 2.2 JPA para o JBoss Enterprise Application Plataform 6”. Para migrar o aplicativo, você deve realizar o seguinte:

  1. Inicialize o JSF 1.2 ao invés do JSF 2 default.
  2. As versões antigas de bundle do Hibernate JARs
  3. Altere os bindings JNDI para uso da nova sintaxe portável do Java EE 6 JNDI.
As primeiras duas etapas foram feitas na migração da amostra Seam 2.2 JPA WAR. A terceira etapa é nova e é necessária uma vez que o EAR contém EJBs.

Importante

Os aplicativos que usam o Hibernate diretamente com o Seam 2.2 podem usar a versão do Hibernate 3 empacotados dentro do aplicativo. O Hibernate 4, que é fornecido através do módulo org.hibernate do JBoss Enterprise Application Plataform 6, não é suportado pelo Seam 2.2. Esta amostra possui por intenção ajudá-lo executar o seu aplicativo no JBoss Enterprise Application Plataform 6 como primeira etapa. Por favor certifique-se de que o empacotamento do Hibernate 3 com o aplicativo Seam 2.2 não é uma configuração suportada.

Procedimento 4.13. Migração da amostra Seam 2.2 Booking

  1. Crie o arquivo jboss-deployment-structure.xml

    Crie um novo arquivo nomeado jboss-deployment-structure.xml no jboss-seam-booking.ear/META-INF/ e adicione o seguinte conteúdo:
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
      <deployment>
            <dependencies>
              <module name="org.apache.log4j" export="true"/>
              <module name="org.dom4j" export="true"/>
              <module name="org.apache.commons.logging" export="true"/>
              <module name="org.apache.commons.collections" export="true"/>
              <module name="javax.faces.api" slot="1.2" export="true"/>
              <module name="com.sun.jsf-impl" slot="1.2" export="true"/>
            </dependencies>
      </deployment>
      <sub-deployment name="booking-web.war"> 
          <exclusions>
              <module name="javax.faces.api" slot="main"/>
              <module name="com.sun.jsf-impl" slot="main"/>
            </exclusions>
            <dependencies>
              <module name="javax.faces.api" slot="1.2"/>
              <module name="com.sun.jsf-impl" slot="1.2"/>
            </dependencies>
      </sub-deployment> 
     </jboss-deployment-structure>
    
  2. Remova a propriedade hibernate para a classe do cache

    Remova ou comente a propriedade hibernate para a classe do provedor do cache no arquivo jboss-seam-booking.jar/META-INF/persistence.xml:
    <!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->
    
  3. Copie os JARs a partir da distribuição Seam 2.2

    Copie os seguintes JARs a partir da distribuição Seam 2.2 EAP5.x_HOME/jboss-eap5.x/seam/lib/ no diretório jboss-seam-booking.ear/lib.
    slf4j-api.jar 
    slf4j-log4j12.jar 
    hibernate-core.jar 
    hibernate-entitymanager.jar 
    hibernate-validator.jar 
    hibernate-annotations.jar 
    hibernate-commons-annotations.jar
    
  4. Altere os nomes de pesquisa JNDI

    Altere os strings de pesquisa JNDI no arquivo jboss-seam-booking.war/WEB-INF/components.xml. O JBoss Enterprise Application Plataform 6 efetua o binds nos EJBs usando as regras de sintaxe portável JNDI e você não pode usar o jndiPattern que era usado no JBoss Enterprise Application Plataform 5. Segue abaixo como os strings de pesquisa EJB JNDI do aplicativo devem ser alteradas ao JBoss Enterprise Application Plataform 6:
    java:global/seam-booking/booking-ejb/HotelSearchingAction!org.jboss.seam.example.booking.HotelSearching
    java:app/booking-ejb/HotelSearchingAction!org.jboss.seam.example.booking.HotelSearching
    java:module/HotelSearchingAction!org.jboss.seam.example.booking.HotelSearching
    java:global/seam-booking/booking-ejb/HotelSearchingAction
    java:app/booking-ejb/HotelSearchingAction
    java:module/HotelSearchingAction
    
    Os strings de pesquisa para os EJBs de framework Seam 2.2 devem ser alteradas conforme abaixo:
    java:global/seam-booking/jboss-seam/EjbSynchronizations!org.jboss.seam.transaction.LocalEjbSynchronizations
    java:app/jboss-seam/EjbSynchronizations!org.jboss.seam.transaction.LocalEjbSynchronizations
    java:module/EjbSynchronizations!org.jboss.seam.transaction.LocalEjbSynchronizations
    java:global/seam-booking/jboss-seam/EjbSynchronizations
    java:app/jboss-seam/EjbSynchronizations
    java:module/EjbSynchronizations
    
    Você pode usar uma das seguintes abordagens:
    1. Adição dos elementos do componente

      Você pode adicionar um jndi-name para cada EJB ao WEB-INF/components.xml:
      <component class="org.jboss.seam.transaction.EjbSynchronizations" jndi-name="java:app/jboss-seam/EjbSynchronizations"/>
      <component class="org.jboss.seam.async.TimerServiceDispatcher" jndi-name="java:app/jboss-seam/TimerServiceDispatcher"/>
      <component class="org.jboss.seam.example.booking.AuthenticatorAction" jndi-name="java:app/booking-ejb/AuthenticatorAction" />
      <component class="org.jboss.seam.example.booking.BookingListAction"  jndi-name="java:app/booking-ejb/BookingListAction" />
      <component class="org.jboss.seam.example.booking.RegisterAction" jndi-name="java:app/booking-ejb/RegisterAction" />
      <component class="org.jboss.seam.example.booking.HotelSearchingAction" jndi-name="java:app/booking-ejb/HotelSearchingAction" />
      <component class="org.jboss.seam.example.booking.HotelBookingAction" jndi-name="java:app/booking-ejb/HotelBookingAction" />
      <component class="org.jboss.seam.example.booking.ChangePasswordAction" jndi-name="java:app/booking-ejb/ChangePasswordAction" />
      
      
    2. Você pode modificar o código pela adição da anotação @JNDIName(value="") especificando o caminho JNDI. Segue abaixo uma amostra alterada do código bean de sessão stateless. Uma descrição detalhada deste processo pode ser encontrada na documentação de referência Seam 2.2.
      @Stateless
      @Name("authenticator")
      @JndiName(value="java:app/booking-ejb/AuthenticatorAction")
      public class AuthenticatorAction 
          implements Authenticator
      {
      ...
      }
      
Resultado:

O aplicativo Seam 2.2 Booking implanta e executa com êxito no JBoss Enterprise Application Plataform 6.

4.3.4. Migração do Seam 2.2 Booking Archive ao JBoss Enterprise Application Plataform 6: Instruções de Etapa-por-Etapa

Este é um guia de etapa-por-etapa de como portar o arquivo do aplicativo Seam 2.2 Booking do JBoss Enterprise Application Plataform 5.1 ao JBoss Enterprise Application Plataform 6. Embora existam três abordagens para os aplicativos de migração, muitos desenvolvedores podem estar inclinados a implantar o arquivo do aplicativo com ele está ao servidor do JBoss Enterprise Application Plataform 6 para checar o que acontece. O propósito desta documentação é apresentar os tipos de problemas que você poderá encontrar quando você realizar isto e como você pode depurar e resolver esses problemas.
Para esta amostra, o aplicativo EAR é implantado ao diretório EAP6_HOME/standalone/deployments sem nenhuma alteração além da extração dos arquivos. Isto permite você modificar com facilidade os arquivos XML contidos com os arquivos uma vez que você se deparar e solucionar os problemas.

Importante

Os aplicativos que usam o Hibernate diretamente com o Seam 2.2 podem usar a versão do Hibernate 3 empacotados dentro do aplicativo. O Hibernate 4, que é fornecido através do módulo org.hibernate do JBoss Enterprise Application Plataform 6, não é suportado pelo Seam 2.2. Esta amostra possui por intenção ajudá-lo a executar seu aplicativo no JBoss Enterprise Application Plataform 6 como primeira etapa. Por favor certifique-se de que o empacotamento do Hibernate 3 com o aplicativo Seam 2.2 não é uma configuração suportada.
A partir daqui, você estará apto a acessar com sucesso o aplicativo num navegador usando o URL http://localhost:8080/seam-booking/. Entre como demo/demo e verifique a página de boas vindas do Booking.

4.3.5. Construção e Depuração da Versão do JBoss Enterprise Application Plataform 5.1 do Aplicativo Seam 2.2 Booking

Antes da migração deste aplicativo, você precisa construir o aplicativo Seam 2.2 Booking do JBoss Enterprise Application Plataform, extrair o arquivo e copiá-lo a uma pasta de implantação do JBoss Enterprise Application Plataform 6.

Procedimento 4.15. Construção e implantação do EAR

  1. Contrução do EAR:
    $ cd /EAP5_HOME/jboss-eap5.1/seam/examples/booking
    $ ANT_HOME/ant explode
    
  2. Copie o EAR ao diretório de implantações EAP6_HOME:
    $ cp -r EAP5_HOME/seam/examples/booking/exploded-archives/jboss-seam-booking.ear EAP6_HOME/standalone/deployments/
    $ cp -r EAP5_HOME/seam/examples/booking/exploded-archives/jboss-seam-booking.war EAP6_HOME/standalone/deployments/jboss-seam.ear
    $ cp -r EAP5_HOME/seam/examples/booking/exploded-archives/jboss-seam-booking.jar EAP6_HOME/standalone/deployments/jboss-seam.ear
    
  3. Inicie o servidor do JBoss Enterprise Application Plataform e verifique o log. Você verá o seguinte:
    INFO [org.jboss.as.deployment] (DeploymentScanner-threads - 1) Found jboss-seam-booking.ear in deployment directory. 
        To trigger deployment create a file called jboss-seam-booking.ear.dodeploy
    
  4. Crie um arquivo vazio com o nome jboss-seam-booking.ear.dodeploy e copie-o ao diretório EAP6_HOME/standalone/deployments. Você precisa copiar este arquivo no diretório de implantações diversas vezes enquanto migrando este aplicativo. Portanto, mantenha isto numa localização da qual você pode encontrar com facilidade. No log, você deverá ver agora as seguintes mensagens indicando que a implantação está ocorrendo:
    INFO [org.jboss.as.server.deployment] (MSC service thread 1-1) Starting deployment of "jboss-seam-booking.ear"
    INFO [org.jboss.as.server.deployment] (MSC service thread 1-3) Starting deployment of "jboss-seam-booking.jar"
    INFO [org.jboss.as.server.deployment] (MSC service thread 1-6) Starting deployment of "jboss-seam.jar"
    INFO [org.jboss.as.server.deployment] (MSC service thread 1-2) Starting deployment of "jboss-seam-booking.war"
    
    A partir daqui, você encontra o primeiro erro de implantação. A próxima etapa, você verificará cada problema e aprenderá como depurá-lo e resolvê-lo.
    Consulte a Seção 4.3.6, “Depuração e resolução do erros e exceções do Seam 2.2 Booking Archive Deployment” para maiores informações sobre como depurar e resolver problemas de implantação.

4.3.6. Depuração e resolução do erros e exceções do Seam 2.2 Booking Archive Deployment

Na etapa anterior,Seção 4.3.5, “Construção e Depuração da Versão do JBoss Enterprise Application Plataform 5.1 do Aplicativo Seam 2.2 Booking”, você construiu o aplicativo Seam 2.2 Booking do JBoss Enterprise Application Plataform 5.1 e o implantava na pasta de implantação do JBoss Enterprise Application Plataform 6. Nessa etapa, você depura e resolve cada erro de implantação que você encontrou.

Importante

Os aplicativos que usam o Hibernate diretamente com o Seam 2.2 podem usar a versão do Hibernate 3 empacotados dentro do aplicativo. O Hibernate 4, que é fornecido através do módulo org.hibernate do JBoss Enterprise Application Plataform 6, não é suportado pelo Seam 2.2. Esta amostra possui por intenção ajudá-lo executar o seu aplicativo no JBoss Enterprise Application Plataform 6 como primeira etapa. Por favor certifique-se de que o empacotamento do Hibernate 3 com o aplicativo Seam 2.2 não é uma configuração suportada.

Procedimento 4.16. Depuração e resolução dos erros de implantação e exceções

  1. Problema - java.lang.ClassNotFoundException: javax.faces.FacesException
    Quando você implanta o aplicativo, o log contém o seguinte erro:
    ERROR \[org.jboss.msc.service.fail\] (MSC service thread 1-1) MSC00001: Failed to start service jboss.deployment.subunit."jboss-seam-booking.ear"."jboss-seam-booking.war".POST_MODULE:
    org.jboss.msc.service.StartException in service jboss.deployment.subunit."jboss-seam-booking.ear"."jboss-seam-booking.war".POST_MODULE:
    Failed to process phase POST_MODULE of subdeployment "jboss-seam-booking.war" of deployment "jboss-seam-booking.ear"
        (.. additional logs removed ...)
    Caused by: java.lang.ClassNotFoundException: javax.faces.FacesException from \[Module "deployment.jboss-seam-booking.ear:main" from Service Module Loader\]
        at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:191)
    
    O que significa:

    O ClassNotFoundException indica que falta uma dependência. Neste caso, ele não pode encontrar a classe javax.faces.FacesException e você precisa adicionar a dependência.

    Como resolver isto:

    Busque pelo nome do módulo para aquela classe no diretório EAP6_HOME/modules/system/layers/base/ apenas observando o caminho que coincide com a classe faltante. Neste caso, você pode encontrar dois módulos que coincidem com o caminho:

    javax/faces/api/main
    javax/faces/api/1.2
    
    Ambos os módulos possuem o mesmo nome de módulo: javax.faces.api, porém um deles no diretório principal é para JSF 2.0 e outro localizado no diretório 1.2 é para JSF 1.2. Caso houvesse apenas um módulo disponível, você poderia criar simplesmente um arquivo MANIFEST.MF e adicionar a dependência do módulo. Neste caso, você deseja usar a versão JSF 1.2 ao invés da versão 2.0 no principal, de forma que você precisa especificar uma e excluir a outra. Para isto, crie um arquivo jboss-deployment-structure.xml no diretório do META-INF/ do EAR que contém os seguintes dados:
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
      <deployment>
          <dependencies>
            <module name="javax.faces.api" slot="1.2" export="true"/>
          </dependencies>
      </deployment>
      <sub-deployment name="jboss-seam-booking.war">
        <exclusions>
            <module name="javax.faces.api" slot="main"/>
          </exclusions>
          <dependencies>
            <module name="javax.faces.api" slot="1.2"/>
          </dependencies>
      </sub-deployment>
    </jboss-deployment-structure>
    
    
    Na seção deployment, você adiciona a dependência para o javax.faces.api do módulo JSF 1.2. Você pode adicionar também a dependência do módulo JSF 1.2 na seção de subimplantação para o WAR e excluir o módulo para o JSF 2.0.

    Reimplante o aplicativo apenas deletando o arquivo EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed e criando um arquivo jboss-seam-booking.ear.dodeploy vazio no mesmo diretório.
  2. Problema - java.lang.ClassNotFoundException: org.apache.commons.logging.Log
    Quando você implanta o aplicativo, o log contém o seguinte erro:
    ERROR [org.jboss.msc.service.fail] (MSC service thread 1-8) MSC00001: Failed to start service jboss.deployment.unit."jboss-seam-booking.ear".INSTALL:
    org.jboss.msc.service.StartException in service jboss.deployment.unit."jboss-seam-booking.ear".INSTALL:
    Failed to process phase INSTALL of deployment "jboss-seam-booking.ear"
        (.. additional logs removed ...)
    Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.Log from [Module "deployment.jboss-seam-booking.ear.jboss-seam-booking.war:main" from Service Module Loader]
    
    O que significa:

    O ClassNotFoundException indica a falta de uma dependência. Neste caso, ele não pode buscar a classe org.apache.commons.logging.Log e você precisa adicionar a dependência.

    Como resolver isto:

    Busque pelo nome do módulo para aquela classe no diretório EAP6_HOME/modules/system/layers/base/ apenas observando o caminho que coincide com a classe faltante. Neste caso, você pode encontrar um módulo que coincide o caminho org/apache/commons/logging/. O nome do módulo é “org.apache.commons.logging”.

    Modifique o arquivo jboss-deployment-structure.xml e adicione a dependência do módulo à seção de implantação do arquivo.
    <module name="org.apache.commons.logging" export="true"/>
    
    
    O jboss-deployment-structure.xml deve parecer-se com o seguinte:
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
      <deployment>
          <dependencies>
            <module name="javax.faces.api" slot="1.2" export="true"/>
            <module name="org.apache.commons.logging" export="true"/>
          </dependencies>
      </deployment>
      <sub-deployment name="jboss-seam-booking.war">
        <exclusions>
            <module name="javax.faces.api" slot="main"/>
          </exclusions>
          <dependencies>
            <module name="javax.faces.api" slot="1.2"/>
          </dependencies>
      </sub-deployment>
    </jboss-deployment-structure>
    
    
    Reimplante o aplicativo apenas deletando o arquivo EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed e criando um arquivo jboss-seam-booking.ear.dodeploy vazio no mesmo diretório.
  3. Problema - java.lang.ClassNotFoundException: org.dom4j.DocumentException
    Quando você implanta o aplicativo, o log contém o seguinte erro:
    ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/seam-booking]] (MSC service thread 1-3) Exception sending context initialized event to listener instance of class org.jboss.seam.servlet.SeamListener: java.lang.NoClassDefFoundError: org/dom4j/DocumentException
        (... additional logs removed ...)
    Caused by: java.lang.ClassNotFoundException: org.dom4j.DocumentException from [Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader]
    
    O que significa:

    O ClassNotFoundException indica que falta uma dependência. Neste caso, ele não pode buscar pela classe org.dom4j.DocumentException.

    Como resolver isto:

    Encontre o nome do módulo no diretório EAP6_HOME/modules/system/layers/base/ procurando pelo org/dom4j/DocumentException. O nome do módulo é “org.dom4j”. Modifique o arquivo jboss-deployment-structure.xml para adicionar a dependência do módulo à seção de implantação do arquivo.

    <module name="org.dom4j" export="true"/>
    
    
    O arquivo jboss-deployment-structure.xml deve parecer-se com o seguinte:
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
      <deployment>
          <dependencies>
            <module name="javax.faces.api" slot="1.2" export="true"/>
            <module name="org.apache.commons.logging" export="true"/>
                <module name="org.dom4j" export="true"/>
              </dependencies>
      </deployment>
      <sub-deployment name="jboss-seam-booking.war">
        <exclusions>
            <module name="javax.faces.api" slot="main"/>
          </exclusions>
          <dependencies>
            <module name="javax.faces.api" slot="1.2"/>
          </dependencies>
      </sub-deployment>
    </jboss-deployment-structure>
    
    

    Reimplante o aplicativo apenas deletando o arquivo EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed e criando um arquivo jboss-seam-booking.ear.dodeploy vazio no mesmo diretório.
  4. Problema - java.lang.ClassNotFoundException: org.hibernate.validator.InvalidValue
    Quando você implanta o aplicativo, o log contém o seguinte erro:
    ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/seam-booking]] (MSC service thread 1-6) Exception sending context initialized event to listener instance of class org.jboss.seam.servlet.SeamListener: java.lang.RuntimeException: Could not create Component: org.jboss.seam.international.statusMessages
        (... additional logs removed ...)
    Caused by: java.lang.ClassNotFoundException: org.hibernate.validator.InvalidValue from [Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader]
    
    O que significa:

    O ClassNotFoundException indica que falta uma dependência. Neste caso, isto não pode encontrar a classe org.hibernate.validator.InvalidValue.

    Como resolver isto:

    Existe um módulo “org.hibernate.validator”, mas o JAR não contém a classe org.hibernate.validator.InvalidValue, portanto a adição da dependência do módulo não resolve este problema. Neste caso, o JAR contendo a classe fazia parte da implantação do JBoss Enterprise Application Plataform 5.1. Procure pelo JAR que contém a classe ausente no diretório EAP5_HOME/seam/lib/. Digite o seguinte para abrí-lo:

    $ cd EAP5_HOME/seam/lib
    $ grep 'org.hibernate.validator.InvalidValue' `find . -name '*.jar'
    
    O resultado apresenta:
    $ Binary file ./hibernate-validator.jar matches
    $ Binary file ./test/hibernate-all.jar matches
    
    Neste caso, copie o hibernate-validator.jar para o diretório jboss-seam-booking.ear/lib/
    $ cp EAP5_HOME/seam/lib/hibernate-validator.jar jboss-seam-booking.ear/lib
    

    Reimplante o aplicativo apenas deletando o arquivo EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed e criando um arquivo jboss-seam-booking.ear.dodeploy vazio no mesmo diretório.
  5. Problema - java.lang.InstantiationException: org.jboss.seam.jsf.SeamApplicationFactory
    Quando você implanta o aplicativo, o log contém o seguinte erro:
    INFO  [javax.enterprise.resource.webcontainer.jsf.config] (MSC service thread 1-7) Unsanitized stacktrace from failed start...: com.sun.faces.config.ConfigurationException: Factory 'javax.faces.application.ApplicationFactory' was not configured properly.
      at com.sun.faces.config.processor.FactoryConfigProcessor.verifyFactoriesExist(FactoryConfigProcessor.java:296) [jsf-impl-2.0.4-b09-jbossorg-4.jar:2.0.4-b09-jbossorg-4]
      (... additional logs removed ...)
    Caused by: javax.faces.FacesException: org.jboss.seam.jsf.SeamApplicationFactory
      at javax.faces.FactoryFinder.getImplGivenPreviousImpl(FactoryFinder.java:606) [jsf-api-1.2_13.jar:1.2_13-b01-FCS]
      (... additional logs removed ...)
      at com.sun.faces.config.processor.FactoryConfigProcessor.verifyFactoriesExist(FactoryConfigProcessor.java:294) [jsf-impl-2.0.4-b09-jbossorg-4.jar:2.0.4-b09-jbossorg-4]
      ... 11 more
    Caused by: java.lang.InstantiationException: org.jboss.seam.jsf.SeamApplicationFactory
      at java.lang.Class.newInstance0(Class.java:340) [:1.6.0_25]
      at java.lang.Class.newInstance(Class.java:308) [:1.6.0_25]
      at javax.faces.FactoryFinder.getImplGivenPreviousImpl(FactoryFinder.java:604) [jsf-api-1.2_13.jar:1.2_13-b01-FCS]
      ... 16 more
    
    O que significa:

    O com.sun.faces.config.ConfigurationException e java.lang.InstantiationException indicam um problema de dependência. Neste caso, a causa não é óbvia.

    Como resolver isto:

    Você precisa encontrar o módulo que contém as classes com.sun.faces. Enquanto não há módulo com.sun.faces, existem dois módulos com.sun.jsf-impl. Uma checagem rápida do jsf-impl-1.2_13.jar no diretório 1.2 demonstra que isto contém as classes com.sun.faces. Assim como realizado com o javax.faces.FacesExceptionClassNotFoundException, você deseja usar a versão JSF 1.2 ao invés da versão JSF 2.0 no principal, de forma que você pode especificar um e excluir o outro. Você precisa modificar o jboss-deployment-structure.xml para adicionar a dependência do módulo à seção da implantação do arquivo. Você precisa também adicioná-lo à subimplantação WAR e excluir o módulo JSF 2.0. O arquivo deve parecer-se com o seguinte:

    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
      <deployment>
          <dependencies>
            <module name="javax.faces.api" slot="1.2" export="true"/>
                  <module name="com.sun.jsf-impl" slot="1.2" export="true"/>
            <module name="org.apache.commons.logging" export="true"/>
            <module name="org.dom4j" export="true"/>
          </dependencies>
      </deployment>
      <sub-deployment name="jboss-seam-booking.war">
        <exclusions>
            <module name="javax.faces.api" slot="main"/>
            <module name="com.sun.jsf-impl" slot="main"/>
          </exclusions>
          <dependencies>
            <module name="javax.faces.api" slot="1.2"/>
                  <module name="com.sun.jsf-impl" slot="1.2"/>
          </dependencies>
      </sub-deployment>
    </jboss-deployment-structure>
    

    Reimplante o aplicativo apenas deletando o arquivo EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed e criando um arquivo jboss-seam-booking.ear.dodeploy vazio no mesmo diretório.
  6. Problema - java.lang.ClassNotFoundException: org.apache.commons.collections.ArrayStack
    Quando você implanta o aplicativo, o log contém o seguinte erro:
    ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/seam-booking]] (MSC service thread 1-1) Exception sending context initialized event to listener instance of class com.sun.faces.config.ConfigureListener: java.lang.RuntimeException: com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! org.apache.commons.collections.ArrayStack from [Module "deployment.jboss-seam-booking.ear:main" from Service Module Loader]
        (... additional logs removed ...)
    Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.ArrayStack from [Module "deployment.jboss-seam-booking.ear:main" from Service Module Loader]
    
    O que significa:

    O ClassNotFoundException indica que falta uma dependência. Neste caso, ele não pode buscar a classe org.apache.commons.collections.ArrayStack.

    Como resolver isto:

    Encontre o nome do módulo no diretório EAP6_HOME/modules/system/layers/base/ procurando pelo caminho org/apache/commons/collections. O nome do módulo é “org.apache.commons.collections”. Modifique o jboss-deployment-structure.xml para adicionar a dependência do módulo à seção de implantação do arquivo.

    <module name="org.apache.commons.collections" export="true"/>
    
    O arquivo jboss-deployment-structure.xml deve parecer-se com o seguinte:
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
      <deployment>
          <dependencies>
            <module name="javax.faces.api" slot="1.2" export="true"/>
                  <module name="com.sun.jsf-impl" slot="1.2" export="true"/>
            <module name="org.apache.commons.logging" export="true"/>
            <module name="org.dom4j" export="true"/>
            <module name="org.apache.commons.collections" export="true"/>
        </dependencies>
      </deployment>
      <sub-deployment name="jboss-seam-booking.war">
        <exclusions>
            <module name="javax.faces.api" slot="main"/>
            <module name="com.sun.jsf-impl" slot="main"/>
          </exclusions>
          <dependencies>
            <module name="javax.faces.api" slot="1.2"/>
                  <module name="com.sun.jsf-impl" slot="1.2"/>
          </dependencies>
      </sub-deployment>
    </jboss-deployment-structure>
    

    Reimplante o aplicativo apenas deletando o arquivo EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed e criando um arquivo jboss-seam-booking.ear.dodeploy vazio no mesmo diretório.
  7. Problema - Serviços com dependências indisponíveis/faltantes
    Quando você implanta o aplicativo, o log contém o seguinte erro:
    ERROR [org.jboss.as.deployment] (DeploymentScanner-threads - 2) {"Composite operation failed and was rolled back. Steps that failed:" => {"Operation step-2" => {"Services with missing/unavailable dependencies" => ["jboss.deployment.subunit.\"jboss-seam-booking.ear\".\"jboss-seam-booking.jar\".component.AuthenticatorAction.START missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".AuthenticatorAction.\"env/org.jboss.seam.example.booking.AuthenticatorAction/em\" ]","jboss.deployment.subunit.\"jboss-seam-booking.ear\".\"jboss-seam-booking.jar\".component.HotelSearchingAction.START missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".HotelSearchingAction.\"env/org.jboss.seam.example.booking.HotelSearchingAction/em\" ]","
      (... additional logs removed ...)
    "jboss.deployment.subunit.\"jboss-seam-booking.ear\".\"jboss-seam-booking.jar\".component.BookingListAction.START missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".BookingListAction.\"env/org.jboss.seam.example.booking.BookingListAction/em\" ]","jboss.persistenceunit.\"jboss-seam-booking.ear/jboss-seam-booking.jar#bookingDatabase\" missing [ jboss.naming.context.java.bookingDatasource ]"]}}}
    
    O que significa:

    Quando você obter um erro “Services with missing/unavailable dependencies”, observe o texto entre parênteses após "falta". Neste caso você verá:

    missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".AuthenticatorAction.\"env/org.jboss.seam.example.booking.AuthenticatorAction/em\" ]
    
    O “/em” indica um Gerenciador de Entidade e problema de fonte de dados.

    Como resolver isto:

    No JBoss Enterprise Application Plataform 6, a configuração de fonte de dados foi alterada e precisa ser definida no arquivo EAP6_HOME/standalone/configuration/standalone.xml. Uma vez que o JBoss Enterprise Application Plataform 6 lança uma fonte de dados de amostra que já está definida no arquivo standalone.xml, modifique o arquivo persistence.xml para uso da amostra da fonte de dados neste aplicativo. Buscando no arquivo standalone.xml, você pode perceber que o jndi-name para amostra da fonte de dados é java:jboss/datasources/ExampleDS. Modifique o arquivo jboss-seam-booking.jar/META-INF/persistence.xml para comentar o elemento jta-data-source existente e substituí-lo pelo o seguinte:

    <!-- <jta-data-source>java:/bookingDatasource</jta-data-source> -->
    <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
    

    Reimplante o aplicativo apenas deletando o arquivo EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed e criando um arquivo jboss-seam-booking.ear.dodeploy vazio no mesmo diretório.
  8. Problema - java.lang.ClassNotFoundException: org.hibernate.cache.HashtableCacheProvider
    Quando você implanta o aplicativo, o log contém o seguinte erro:
    ERROR [org.jboss.msc.service.fail] (MSC service thread 1-4) MSC00001: Failed to start service jboss.persistenceunit."jboss-seam-booking.ear/jboss-seam-booking.jar#bookingDatabase": org.jboss.msc.service.StartException in service jboss.persistenceunit."jboss-seam-booking.ear/jboss-seam-booking.jar#bookingDatabase": Failed to start service
      at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1786)
      (... log messages removed ...)
    Caused by: java.lang.ClassNotFoundException: org.hibernate.cache.HashtableCacheProvider from [Module "org.hibernate:main" from local module loader @12a3793 (roots: /home/sgilda/tools/jboss7/modules)]
      at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:191)
      (... log messages removed ...)
    
    O que significa:

    O ClassNotFoundException indica que falta uma dependência. Neste caso, isto não pode encontrar a classe org.hibernate.cache.HashtableCacheProvider.

    Como resolver isto:

    Não existe módulo para o “org.hibernate.cache”. Neste caso, o JAR contendo a classe fazia parte da implantação do JBoss Enterprise Application Plataform 5.1. Busque pelo JAR que contém a classe faltante no diretório EAP5_HOME/seam/lib/. Para isto, abra o console e digite o seguinte:

    $ cd EAP5_HOME/seam/lib
    $ grep 'org.hibernate.validator.InvalidValue' `find . -name '*.jar'`
    
    O resultado apresenta:
    Binary file ./hibernate-core.jar matches
    Binary file ./test/hibernate-all.jar matches
    
    Neste caso, copie o hibernate-core.jar para o diretório jboss-seam-booking.ear/lib/:
    cp EAP5_HOME/seam/lib/hibernate-core.jar jboss-seam-booking.ear/lib
    

    Reimplante o aplicativo apenas deletando o arquivo EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed e criando um arquivo jboss-seam-booking.ear.dodeploy vazio no mesmo diretório.
  9. Problema - java.lang.ClassCastException: org.hibernate.cache.HashtableCacheProvider
    Quando você implanta o aplicativo, o log contém o seguinte erro:
    ERROR [org.jboss.msc.service.fail] (MSC service thread 1-2) MSC00001: Failed to start service jboss.persistenceunit."jboss-seam-booking.ear/jboss-seam-booking.jar#bookingDatabase": org.jboss.msc.service.StartException in service jboss.persistenceunit."jboss-seam-booking.ear/jboss-seam-booking.jar#bookingDatabase": Failed to start service
      at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1786)
      (... log messages removed ...)
    Caused by: java.lang.ClassCastException: org.hibernate.cache.HashtableCacheProvider cannot be cast to org.hibernate.cache.spi.CacheProvider
      at org.hibernate.cache.internal.bridge.RegionFactoryCacheProviderBridge.init(RegionFactoryCacheProviderBridge.java:65)
      ... 20 more
    
    O que significa:

    O ClassCastException pode ser o resultado de muitos problemas. Caso você ver esta exceção no log, isto parece que a classe org.hibernate.cache.HashtableCacheProvider estende o org.hibernate.cache.spi.CacheProvider e está sendo carregado por um carregador de classe diferente ao da classe que isto estende. A classe org.hibernate.cache.HashtableCacheProvider está no hibernate-core.jar e está sendo carregado pelo carregador de classe do aplicativo. A classe que isto estende, , org.hibernate.cache.spi.CacheProvider, está no org/hibernate/main/hibernate-core-4.0.0.Beta1.jar e é carregado por aquele módulo. Isto não é óbvio, mas devido às alterações no Hibernate 4, esse problema é causado por um problema de compatibilidade inversa devido à mudança da classe HashtableCacheProvider a outro pacote. Essa classe foi movida do pacote org.hibernate.cache ao pacote org.hibernate.cache.internal. Caso você não remova a propriedade hibernate.cache.provider_class do arquivo persistence.xml, isto forçará o aplicativo Seam a empacotar as bibliotecas Hibernate antiga, resultando no ClassCastExceptions. Você deve preferir o uso do Infinispan ao invés do HashtableCacheProvider no JBoss Enterprise Application Plataform 6.

    Como resolver isto:

    No JBoss Enterprise Application Plataform 6, comente o hibernate.cache.provider_class property no arquivo jboss-seam-booking.jar/META-INF/persistence.xml conforme abaixo:

    <!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->
    

    Reimplante o aplicativo apenas deletando o arquivo EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed e criando um arquivo jboss-seam-booking.ear.dodeploy vazio no mesmo diretório.
  10. Nessas alturas, o aplicativo implanta sem nenhum erro, mas quando você acessa o URL http://localhost:8080/seam-booking/ num navegador e tenta "Entrar na Conta", você obterá um erro do período de rodagem "A página não está redirecionando a propriedade". Na próxima etapa você aprenderá como depurar e solucionar os erros do período de rodagem.
    Consulte a Seção 4.3.7, “Depuração e Resolução de erros e exceções do Seam 2.2 Booking Archive Runtime” para maiores informações sobre como depurar e resolver problemas do período de execução.

4.3.7. Depuração e Resolução de erros e exceções do Seam 2.2 Booking Archive Runtime

Na Etapa anterior, Seção 4.3.6, “Depuração e resolução do erros e exceções do Seam 2.2 Booking Archive Deployment” , você aprendeu como depurar os erros de implantação. Nessa etapa, você depura e resolve cada erro do período de execução que encontrar.

Importante

Os aplicativos que usam o Hibernate diretamente com o Seam 2.2 podem usar a versão do Hibernate 3 empacotados dentro do aplicativo. O Hibernate 4, que é fornecido através do módulo org.hibernate do JBoss Enterprise Application Plataform 6, não é suportado pelo Seam 2.2. Esta amostra possui por intenção ajudá-lo executar o seu aplicativo no JBoss Enterprise Application Plataform 6 como primeira etapa. Por favor certifique-se de que o empacotamento do Hibernate 3 com o aplicativo Seam 2.2 não é uma configuração suportada.

Procedimento 4.17. Depuração e resolução das exceções e erros do período de rodagem

Nessas alturas, quando você implantar o aplicativo você não vê quaisquer erros no log. No entanto, quando você acessar o U>RL do aplicativo, os erros apareceram no log.
  1. Problema - javax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''
    Quando você acessa o URL http://localhost:8080/seam-booking/ num navegador, você obterá uma mensagem "A página não está redirecionando a propriedade" e o log contém o seguinte erro:
    SEVERE [org.jboss.seam.jsf.SeamPhaseListener] (http--127.0.0.1-8080-1) swallowing exception: java.lang.IllegalStateException: Could not start transaction
      at org.jboss.seam.jsf.SeamPhaseListener.begin(SeamPhaseListener.java:598) [jboss-seam.jar:]
      (... log messages removed ...)
    Caused by: org.jboss.seam.InstantiationException: Could not instantiate Seam component: org.jboss.seam.transaction.synchronizations
      at org.jboss.seam.Component.newInstance(Component.java:2170) [jboss-seam.jar:]
      (... log messages removed ...)
    Caused by: javax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''
      at org.jboss.as.naming.util.NamingUtils.nameNotFoundException(NamingUtils.java:109)
      (... log messages removed ...)
    
    O que significa:

    Um NameNotFoundException indica um problema de nomeação JNDI. As regras de nomeação JNDI foram alteradas no JBoss Enterprise Application Plataform 6, de forma que você precisa modificar os nomes de busca para seguir as novas regras.

    Como resolver isto:

    Para depurar isto, observe no rastreamento do log servidor antecedente ao que o JNDI binding foi usado. Você poderá observar o seguinte no log do servidor:

    15:01:16,138 INFO  [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-1) JNDI bindings for session bean named RegisterAction in deployment unit subdeployment "jboss-seam-booking.jar" of deployment "jboss-seam-booking.ear" are as follows:
      java:global/jboss-seam-booking/jboss-seam-booking.jar/RegisterAction!org.jboss.seam.example.booking.Register
      java:app/jboss-seam-booking.jar/RegisterAction!org.jboss.seam.example.booking.Register
      java:module/RegisterAction!org.jboss.seam.example.booking.Register
      java:global/jboss-seam-booking/jboss-seam-booking.jar/RegisterAction
      java:app/jboss-seam-booking.jar/RegisterAction
      java:module/RegisterAction
      [JNDI bindings continue ...]
    
    Existe o total de oito NFO JNDI bindings listados no log, um para cada bean: RegisterAction, BookingListAction, HotelBookingAction, AuthenticatorAction, ChangePasswordAction, HotelSearchingAction, EjbSynchronizations, and TimerServiceDispatcher. Você precisa modificar o arquivo lib/components.xml do WAR para usar o novo JNDI bindings. No log, perceba que todos os EJB JNDI bindings iniciam com "java:app/jboss-seam-booking.jar". Substitua o elemento core:init conforme o seguinte:
    <!--     <core:init jndi-pattern="jboss-seam-booking/#{ejbName}/local" debug="true" distributable="false"/> -->
    <core:init jndi-pattern="java:app/jboss-seam-booking.jar/#{ejbName}" debug="true" distributable="false"/>
    
    
    Em seguida, você precisa adicionar o EjbSynchronizations e TimerServiceDispatcher JNDI bindings. Adicione os seguintes componentes ao arquivo:
    <component class="org.jboss.seam.transaction.EjbSynchronizations" jndi-name="java:app/jboss-seam/EjbSynchronizations"/>
    <component class="org.jboss.seam.async.TimerServiceDispatcher" jndi-name="java:app/jboss-seam/TimerServiceDispatcher"/>
    
    
    O arquivo components.xml deve parecer-se com o seguinte:
    <?xml version="1.0" encoding="UTF-8"?>
    <components xmlns="http://jboss.com/products/seam/components"
      xmlns:core="http://jboss.com/products/seam/core"
      xmlns:security="http://jboss.com/products/seam/security"
      xmlns:transaction="http://jboss.com/products/seam/transaction"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation=
        "http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.2.xsd
         http://jboss.com/products/seam/transaction http://jboss.com/products/seam/transaction-2.2.xsd
         http://jboss.com/products/seam/security http://jboss.com/products/seam/security-2.2.xsd
         http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.2.xsd">
    
        <!-- <core:init jndi-pattern="jboss-seam-booking/#{ejbName}/local" debug="true" distributable="false"/> -->
        <core:init jndi-pattern="java:app/jboss-seam-booking.jar/#{ejbName}" debug="true" distributable="false"/>
        <core:manager conversation-timeout="120000"
                      concurrent-request-timeout="500"
                      conversation-id-parameter="cid"/>
        <transaction:ejb-transaction/>
        <security:identity authenticate-method="#{authenticator.authenticate}"/>
        <component class="org.jboss.seam.transaction.EjbSynchronizations"
                jndi-name="java:app/jboss-seam/EjbSynchronizations"/>
        <component class="org.jboss.seam.async.TimerServiceDispatcher"
                jndi-name="java:app/jboss-seam/TimerServiceDispatcher"/>
    </components>
    
    

    Reimplante o aplicativo apenas deletando o arquivo standalone/deployments/jboss-seam-booking.ear.failed e criando um arquivo jboss-seam-booking.ear.dodeploy vazio no mesmo diretório.
  2. Erros do período de execução que devem ser resolvidos.
    A partir daqui, o seu aplicativo implanta e executa sem erro. Quando você acessar o URL http://localhost:8080/seam-booking/ num navegador, você estará apto a entrar com êxito.

4.3.8. Revisão do Sumário das Alterações feitas quando Migrando o Aplicativo Seam 2.2 Booking

Embora seja mais eficiente determinar as dependências com antecedência e adicionar as dependências em uma única etapa, esse exercício apresenta como os problemas aparecem no log e fornece alguma informação de como depurá-los e resolvê-los. Segue abaixo um sumário das alterações realizadas ao aplicativo quando migrando-o ao JBoss Enterprise Application Plataform 6.

Importante

Os aplicativos que usam o Hibernate diretamente com o Seam 2.2 podem usar a versão do Hibernate 3 empacotados dentro do aplicativo. O Hibernate 4, que é fornecido através do módulo org.hibernate do JBoss Enterprise Application Plataform 6, não é suportado pelo Seam 2.2. Esta amostra possui por intenção ajudá-lo a executar seu aplicativo no JBoss Enterprise Application Plataform 6 como primeira etapa. Por favor certifique-se de que o empacotamento do Hibernate 3 com o aplicativo Seam 2.2 não é uma configuração suportada.
  1. Você criou um arquivo jboss-deployment-structure.xml no diretório META-INF/ do EAR. Você adicionou o <dependencies> e <exclusions> para resolver o ClassNotFoundExceptions. Este arquivo contém os seguintes dados:
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
      <deployment>
      	  <dependencies>
    	      <module name="javax.faces.api" slot="1.2" export="true"/>
    	      <module name="com.sun.jsf-impl" slot="1.2" export="true"/>
    	      <module name="org.apache.commons.logging" export="true"/>
        	      <module name="org.dom4j" export="true"/>
    	      <module name="org.apache.commons.collections" export="true"/>
    	    </dependencies>
      </deployment>
      <sub-deployment name="jboss-seam-booking.war">
      	<exclusions>
    	      <module name="javax.faces.api" slot="main"/>
    	      <module name="com.sun.jsf-impl" slot="main"/>
    	    </exclusions>
    	    <dependencies>
    	      <module name="javax.faces.api" slot="1.2"/>
    	      <module name="com.sun.jsf-impl" slot="1.2"/>
    	    </dependencies>
      </sub-deployment>
    </jboss-deployment-structure>
    
    
  2. Você copiou os seguintes JARs a partir do diretório EAP5_HOME/jboss-eap-5.1/seam/lib/ ao diretório jboss-seam-booking.ear/lib/ para solucionar o ClassNotFoundExceptions:

    • hibernate-core.jar
    • hibernate-validator.jar
  3. Você modificou o arquivo jboss-seam-booking.jar/META-INF/persistence.xml conforme o seguinte.
    1. Você alterou o elemento jta-data-source para uso do banco de dados da Amostra que lança o JBoss Enterprise Application Plataform 6:
      <!-- <jta-data-source>java:/bookingDatasource</jta-data-source> -->
      <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
      
      
    2. Você comentou a propriedade hibernate.cache.provider_class:
      <!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->
      
      
  4. Você modificou o arquivo lib/components.xml do WAR para uso de novos JNDI bindings
    1. Você pode substituir o elemento existente core:init conforme abaixo:
      <!-- <core:init jndi-pattern="jboss-seam-booking/#{ejbName}/local" debug="true" distributable="false"/> -->
      <core:init jndi-pattern="java:app/jboss-seam-booking.jar/#{ejbName}" debug="true" distributable="false"/>
      
      
    2. Você adicionou elementos do componente para o "EjbSynchronizations" e "TimerServiceDispatcher" JNDI bindings
      <component class="org.jboss.seam.transaction.EjbSynchronizations" jndi-name="java:app/jboss-seam/EjbSynchronizations"/>
       <component class="org.jboss.seam.async.TimerServiceDispatcher" jndi-name="java:app/jboss-seam/TimerServiceDispatcher"/>
      
      

Apêndice A. Histórico de Revisão

Histórico de Revisões
Revisão 3.0.0-2Mon Oct 13 2014CS Builder Robot
Built from Content Specification: 11863, Revision: 507564

Nota Legal

Copyright © 2014 Red Hat, Inc..
This document is licensed by Red Hat under the Creative Commons Attribution-ShareAlike 3.0 Unported License. If you distribute this document, or a modified version of it, you must provide attribution to Red Hat, Inc. and provide a link to the original. If the document is modified, all Red Hat trademarks must be removed.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat Software Collections is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.