Guia de Migração
Para uso com o JBoss Enterprise Application Platform 6
Resumo
Capítulo 1. Introdução Copiar o linkLink copiado para a área de transferência!
1.1. Red Hat JBoss Enterprise Application Platform 6 (JBoss EAP 6) Copiar o linkLink copiado para a área de transferência!
1.2. Guia da Migração Copiar o linkLink copiado para a área de transferência!
Capítulo 2. Preparação para a Migração Copiar o linkLink copiado para a área de transferência!
2.1. Preparação para a Migração Copiar o linkLink copiado para a área de transferência!
Revisão das novidades no JBoss EAP 6
Diversas modificações foram realizadas neste lançamento que podem impactar na implantação dos aplicativos do EAP 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 no JBoss EAP 6” para maiores detalhes.Revisão da documentação da Inicialização
Certifique-se de revisar o capítulo nomeado Iniciação dos Aplicativos de Desenvolvimento no Guia de Desenvolvimento do JBoss EAP 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 efetuar o download e instalar o JBoss EAP 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.
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
2.2. Revisão das novidades no JBoss EAP 6 Copiar o linkLink copiado para a área de transferência!
Segue abaixo uma lista das diferenças visíveis no JBoss EAP 6 a partir do lançamento anterior.
- Módulo baseado no carregamento da classe
- No JBoss EAP 5, a arquitetura de carregamento de classe era hierárquico. No JBoss EAP 6, o carregamento de classe é baseado nos JBoss Modules. Isto oferece um isolamento do aplicativo verdadeiro, oculta as classes de implementação do servidor e apenas carrega as classes que seu aplicativo necessita. O carregamento de classe é para melhor desempenho. Os aplicativos gravados para o JBoss EAP 5 devem ser modificados para especificar as dependências e em alguns casos, arquivos de re-empacotamento. Para maiores informações, refira-se ao Carregamento de Classe e Módulos no Guia de Desenvolvimento do JBoss EAP 6 no https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.
- Domain Management
- No JBoss EAP 6, o servidor pode ser executado como um servidor autônomo ou num managed domain. Num managed 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 Managed Domains no Guia de Configuração e Administração do JBoss EAP 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:- Plataforma do Portal do JBoss 6
- Configuração da Implantação
- Servidores Autônomos e Managed Domains
- O JBoss EAP 5 usava um 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 EAP 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 arquivoEAP_HOME/standalone/configuration/standalone.xml. Para os servidores executando no managed domain, o servidor é configurado usando o arquivoEAP_HOME/domain/configuration/domain.xml. A informação contida nos arquivos de configuração do JBoss EAP 5 deve ser integrada ao novo arquivo de configuração única. - Ordenação das implantações
- O JBoss EAP 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 EAP 5, que consistem em módulos múltiplos implantados como EARs que 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
- Conforme mencionado anteriormente, o JBoss EAP 6 não usa mais uma configuração de implantação baseado no perfil, portanto não existe diretório
EAP_HOME/server/. Os arquivos de configuração para os servidores autônomos estão localizados agora no diretórioEAP_HOME/standalone/configuration/e as implantações estão localizadas no diretórioEAP_HOME/standalone/deployments/. Para os servidores sendo executados no managed domain, os arquivos de configuração podem ser encontrados no diretórioEAP_HOME/domain/configuration/e as implantações podem ser encontradas no diretórioEAP_HOME/domain/deployments/.No JBoss EAP 5, o script do LinuxEAP_HOME/bin/run.shou o script do WindowsEAP_HOME/bin/run.batera usado para iniciar o servidor. No JBoss EAP 6, o script de iniciação do servidor depende de como você executa o seu servidor. O script do LinuxEAP_HOME/bin/standalone.shou script do WindowsEAP_HOME/bin/standalone.baté usado para iniciar o servidor autônomo. O script do LinuxEAP_HOME/bin/domain.shou o script do WindowsEAP_HOME/bin/domain.baté usado para iniciar um managed domain. - Pesquisas JNDI
- O JBoss EAP 6 usa agora JNDI namespaces portáveis padronizados. Os aplicativos gravados no JBoss EAP 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, “Nomes do EJB JNDI Portátil ”.
2.3. Revisão da Lista de Recursos Substituídos e não Suportados Copiar o linkLink copiado para a área de transferência!
Capítulo 3. Migre seu Aplicativo Copiar o linkLink copiado para a área de transferência!
3.1. Alterações Requeridas para a maioria dos Aplicativos Copiar o linkLink copiado para a área de transferência!
3.1.1. Revisão das Alterações Requeridas para a Maioria dos Aplicativos Copiar o linkLink copiado para a área de transferência!
3.1.2. Alterações do Carregamento de Classe Copiar o linkLink copiado para a área de transferência!
3.1.2.1. Atualização do Aplicativo devido às Alterações do Carregamento da Classe Copiar o linkLink copiado para a área de transferência!
- 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.
- Caso o seu aplicativo não efetuar a conexão, 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
- 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 do Módulo Copiar o linkLink copiado para a área de transferência!
Um módulo é apenas apto a acessar suas próprias classes e as classes de qualquer módulo que possui uma dependência explícita ou implícita.
Procedimento 3.1. Compreendendo as Dependências do Módulo
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 exemplojavax.apiesun.jdk. Isto faz as classes visíveis à implantação no período de execução e libera o desenvolvedor da tarefa de adicionar explicitamente as dependências. Para maiores detalhes de como e quando essas dependências implícitas são adicionadas, refira-se às Dependências de Módulo Implícitas no capítulo nomeado Carregamento de Classe e Módulos do Guia de Desenvolvimento do JBoss EAP 6 no https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.Compreendendo as dependências explícitas
Para outras classes, os módulos devem ser especificados explicitamente ou as dependências ausentes resultam em erros de implantação ou do período de execução. Caso falte uma dependência, você verá traçosClassNotFoundExceptionsouNoClassDefFoundErrorsno 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çosClassCastExceptionsno log do servidor. Para especificar as dependências, modifique oMANIFEST.MFou crie umjboss-deployment-structure.xmldo arquivo do descritor de implantação específico do JBoss. Para maiores informações sobre as dependências do módulo, refira-se à Visão Geral de Carregamento de Classe e Módulo no capítulo chamado Carregamento de Classe e Módulo no Guia de Desenvolvimento do JBoss EAP 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 Copiar o linkLink copiado para a área de transferência!
O carregamento de classe no JBoss EAP 6 é consideravelmente diferente do que as versões anteriores do JBoss EAP. O carregamento de classe é agora baseado no projeto de Módulos do JBoss. Ao invés de um único carregador, o 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 EAP 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 ser que uma dependência explícita 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 às Dependências de Módulo Implícitas no capítulo nomeado Carregamento de Classe e Módulos no Guia de Desenvolvimento para o JBoss Enterprise Application Plataform 6 no https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.
Quando você migrar seu aplicativo ao JBoss EAP 6, você pode precisar executar uma ou mais das seguintes tarefas devido às alterações do carregamento de classe modular:
3.1.3. Alterações do Arquivo de Configuração Copiar o linkLink copiado para a área de transferência!
3.1.3.1. Criação ou Modificação dos Arquivos que controlam o Controle de Carregamento da Classe no JBoss EAP 6 Copiar o linkLink copiado para a área de transferência!
Devido à alteração no JBoss EAP 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 Carregamento de Classe e Módulos no Guia de Desenvolvimento para o JBoss EAP 6 no https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.
- jboss-web.xml
- Caso tenha definido um elemento
<class-loading>no arquivojboss-web.xml, você precisará removê-lo. O comportamento que isto causou no JBoss EAP 5 é agora o comportamento do carregamento da classe default no JBoss EAP 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 arquivojboss-web.xmlque encontra-se comentado.Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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
Dependenciesou como entradasClass-Path.Segue abaixo uma amostraMANIFEST.MFeditada por um desenvolvedor:Manifest-Version: 1.0 Dependencies: org.jboss.logmanager Class-Path: OrderManagerEJB.jar
Manifest-Version: 1.0 Dependencies: org.jboss.logmanager Class-Path: OrderManagerEJB.jarCopy to Clipboard Copied! Toggle word wrap Toggle overflow 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.xmlpara gerar as dependências para o arquivoMANIFEST.MF. Caso seu aplicativo usar o EJB 3.0, você pode possuir uma seção no arquivopom.xmlparecida com o seguinte:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Caso o código EJB 3.0 usar oorg.apache.commons.log, você precisará daquela dependência no arquivoMANIFEST.MF. Com o objetivo de gerar aquela dependência, adicione o elemento<plugin>ao arquivopom.xml, conforme abaixo:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Na amostra acima, o arquivosrc/main/resources/META-INF/MANIFEST.MFprecisa apenas conter a entrada da dependência:Dependencies: org.apache.commons.logging
Dependencies: org.apache.commons.loggingCopy to Clipboard Copied! Toggle word wrap Toggle overflow O Maven gerará o arquivoMANIFEST.MFcompleto:Manifest-Version: 1.0 Dependencies: org.apache.commons.logging
Manifest-Version: 1.0 Dependencies: org.apache.commons.loggingCopy to Clipboard Copied! Toggle word wrap Toggle overflow
- 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 arquivojboss-deployment-structure.xmlque adiciona uma dependência para o módulo JSF 1.2 e previne o carregamento automático do módulo JSF 2.0.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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 EAP, 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>noapplication.xmlque 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 ummyBeans.jare ummyApp.warcom ummyApp.ear. Um servlet nomyApp.war@EJBinjeta um bean domyBeans.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 precisará 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.Neste caso, o servidor não está apto a determinar que o componente EJB está noinit() { Context ctx = new InitialContext(); ctx.lookup("TheBeanInMyBeansModule"); }init() { Context ctx = new InitialContext(); ctx.lookup("TheBeanInMyBeansModule"); }Copy to Clipboard Copied! Toggle word wrap Toggle overflow myBeans.jare você precisa reforçar que os componentes nomyBeans.jarsão inicializados e ativados antes dos componentes nomyApp.war. Para isto, você configura o elemento<initialize-in-order>paratruee especifica a ordem dos módulosmyBeans.jaremyApp.warno arquivoapplication.xml.Segue abaixo uma amostra que usa o elemento<initialize-in-order>para controlar a ordem de implantação. OmyBeans.jaré implantado antes do arquivomyApp.war.Copy to Clipboard Copied! Toggle word wrap Toggle overflow O esquema para o arquivoapplication.xmlpode 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>paratruereduz 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ção
jboss-ejb3.xmlsubstitui o descritor da implantaçãojboss.xmlpara substituição e adição à recursos fornecidos pelo Java Enterprise Edition (EE - Edição do Java Enterprise) definidos no descritor da implantaçãoejb-jar.xml. O novo arquivo é incompatível com ojboss.xmle ojboss.xmlé agora ignorado nas implantações. - login-config.xml
- O arquivo
login-config.xmlnã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 arquivostandalone/configuration/standalone.xml. Caso você esteja executando o seu servidor num managed domain, esse é o arquivodomain/configuration/domain.xml.
3.1.3.2. jboss-deployment-structure.xml Copiar o linkLink copiado para a área de transferência!
jboss-deployment-structure.xml é um novo descritor de implantação opcional para o JBoss EAP 6. Este descritor de implantação fornece controle sobre o carregamento da classe na implantaçã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 Copiar o linkLink copiado para a área de transferência!
Nas versões anteriores do JBoss EAP, todos os recursos dentro do diretório WEB-INF/ foram adicionados ao caminho de classe WAR. No JBoss EAP 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 dos artefatos do aplicativo do pacote nas localizações especificadas pode resultar no ClassNotFoundException, NoClassDefError, ou outros erros do período de execução.
- 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/ouWEB-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 você deseje disponibilizar recursos personalizados a todos os aplicativos executando no servidor do JBoss EAP 6, você deve criar um modelo personalizado. Esta 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 Copiar o linkLink copiado para a área de transferência!
Nas versões anteriores do JBoss EAP, o diretório EAP_HOME/server/SERVER_NAME/conf/ estava no classpath e disponível ao aplicativo. Para disponibilizar as propriedades ao caminho da classe do aplicativo no JBoss EAP 6, você deve empacotá-las com seu aplicativo.
Procedimento 3.2.
- Caso esteja implantando um arquivo WAR, você deve empacotar essas propriedades na pasta
WEB-INF/classes/do WAR. - 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 Copiar o linkLink copiado para a área de transferência!
Procedimento 3.3. Criação de um Módulo Personalizado
- Crie e preencha a estrutura do diretório
module/.- Crie uma estrutura de diretório sob o diretório
EAP_HOME/modulepara conter os arquivos e JARs. Por exemplo:cd EAP_HOME/modules/ $ mkdir -p myorg-conf/main/properties
$ cd EAP_HOME/modules/ $ mkdir -p myorg-conf/main/propertiesCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Mova os arquivos de propriedades ao diretório
EAP_HOME/modules/myorg-conf/main/properties/criado na etapa anterior. - Crie um arquivo
module.xmlno diretórioEAP_HOME/modules/myorg-conf/main/contendo o seguinte XML:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- Modifique o subsistema
eeno 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.
- Inicie o servidor e conecte-se ao Management CLI.
- Insira a seguinte linha de comando para o Linux:
EAP_HOME/bin/jboss-cli.sh --connect
$ EAP_HOME/bin/jboss-cli.sh --connectCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Insira a seguinte linha de comando para o Windows:
C:\>EAP_HOME\bin\jboss-cli.bat --connect
C:\>EAP_HOME\bin\jboss-cli.bat --connectCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Você deverá observar a seguinte resposta:Conectado ao controlador autônomo no localhost:9999
Conectado ao controlador autônomo no localhost:9999Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Para criar o elemento
myorg-conf<global-modules> no subsistemaee, digite o seguinte na linha de comando:/subsystem=ee:write-attribute(name=global-modules, value=[{"name"=>"myorg-conf","slot"=>"main"}])/subsystem=ee:write-attribute(name=global-modules, value=[{"name"=>"myorg-conf","slot"=>"main"}])Copy to Clipboard Copied! Toggle word wrap Toggle overflow Você deverá ver o seguinte resultado:{"outcome" => "success"}{"outcome" => "success"}Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- Siga essas etapas caso prefira editar manualmente o arquivo da configuração do servidor.
- 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.xmlou caso esteja executando um managed domain, o arquivo é oEAP_HOME/domain/configuration/domain.xml. - Encontre o subsistema
eee adicione o módulo global paramyorg-conf. Segue abaixo uma amostra do elemento do subsistemaeemodificado para inclusão do elementomyorg-conf:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- 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");Thread.currentThread().getContextClassLoader().getResource("my.properties");Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.1.4. Alterações do Registro em Log Copiar o linkLink copiado para a área de transferência!
3.1.4.1. Modificação das Dependências de Registro em Log Copiar o linkLink copiado para a área de transferência!
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.
Procedimento 3.4. Atualização do código de registro de log do aplicativo
3.1.4.2. Atualização do Código do Aplicativo para Frameworks de Registro de Log de Terceiros Copiar o linkLink copiado para a área de transferência!
No JBoss EAP 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 EAP 6.
Procedimento 3.5. Configuração do JBoss EAP 6 para uso de um arquivo log4j.properties ou log4j.xml
- Criação de um
jboss-deployment-structure.xmlcom o seguinte conteúdo:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Posicione o arquivo
jboss-deployment-structure.xmltanto no diretórioMETA-INF/ou diretórioWEB-INF/, caso esteja implantando um WAR ou no diretórioMETA-INF/, caso você esteja implantando um EAR. - Adicione o arquivo
log4j.propertiesoulog4j.xmlno diretóriolib/de seu EAR ou no diretórioWEB-INF/classes/de sua implantação WAR. - Implante seu aplicativo.
Nota
3.1.4.3. Modificação do Código para Uso do Novo Framework de Registro de Log do JBoss Copiar o linkLink copiado para a área de transferência!
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
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:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Adição de dependência de registro em log
O JAR contendo as classes do JBoss Logging está localizado no módulo nomeadoorg.jboss.logging. O seu arquivoMANIFEST-MFdeve parecer com o seguinte:Manifest-Version: 1.0 Dependencies: org.jboss.logging
Manifest-Version: 1.0 Dependencies: org.jboss.loggingCopy to Clipboard Copied! Toggle word wrap Toggle overflow Por favor consulte a Seção 3.1.2.3, “Atualização das Dependências do Aplicativo devido às Alterações do Carregamento da Classe” e a Seção 4.2.1, “Depuração e Solução dos Problemas de Migração” para maiores informações sobre como encontrar a dependência do módulo.
3.1.5. Alterações do Empacotamento do Aplicativo Copiar o linkLink copiado para a área de transferência!
3.1.5.1. Modificação do Empacotamento dos EARS e WARs Copiar o linkLink copiado para a área de transferência!
Quando você migrar seu aplicativo, é possível que você tenha 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:
- Dependências do sistema
- Dependências do Usuário
- Recursos Locais
- Dependências inter-implantadas
Procedimento 3.7. Modificação do empacotamento do arquivo
Empacotamento do WAR
O WAR é um módulo único e todas as classes no WAR são carregadas com o mesmo carregador de classe. Isto significa que as classes empacotadas no diretórioWEB-INF/lib/são tratadas da mesma forma que as classes no diretórioWEB-INF/classes.Empacotamento de um EAR
Um EAR consiste de módulos múltiplos. O diretórioEAR/lib/é um módulo único e cada WAR ou sub-implantação EJB jar no 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órioEAR/lib/. No entanto, as sub-implantações nem sempre possuem uma dependência automática para permitir que se acessassem entre si. Este comportamento é controlado pela configuração do elemento<ear-subdeployments-isolated>na configuração do subsistemaee, conforme abaixo:<subsystem xmlns="urn:jboss:domain:ee:1.0" > <ear-subdeployments-isolated>false</ear-subdeployments-isolated> </subsystem>
<subsystem xmlns="urn:jboss:domain:ee:1.0" > <ear-subdeployments-isolated>false</ear-subdeployments-isolated> </subsystem>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Por default, isto é configurado para falso, permitindo que as sub-implantações vejam as classes pertencentes às demais sub-implantações com o EAR.Para maiores informações sobre o carregamento da classe, refira-se ao capítulo Carregamento de Classe e Módulos no Guia de Desenvolvimento para o JBoss EAP 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 Copiar o linkLink copiado para a área de transferência!
3.1.6.1. Atualização do Aplicativo devido às Alterações da Configuração Copiar o linkLink copiado para a área de transferência!
- 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”.
- Caso o seu aplicativo usar JPA e empacotar o Hibernate JARs, consulte as opções de migração na Seção 3.1.6.4, “Configuração da Fonte de Dados para o Hibernate ou JPA”.
- 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”.
- 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 Copiar o linkLink copiado para a área de transferência!
Nas versões anteriores do JBoss EAP, 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.
domain/configuration/domain.xml. Caso a instância do JBoss EAP 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 (Management Console da Web) e a interface da linha de comando (CLI). Essas ferramentas facilitam o gerenciamento de implantações e configuram servidores múltiplos sendo executados no managed domain.
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 que é gerenciável pelo Management Console da Web e CLI, consulte a Seção 3.1.6.3, “Instalação e Configuração do JDBC Driver”.
Você pode usar a ferramenta IronJacamar para migrar a fonte de dados e as configurações do adaptador do recurso. Esta ferramenta converte os arquivos de configuração do estilo *-ds.xml no formato esperado pelo JBoss EAP 6. Consute: Seção 4.1.6, “Uso da Ferramenta IronJacamar para Migração da Fonte de Dados e Configurações do Adaptador de Recurso” para maiores informações.
3.1.6.3. Instalação e Configuração do JDBC Driver Copiar o linkLink copiado para a área de transferência!
O JDBC driver pode ser instalado no contêiner em uma das duas seguintes maneiras:
- como implantação
- como módulo core
domain/configuration/domain.xml. Caso a instância do JBoss EAP 6 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 EAP 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
Instalação do JBBC Driver
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 EAP 6 estiver sendo executada como um servidor autônomo, copie o JDBC 4.0 compatível ao JAR no diretórioEAP_HOME/standalone/deployments/. Caso o servidor estiver sendo executado num managed domain, copie o JAR ao diretórioEAP_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/
$cp mysql-connector-java-5.1.15.jar EAP_HOME/standalone/deployments/Copy to Clipboard Copied! Toggle word wrap Toggle overflow Qualquer driver compatível com o JDBC 4.0 é automaticamente reconhecido e instalado no sistema pelo nome e versão. Um JAR compatível com o JDBC 4.0 contém um texto com arquivo nomeadoMETA-INF/services/java.sql.Driverque 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.Driverao JAR sob o caminhoMETA-INF/services/. Esse arquivo deve conter o nome de classe do driver, por exemplo:com.mysql.jdbc.Driver
com.mysql.jdbc.DriverCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Crie um arquivo
java.sql.Driverno diretório de implantação. Para uma instância do JBoss EAP 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 managed domain, o arquivo deve ser posicionado aqui:EAP_HOME/domain/deployments/META-INF/services/java.sql.Driver.
Os aspectos positivos desta abordagem são:Os aspectos negativos 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 managed 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.
- 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/.
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órioEAP_HOME/modules/. Esta estrutura contém o JDBC driver JAR, qualquer licença do fornecedor adicional ou JARs de localização e um arquivomodule.xmlpara definir o módulo.Instale o MySQL JDBC Driver como módulo core
- Crie uma estrutura de diretório
EAP_HOME/modules/com/mysql/main/ - No subdiretório
main/, crie um arquivomodule.xmlcontendo a seguinte definição do módulo para o MySQL JDBC driver:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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 nomeadojavax.api. Este módulo está localizado sob o diretóriomodules/system/layers/base/javax/api/main/.Nota
Certifique-se de que você NÃO possui espaço no início do arquivomodule.xmlou você obterá um erro "New missing/unsatisfied dependencies" para este driver. - 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/
$ cp mysql-connector-java-5.1.15.jar EAP_HOME/modules/com/mysql/main/Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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.- Crie a estrutura do diretório
EAP_HOME/modules/com/ibm/db2/main/. - No subdiretório
main/crie um arquivomodule.xmlcontendo a seguinte definição do módulo para o IBM DB2 JDBC driver e licença:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Nota
Certifique-se de que você NÃO possui espaço no início do arquivomodule.xmlou você obterá um erro "New missing/unsatisfied dependencies" para este driver. - 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/
$ cp db2jcc.jar EAP_HOME/modules/com/ibm/db2/main/ $ cp db2jcc_license_cisuz.jar EAP_HOME/modules/com/ibm/db2/main/Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Os aspectos positivos desta abordagem são:Os aspectos negativos 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.
- É mais difícil configurar um módulo.
- O módulo deve ser manualmente copiado para cada servidor executando num managed domain.
Configuração da fonte de dados
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 arquivoMETA-INF/services/java.sql.Driverque 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:Um driver que não seja compatível com o JDBC 4.0 requer um atributo<driver name="mysql-connector-java-5.1.15.jar" module="com.mysql"/>
<driver name="mysql-connector-java-5.1.15.jar" module="com.mysql"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow <driver-class>para identificar a classe do driver desde que não haja um arquivoMETA-INF/services/java.sql.Driverque 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>
<driver name="mysql-connector-java-5.1.15.jar" module="com.mysql"><driver-class>com.mysql.jdbc.Driver</driver-class></driver>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Criação da fonte de dados
Crie um elemento<datasource>na seção<datasources>do arquivostandalone.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 que sua alteração seja persistida na iniciação do servidor.Segue abaixo uma amostra de um elemento de fonte de dados MySQL no arquivostandalone.xml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.1.6.4. Configuração da Fonte de Dados para o Hibernate ou JPA Copiar o linkLink copiado para a área de transferência!
Caso o seu aplicativo usar o JPA e empacotar atualmente JBoss JARs, você deverá usar o Hibernate que está incluso com o JBoss EAP 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
- Remova o Hibernate JARs de suas pastas da biblioteca do aplicativo.
- Remova ou comente o elemento
<hibernate.transaction.manager_lookup_class>em seu arquivopersistence.xmluma vez que este elemento não é necessário.
3.1.6.5. Atualização da Configuração do Adaptador de Recurso Copiar o linkLink copiado para a área de transferência!
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 EAP 6, o adaptador de recurso é configurado no arquivo de configuração do servidor. Caso você esteja executando num managed domain, o arquivo de configuração é o arquivo EAP_HOME/domain/configuration/domain.xml. Caso você esteja executando 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
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.1"/>
<subsystem xmlns="urn:jboss:domain:resource-adapters:1.1"/>
*-ds.xml do adaptador de recurso.
3.1.7. Alterações de Segurança Copiar o linkLink copiado para a área de transferência!
3.1.7.1. Configuração das Alterações de Segurança do Aplicativo Copiar o linkLink copiado para a área de transferência!
Nas versões anteriores do JBoss EAP, os arquivos de propriedades posicionados no diretório EAP_HOME/server/SERVER_NAME/conf/ estavam no classpath e poderiam ser facilmente encontrados pelo UsersRolesLoginModule. No JBoss EAP 6, a estrutura do diretório foi alterada. Os arquivos da propriedade devem ser empacotados com aplicativo para disponibilizá-los no classpath.
Importante
security-domains para o standalone/configuration/standalone.xml ou o arquivo de configuração do servidor domain/configuration/domain.xml:
${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/.
Os security domains não usam mais o prefixo java:/jaas/ em seus nomes no JBoss EAP 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 pelojboss.xmlno JBoss EAP 6.
3.1.8. Alterações JNDI Copiar o linkLink copiado para a área de transferência!
3.1.8.1. Atualização dos Nomes JNDI Namespace do Aplicativo Copiar o linkLink copiado para a área de transferência!
O EJB 3.1 introduzido a um JNDI namespace glogal padronizado e uma série de namespaces relacionados que mapeiam várious escopos do aplicativo Java EE. Os nomes do EJB Portátil é apenas limitado a três deles: java:global, java:module e java:app. Os aplicativos com os EJBs que usam o JNDI devem ser alterados para seguirem a nova convenção padronizada do JNDI namespace.
Procedimento 3.10. Modificação das pesquisas JNDI
- Leia mais a respeito deste assunto na Seção 3.1.8.2, “Nomes do EJB JNDI Portátil ”
As amostras de espaços de nome JNDI dos lançamentos anteriores e como eles são especificados no JBoss EAP podem ser encontradas na: Seção 3.1.8.5, “Amostra do JNDI Namespaces nos Lançamentos Anteriores e como são especificados no JBoss EAP 6”
3.1.8.2. Nomes do EJB JNDI Portátil Copiar o linkLink copiado para a área de transferência!
A especificação do Java EE 6 define quatro namespaces lógicos, cada um com o seu próprio escopo. No entanto, os nomes do EJB portátil apenas obtém o limite de três deles. A seguinte tabela detalha quando e como usar cada namespace.
| 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 neste namespace para encontrar os arquivos EJBs externos ao mesmo servidor.
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
|
3.1.8.3. Revisão das Regras JNDI Namespace Copiar o linkLink copiado para a área de transferência!
O JBoss EAP 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 nomes relativos não qualificados como o
DefaultDSoujdbc/DefaultDSdevem ser relativamente qualificados para ojava:comp/env,java:module/envoujava:jboss/env, dependendo do contexto. - Os nomes
absolutenão qualificados como/jdbc/DefaultDSdevem ser relativamente qualificados a um nomejava:jboss/root. - Os nomes
absolutequalificados como ojava:/jdbc/DefaultDSdevem ser qualificados da mesma forma que os nomesabsolutenão qualificados acima. - O espaço do nome
java:jbossespecial é compartilhado por toda a instância do servidor AS. - Qualquer nome
relativecom o prefixojava:deve estar em um dos cinco espaços do nome:comp,module,app,globaloujbossproprietário. Qualquer nome começando comjava:xxxonde 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) Copiar o linkLink copiado para a área de transferência!
- Segue abaixo uma amostra da pesquisa JNDI no JBoss EAP 5.1. Este código é normalmente encontrado num método de inicialização.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Note que o nome de pesquisa éOrderManagerApp/ProductManagerBean/local. - Segue abaixo uma amostra de como a mesma pesquisa seria codificada no JBoss EAP 6 usando o CDI.
@EJB(lookup="java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager") private ProductManager productManager;
@EJB(lookup="java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager") private ProductManager productManager;Copy to Clipboard Copied! Toggle word wrap Toggle overflow Os valores de pesquisa são definidos como variáveis do associado e usam o novo nomejava:appJNDI namespacejava:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager. - Caso você prefira não usar o CDI, você pode continuar a criar um novo InitialContext conforme acima e modificar a pesquisa para uso do novo nome JNDI namespace.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.1.8.5. Amostra do JNDI Namespaces nos Lançamentos Anteriores e como são especificados no JBoss EAP 6 Copiar o linkLink copiado para a área de transferência!
| Namespace no JBoss EAP 5.x | Namespace no JBoss EAP 6 | Comentários adicionais |
|---|---|---|
| OrderManagerApp/ProductManagerBean/local | java:module/ProductManagerBean!services.ejb.ProductManager | O Java EE 6 binding default. Possui escopo para o módulo atual e apenas acessível com o mesmo módulo. |
| OrderManagerApp/ProductManagerBean/local | java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager | O Java EE 6 binding default. Possui escopo para o aplicativo atual e apenas acessível com o mesmo aplicativo. |
| OrderManagerApp/ProductManagerBean/local | java:global/OrderManagerApp/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager | O binding default do Java EE 6. Possui escopo para o servidor do aplicativo e acessível globalmente. |
| java:comp/UserTransaction | java:comp/UserTransaction | O namespace possui escopo ao componente atual. Não é acessível para threads que não estão no Java EE 6, por exemplo: os threads criados diretamente pelo seu aplicativo. |
| 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 Copiar o linkLink copiado para a área de transferência!
3.2.1. Revisão das Alterações Dependentes em seus Componentes e Arquitetura do Aplicativo Copiar o linkLink copiado para a área de transferência!
- 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 o JBoss EAP 6 configura automaticamente o RESTEasy, de forma de que você não precisa mais configurá-lo automaticamente. Consulte a Seção 3.2.5.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 EAP 6. Caso o seu aplicativo usar o LDAP, refira-se ao seguinte tópico para maiores informações na Seção 3.2.6.1, “Configuração das Alterações LDAP Security Realm”.
- Messaging
- O JBoss Messaging não está mais incluído no JBoss EAP 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.7.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ê habilita o clustering foi alterada no JBoss EAP 6. Consulte a Seção 3.2.8.1, “Realize Alterações ao seu Aplicativo para o Clustering” para maiores detalhes.
- Implantação de estilo de serviço
- Embora o JBoss EAP 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.9.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.10.1, “Migração dos Aplicativos Implantados do JBoss EAP 5 que realiza Invocações Remotas ao JBoss EAP 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.13.1, “Migração dos Arquivos Seam 2.2 para o JBoss EAP 6” para melhor entendimento das alterações necessárias que você precisa realizar.
- Spring
- Consulte a Seção 3.2.14.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 EAP 6 que podem impactar o seu aplicativo, consulte a Seção 3.2.15.1, “Outras alterações que podem afetar sua Migração”.
3.2.2. Alterações JPA e Hibernate Copiar o linkLink copiado para a área de transferência!
3.2.2.1. Atualização dos Aplicativos que usam Hibernate e/ou JPA Copiar o linkLink copiado para a área de transferência!
Caso seu aplicativo usar Hibernate ou JPA, leia as seguintes seções e realize quaisquer alterações necessárias para migrar ao JBoss EAP 6.
Procedimento 3.11.
3.2.2.2. Configuração das Alterações para Aplicativos que usam o Hibernate e o JPA Copiar o linkLink copiado para a área de transferência!
Caso o seu aplicativo contenha um arquivo persistence.xml ou código usando anotações @PersistenceContext ou @PersistenceUnit, o JBoss EAP 6 detecta isto durante a implantação e assume que o aplicativo usa o JPA. Ele adiciona o Hibernate 4 mais algumas outras dependências ao 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
Procedimento 3.12. Configuração do Aplicativo
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óriolib/do aplicativo ou adicionando-as ao classpath usando algum outro método. Em alguns casos, isto pode resultar noClassCastExceptionsou 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.Instrução do servidor para uso apenas das bibliotecas HIbernate 3.
O JBoss EAP 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 ojboss.as.jpa.providerModuleparahibernate3-bundlednopersistence.xml, conforme abaixo: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.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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 EAP 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>parafalseno arquivopersistence.xml.
3.2.2.3. Propriedades da Unidade de Persistência Copiar o linkLink copiado para a área de transferência!
O JBoss EAP 6 configura automaticamente as seguintes propriedades da configuração Hibernate 4.x:
| 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 EAP 6 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 EAP 6.
|
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 deve ser único por todas as implantações do aplicativo na instância do JBoss EAP 6.
|
new_generator_mappings esteja configurado para true:
- O
@GeneratedValue(AUTO)mapeia paraorg.hibernate.id.enhanced.SequenceStyleGenerator. - O
@GeneratedValue(TABLE)mapeia paraorg.hibernate.id.enhanced.TableGenerator. - O
@GeneratedValue(SEQUENCE)mapeia paraorg.hibernate.id.enhanced.SequenceStyleGenerator.
new_generator_mappings esteja configurado para false:
- O
@GeneratedValue(AUTO)mapeia para o Hibernate "native". - O
@GeneratedValue(TABLE)mapeia para oorg.hibernate.id.MultipleHiLoPerTableGenerator. - O
@GeneratedValue(SEQUENCE)mapeia para o Hibernate "seqhilo".
As seguintes propriedades JPA são suportadas na definição de unidade de persistência no arquivo persistence.xml:
| 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 EAP 6 a funcionar com o fornecedor de persistência.
Os valores válidos e corretos são:
|
3.2.2.4. Atualização de seu Aplicativo Hibernate 3 para uso do Hibernate 4 Copiar o linkLink copiado para a área de transferência!
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
- O comportamento default gerador da sequência de auto-incremento foi alterado no JBoss EAP 6. Consulte a Seção 3.2.2.5, “Mantenha o Comportamento Existente do Valor Gerado Automaticamente da Identidade Hibernate” para maiores informações.
- Determine a versão do Hibernate sendo utilizado pelo aplicativo e escolha o procedimento de atualização correto abaixo.
- 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 Copiar o linkLink copiado para a área de transferência!
hibernate.id.new_generator_mappings que direciona como as colunas de sequência e identidade são geradas usando o @GeneratedValue. No JBoss EAP 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.
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átil 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 EAP 6 padroniza a propriedade
hibernate.id.new_generator_mappingsparatruee isto não deve ser alterado. - Para novos aplicativos native Hibernate , o JBoss EAP 6 aplica o default na propriedade
hibernate.id.new_generator_mappingsparafalse. Você deve configurar essa propriedade paratrue.
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 EAP 6.
- Para aplicativos JPA existentes, ao JBoss EAP 6 aplica o default na propriedade
hibernate.id.new_generator_mappingsparatrue. Você deve configurar esta propriedade parafalseno arquivopersistence.xml. - Para aplicativos native Hibernate, o JBoss EAP 6 aplica o default no
hibernate.id.new_generator_mappingsparafalsee isto não deve ser alterado.
3.2.2.6. Migração de seu Aplicativo Hibernate 3.3.x para o Hibernate 4.x Copiar o linkLink copiado para a área de transferência!
Procedimento 3.14.
Mapeie os tipos de
textHibernate paraJDBC LONGVARCHARNas versões anteriores do Hibernate 3.5, o tipo detextera mapeado paraJDBC CLOB. Um novo tipo de Hibernate,materialized_clob, foi adicionado ao Hibernate 4 para mapear as propriedades JavaStringparaJDBC CLOB. Caso o seu aplicativo possuir propriedades configuradas comotype="text"que possuem por intenção serem mapeadas paraJDBC CLOB, você deve fazer o seguinte:- Caso o seu aplicativo usar arquivos de mapeamento hbm, altere a propriedade para
type="materialized_clob". - Caso seu aplicativo usar anotações, você deve substituir
@Type(type = "text")por@Lob.
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 noorg.hibernate.criterionforam alteradas.- Devido às alterações no
CountProjection,Projections.rowCount(),Projections.count(propertyName)eProjections.countDistinct(propertyName), as projeçõescountecount distinctretornam agora um valorLong. - Devido às alterações no
Projections.sum(propertyName), as projeçõessumretornam agora um tipo de valor que depende do tipo de propriedade.Nota
Falha ao modificar o seu código do aplicativo numjava.lang.ClassCastException.- Para propriedades mapeadas com tipos de número primitivo, Número, Longo ou Curto, o valor Longo é retornado;
- 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 Copiar o linkLink copiado para a área de transferência!
Procedimento 3.15.
Mescle o AnnotationConfiguration na Configuração
Embora oAnnotationConfigurationtenha sido substituído, ele não deve afetar a sua migração.Caso você esteja usando um arquivohbm.xml, você deve estar ciente que o JBoss EAP 6 usa oorg.hibernate.cfg.EJB3NamingStrategynoAnnotationConfigurationao invés doorg.hibernate.cfg.DefaultNamingStrategyque 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 oorg.hibernate.cfg.DefaultNamingStrategyde legacia chamando oConfiguration#setNamingStrategye passando-o aoorg.hibernate.cfg.DefaultNamingStrategy#INSTANCE.Modifique os namespaces para estarem de acordo com os novos arquivos Hibernate DTD.
Expand 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 Modifique as variáveis do ambiente
- Caso você esteja usando o Oracle e usando as propriedades
materialized_cloboumaterialized_blob, a variável de ambiente globalhibernate.jdbc.use_streams_for_binarydeve ser configurada para verdadeiro. - Caso você esteja usando o PostgreSQL e usando as propriedades
CLOBouBLOB, ohibernate.jdbc.use_streams_for_binaryda 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 Copiar o linkLink copiado para a área de transferência!
javax.ejb.EJBTransactionRolledbackException: JBAS010361: Failed to deserialize .... Caused by: java.io.InvalidObjectException: could not resolve session factory during session deserialization [uuid=8aa29e74373ce3a301373ce3a44b0000, name=null]
javax.ejb.EJBTransactionRolledbackException: JBAS010361: Failed to deserialize
....
Caused by: java.io.InvalidObjectException: could not resolve session factory during session deserialization [uuid=8aa29e74373ce3a301373ce3a44b0000, name=null]
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
- Determine o valor
hibernate.session_factory_namea um nome único. Este nome deve ser único por todas as implantações de aplicativo na instância do JBoss EAP 6. Por exemplo:<property name="hibernate.session_factory_name" value="jboss-seam-booking.ear_session_factory"/>
<property name="hibernate.session_factory_name" value="jboss-seam-booking.ear_session_factory"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Determine p valor
hibernate.ejb.entitymanager_factory_namea um nome único. Este nome deve ser único para todas as implantações do aplicativo na instância do JBoss EAP 6.<property name="hibernate.ejb.entitymanager_factory_name" value="seam-booking.ear_PersistenceUnitName"/>
<property name="hibernate.ejb.entitymanager_factory_name" value="seam-booking.ear_PersistenceUnitName"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.2.2.9. Atualização de seu Aplicativo para ficar de acordo com a Especificação JPA 2.0 Copiar o linkLink copiado para a área de transferência!
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 EAP 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ê poderá precisar alterar no seu aplicativo.
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
Bean1iniciar uma transação JTA e realizar a invocação do métodoBean2com a transação JTA ativa, o comportamento no JBoss EAP 6 é o mesmo que dos lançamentos anteriores e nenhuma alteração será necessária. - Caso o
Bean1não inciar uma transação JTA e realizar a invocação do métodoBean2, o JBoss EAP 6 não propaga o contexto de persistência estendida aoBean2. Esse comportamento é diferente ao dos lançamentos anteriores que propagavam o contexto de persistência estendido aoBean2. 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 Copiar o linkLink copiado para a área de transferência!
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.
persistence.xml no JBoss EAP 5.x.
Procedimento 3.17. Modificação do arquivo persistence.xml para uso Infinispan
Configuração Infinispan para o aplicativo JPA no JBoss EAP 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 EAP 6:Além disso, você precisa especificar um<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow shared-cache-modecom um valor deENABLE_SELECTIVEouALLconforme 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>
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>Copy to Clipboard Copied! Toggle word wrap Toggle overflow ALLsignifica que as entidades sempre possuem cache mesmo que você as marque sem cache.<shared-cache-mode>ALL</shared-cache-mode>
<shared-cache-mode>ALL</shared-cache-mode>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Configure o Infinispan para o aplicativo Hibernate native no JBoss EAP 6
Isto é como você pode especificar a mesma configuração para o aplicativo Hibernate native usando o Infinispan com o JBoss EAP 6:Você deve adicionar o seguinte ao arquivoCopy to Clipboard Copied! Toggle word wrap Toggle overflow MANIFEST.MF:Manifest-Version: 1.0 Dependencies: org.infinispan, org.hibernate
Manifest-Version: 1.0 Dependencies: org.infinispan, org.hibernateCopy to Clipboard Copied! Toggle word wrap Toggle overflow
3.2.2.11. Propriedades do Cache Hibernate Copiar o linkLink copiado para a área de transferência!
| 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 Copiar o linkLink copiado para a área de transferência!
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
Acesso ao ValidatorFactory default
O JBoss EAP 6 bind (associa) o ValidatorFactory default ao contexto JNDI sob o nomejava:comp/ValidatorFactory.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 habilitado pelo Hibernate Core.- A validação ocorre nas operações
INSERT,UPDATEeDELETEde entidade. - Você pode configurar os grupos a serem validados pelo tipo de evento usando as seguintes propriedades:Os valores dessas propriedades são de vírgula separada, nomes de classe inteiramente qualificada dos grupos a serem validados.
javax.persistence.validation.group.pre-persist,javax.persistence.validation.group.pre-update, andjavax.persistence.validation.group.pre-remove.
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. - Caso você desativar o ciclo de vida baseado na validação pela configuração da propriedade
javax.persistence.validation.modeparanone. Outros valores válidos para esta propriedade sãoauto(o default),callbackeddl.
Configuração de seu aplicativo para uso da validação
- Caso você deseje manualmente controlar a validação, você pode criar um Validador em algumas das seguintes maneiras:
- Crie uma instância
Validatora partir doValidatorFactoryusando o métodogetValidator(). - Injete as Instâncias do Validador em seu EJB. O bean CDI ou qualquer outro recurso injetável do Java EE.
- Você pode usar o
ValidatorContextretornado peloValidatorFactory.usingContext()para personalizar sua instância do Validador. Você pode configurar umMessageInterpolator,TraverableResolvereConstraintValidatorFactorypersonalizado usando o API. Essas interfaces são específicas na especificação do Bean Validation e são novas ao Hibernate Validator 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.- Você deve usar as restrições nos seguintes pacotes para atualização ao Validador Hibernate 4:
javax.validation.constraintsorg.hibernate.validator.constraints
- 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.
Uso de restrição personalizada
No Hibernate Validator 3, é necessária uma restrição personalizada para implantar a interfaceorg.hibernate.validator.Validator. No Hibernate Validator 4, você precisa implantar a interfacejavax.validation.ConstraintValidator. Essa interface contém os mesmos métodosinitialize()eisValid()da interface anterior, no entanto, o método de assinatura foi alterado. Além disso, a alteraçãoDDLnão é mais suportada no Hibernate Validator 4.
3.2.3. Alterações do JSF Copiar o linkLink copiado para a área de transferência!
3.2.3.1. Habilitação de Aplicativos para Uso de Versões Antigas do JSF Copiar o linkLink copiado para a área de transferência!
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 EAP 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.
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.
3.2.4. Alterações dos Serviços da Web Copiar o linkLink copiado para a área de transferência!
3.2.4.1. Alterações dos Serviços da Web Copiar o linkLink copiado para a área de transferência!
- Alterações do Projeto JBossWS API
- Os componentes SPI e Comuns foram refabricados no JBossWS 4. A seguinte tabela lista o API e as alterações de empacotamento que podem afetar a sua migração do aplicativo.
Expand Tabela 3.7. Tamanho das Propriedades do Manuseador do Log JAR antigo Pacote antigo Novo JAR Novo pacote JBossWS SPI org.jboss.wsf.spi.annotation.* JBossWS API org.jboss.ws.api.annotation.* JBossWS SPI org.jboss.wsf.spi.binding.* JBossWS API org.jboss.ws.api.binding.* JBossWS SPI org.jboss.wsf.spi.management.recording.* JBossWS API org.jboss.ws.api.monitoring.* JBossWS SPI org.jboss.wsf.spi.tools.* JBossWS API org.jboss.ws.api.tools.* JBossWS SPI org.jboss.wsf.spi.tools.ant.* JBossWS API org.jboss.ws.tools.ant.* JBossWS SPI org.jboss.wsf.spi.tools.cmd.* JBossWS API org.jboss.ws.tools.cmd.* JBossWS SPI org.jboss.wsf.spi.util.ServiceLoader JBossWS API org.jboss.ws.api.util.ServiceLoader JBossWS Common org.jboss.wsf.common.* JBossWS API org.jboss.ws.common.* JBossWS Common org.jboss.wsf.common.handler.* JBossWS API org.jboss.ws.api.handler.* JBossWS Common org.jboss.wsf.common.addressing.* JBossWS API org.jboss.ws.api.addressing.* JBossWS Common org.jboss.wsf.common.DOMUtils JBossWS API org.jboss.ws.api.util.DOMUtils JBossWS Native org.jboss.ws.annotation.EndpointConfig JBossWS API org.jboss.ws.api.annotation.EndpointConfig - @WebContext Annotation
- No JBossWS 3.4.x, esta anotação foi empacotada como
org.jboss.wsf.spi.annotation.WebContextno projeto JBossWS SPI. No JBossWS 4.0, esta anotação foi movida aoorg.jboss.ws.api.annotation.WebContextno projeto do JBossWS API. Caso o seu aplicativo incluir uma dependência, você deve substituir as importações e dependências no código de fonte do aplicativos e compilá-lo em referência ao novo JBossWS API JAR.Existe também uma mudança num atributo que não é compatível com versões anteriores. O atributoString[] virtualHostsfoi alterado paraString virtualHosts. No JBoss EAP 6, você pode especificar apenas um host virtual por implantação. Caso diversos serviços da web usarem a anotação@WebContext, o valor do virtualHost deve ser idêntico a todos os pontos de extremidade definidos no arquivo de implantação. - Configuração do Ponto de Extremidade
- O JBossWS 4.0 fornece integração da pilha dos JBoss Web Services com a maioria dos módulos do projeto Apache CXF. A camada de integração permite o uso de webservices APIs padrões, incluindo o JAX-WS. Isto permite também o uso dos recursos avançados do Apache CX na parte superior do contêiner do JBoss EAP 6 sem requerer montagem ou configuração complexa.O subsistema
webservicena configuração domain do JBoss EAP 6 inclui configurações do ponto de extremidade pré-definidos. Você pode definir também suas próprias configurações do ponto de extremidade adicional. A anotação@org.jboss.ws.api.annotation.EndpointConfigé usada para referenciar uma configuração do ponto de extremidade gerado.Refira-se ao capítulo Serviços JAX-WS Web no Guia de Desenvolvimento para o JBoss EAP 6 no https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/ para maiores informações sobre este respeito. - jboss-webservices.xml Deployment Descriptor
- O JBossWS 4.0 introduz um novo descritor de implantação para configurar os serviços da web. O arquivo
jboss-webservices.xmlfornece informação adicional para a implantação gerada e substitui parcialmente o arquivojboss.xmlobsoleto.Para as implantações do EJB webservice, o local esperado para o arquivo do descritorjboss-webservices.xmlestá no diretórioMETA-INF/. Para os pontos de extremidade do POJO e EJB webservice empacotados no arquivo WAR, o local esperado do arquivojboss-webservices.xmlestá no diretórioWEB-INF/.Segue abaixo uma amostra do arquivo do descritorjboss-webservices.xmle uma tabela descrevendo os elementos.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expand Tabela 3.8. jboss-webservice.xml File Element Description Nome do Elemento Descrição context-rootUsado para personalizar a raiz do contexto da implantação dos webservices.config-nameconfig-fileUsado para associar uma implantação do ponto de extremidade com uma configuração do ponto de extremidade gerado. As configurações do ponto de extremidade são especificadas no arquivo de configuração referenciados ou num subsistemawebservicesda configuração do domain.propriedadeUsado para configurar os pares do valor do nome de propriedade simples para configurar o comportamento da pilha webservice.port-componentUsado para personalizar o URI de destinação do ponto de extremidade ou para configurar as propriedades relacionadas com a segurança.webservice-descriptionUsado para personalizar ou substituir o local publicado do webservice WSDL.
3.2.5. Alterações JAX-RS e RESTEasy Copiar o linkLink copiado para a área de transferência!
3.2.5.1. Configuração das Alterações JAX-RS e RESTEasy Copiar o linkLink copiado para a área de transferência!
web.xml e substituí-la por uma das três opções abaixo:
- Sub-classifique o
javax.ws.rs.core.Applicatione use a anotação@ApplicationPath.Esta é a opção mais fácil e não requer qualquer configuração xml. Apenas sub-classifique ojavax.ws.rs.core.Applicationem 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 { }@ApplicationPath("/mypath") public class MyApplication extends Application { }Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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/mypathe não/mypath/*. Não deve ter nenhum asterísco ou barra. - Sub-classifique
javax.ws.rs.core.Applicatione use o arquivoweb.xmlpara configurar o mapeamento JAX-RS.Caso você não deseje usar a anotação@ApplicationPath, você terá que sub-classificar da mesma forma ojavax.ws.rs.core.Application. Você então irá configurar o mapeamento JAX-RS no arquivoweb.xml. Por exemplo:public class MyApplication extends Application { }public class MyApplication extends Application { }Copy to Clipboard Copied! Toggle word wrap Toggle overflow <servlet-mapping> <servlet-name>com.acme.MyApplication</servlet-name> <url-pattern>/hello/*</url-pattern> </servlet-mapping>
<servlet-mapping> <servlet-name>com.acme.MyApplication</servlet-name> <url-pattern>/hello/*</url-pattern> </servlet-mapping>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Na amostra acima, os seus recursos JAX-RS estão disponíveis no/MY_WEB_APP_CONTEXT/hellodo caminho.Nota
Você pode usar também esta abordagem para substituir um caminho de aplicativo que foi configurado usando a anotação@ApplicationPath. - Modificação do arquivo
web.xml.Caso você deseje sub-classificar oApplication, você pode configurar o mapeamento JAX-RS no arquivoweb.xml, conforme abaixo:<servlet-mapping> <servlet-name>javax.ws.rs.core.Application</servlet-name> <url-pattern>/hello/*</url-pattern> </servlet-mapping>
<servlet-mapping> <servlet-name>javax.ws.rs.core.Application</servlet-name> <url-pattern>/hello/*</url-pattern> </servlet-mapping>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Na amostra acima, os seus recursos JAX-RS estão disponíveis no/MY_WEB_APP_CONTEXT/hellodo 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.6. Alterações do Realm de Segurança LDAP Copiar o linkLink copiado para a área de transferência!
3.2.6.1. Configuração das Alterações LDAP Security Realm Copiar o linkLink copiado para a área de transferência!
<application-policy> no arquivo login-config.xml. No JBoss EAP 6, o LDAP security realm é configurado no elemento <security-domain> no 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 managed domain, este é o arquivo domain/configuration/domain.xml.
login-config.xml do JBoss EAP 5:
Nota
<module-option name="java.naming.factory.initial">com.sun.jndi.ldap.LdapCtxFactory</module-option>
<module-option name="java.naming.factory.initial">com.sun.jndi.ldap.LdapCtxFactory</module-option>
<module-option name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory"/>
<module-option name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory"/>
3.2.7. Alterações do HornetQ Copiar o linkLink copiado para a área de transferência!
3.2.7.1. HornetQ e NFS Copiar o linkLink copiado para a área de transferência!
- O cache do cliente NFS do Red Hat Enterprise Linux deve ser desabilitado.
Importante
Importante
libaio seja instalado no sistema do Red Hat Enterprise Linux onde o JBoss EAP 6 está sendo executado.
3.2.7.2. Configuração do JMS Bridge para Migração de JMS Messages Existentes ao JBoss EAP 6 Copiar o linkLink copiado para a área de transferência!
Procedimento 3.19. Configure o JMS Bridge implantado a Servidor JBoss EAP 5.x
- Crie um subdiretório no diretório de implantação do JBoss EAP 5 para conter o SAR, por exemplo:
EAP5_HOME/server/PROFILE_NAME/deploy/myBridge.sar - Crie um subdiretório nomeado
META-INFnoEAP5_HOME/server/PROFILE_NAME/deploy/myBridge.sar/. - Crie um arquivo
jboss-service.xmlque contém informação similar ao seguinte no diretórioEAP5_HOME/server/PROFILE_NAME/deploy/myBridge.sar/META-INF/.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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 EAP 6 possuir segurança por default. O usuário nomeado "jbossuser" com senha "jbosspass" foi criado noApplicationRealmcom a funçãoguestusando o scriptEAP_HOME/bin/add_user.sh. - Copie os seguintes JARs a partir do diretório
EAP_HOME/modules/system/layers/base/no diretórioEAP5_HOME/server/PROFILE_NAME/deploy/myBridge.sar/. Substitua cada VERSION_NUMBER pelo número de versão em sua distribuição do JBoss EAP 6.org/hornetq/main/hornetq-core-VERSION_NUMBER.jarorg/hornetq/main/hornetq-jms-VERSION_NUMBER.jarorg/jboss/ejb-client/main/jboss-ejb-client-VERSION_NUMBER.jarorg/jboss/logging/main/jboss-logging-VERSION_NUMBER.jarorg/jboss/logmanager/main/jboss-logmanager-VERSION_NUMBER.jarorg/jboss/marshalling/main/jboss-marshalling-VERSION_NUMBER.jarorg/jboss/marshalling/river/main/jboss-marshalling-river-VERSION_NUMBER.jarorg/jboss/remote-naming/main/jboss-remote-naming-VERSION_NUMBER.jarorg/jboss/remoting3/main/jboss-remoting-VERSION_NUMBER.jarorg/jboss/sasl/main/jboss-sasl-VERSION_NUMBER.jarorg/jboss/netty/main/netty-VERSION_NUMBER.jarorg/jboss/remoting3/remote-jmx/main/remoting-jmx-VERSION_NUMBER.jarorg/jboss/xnio/main/xnio-api-VERSION_NUMBER.jarorg/jboss/xnio/nio/main.xnio-nio-VERSION_NUMBER.jar
Nota
Não copie simplesmente oEAP_HOME/bin/client/jboss-client.jaruma vez que as classes javax API classes entrarão em conflito com aquelas do JBoss EAP 5.x.
Procedimento 3.20. Configure o JMS Bridge implantado a Servidor JBoss EAP 6.x
- Criação do módulo do JBoss para o provedor de mensagem.
- Crie uma estrutura de diretório sob o
EAP_HOME/modules/system/layers/base/para o novo módulo. Osubdiretóriomain/conterá o cliente JARs e o arquivomodule.xml. Segue abaixo uma amostra da estrutura do diretório criada para o provedor de mensagem MyCustomMQ:EAP_HOME/modules/system/layers/base/org/mycustommq/main/ - No subdiretório
main/, crie um arquivomodule.xmlcontendo a definição do módulo para o provedor de mensagem. Segue abaixo uma amostra domodule.xmlcriado para o provedor de mensagem MyCustomMQ.Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Copie os JARs do provedor de mensagem requeridos pela pesquisa JNDI dos recursos de fonte ao subdiretório
main/. A estrutura do diretório para o módulo MyCustomMQ deve parecer-se agora com o seguinte:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- Configure o JMS bridge no subsistema
messagingdo servidor do JBoss EAP 6.- Antes de começar, interrompa o servidor e realize o backup dos arquivos de configuração do servidor atual. Caso você esteja executando o servidor autônomo, este é o arquivo
EAP_HOME/standalone/configuration/standalone-full-ha.xml. Caso você esteja executando o managed domain, realize o backup em ambos os arquivosEAP_HOME/domain/configuration/domain.xmleEAP_HOME/domain/configuration/host.xml. - Adicione o elemento
<jms-bridge>ao subsistemamessagingno arquivo de configuração do servidor. Os elementos<source>e<target>fornecem os nomes dos recursos JMS usados para as pesquisas JNDI. Caso os credenciais<user>e<password>forem especificados, eles serão passados como argumentos quando a conexão for criada.Segue abaixo uma amostra do elemento<jms-bridge>configurado para o provedor de mensagem MyCustomMQ:Na amostra acima, as propriedades JNDI são definidas no elementoCopy to Clipboard Copied! Toggle word wrap Toggle overflow <context>para o<source>. Caso o elemento<context>for omitido, assim como na amostra<target>acima, os recursos JMS são pesquisados na instância local.
3.2.7.3. Migração de seu Aplicativo para uso do HornetQ como um Provedor JMS Copiar o linkLink copiado para a área de transferência!
Procedimento 3.21. Antes de começar
- Encerre o cliente e o servidor
- 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.22. Altere seu provedor para o HornetQ
Transfira configurações
A transferência das configurações do JBoss Messaging à configuração do JBoss EAP 6. 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õesEsta 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çãoEsta 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.xmlque está localizado no diretório de implantação no servidor do aplicativo. - Configuração do Serviço Bridge de MensagemEsta 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.
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.7.4, “Configuração de Mensagens com HornetQ”.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 do bridge JMS podem ser encontrados na: Seção 3.2.7.2, “Configuração do JMS Bridge para Migração de JMS Messages Existentes ao JBoss EAP 6”.
3.2.7.4. Configuração de Mensagens com HornetQ Copiar o linkLink copiado para a área de transferência!
standalone.xml ou domain.xml. Isto é útil, no entanto recomendamos familiarizar-se com os componentes de mensagem dos arquivos de configuração default, sendo que as amostras da documentação usando as ferramentas de gerenciamento fornecem snippets do arquivo de configuração para referência.
3.2.8. Alterações de Clustering Copiar o linkLink copiado para a área de transferência!
3.2.8.1. Realize Alterações ao seu Aplicativo para o Clustering Copiar o linkLink copiado para a área de transferência!
Procedimento 3.23.
Inicie o JBoss EAP 6 com o clustering habilitado
Para habilitar o clustering no JBoss EAP 5.x, você precisava iniciar suas instâncias do servidor usando o perfilallou alguma derivação do mesmo, como por exemplo:$ EAP5_HOME/bin/run.sh -c allNo JBoss EAP 6, o método para a habilitação do clustering depende dos servidores serem autônomos ou serem executados num managed domain.Habilitação do cluster para servidores executando num managed domain
Para habilitar o clustering para servidores iniciados usando o domain controller, atualize o seudomain.xmle determine um grupo de servidor para uso do seu perfilhae grupo binding de soqueteha-sockets. Por exemplo:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Habilitação do cluster para servidores autônomos
Para habilitar 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
Especificação do endereço bind
No JBoss EAP 5.x, você indicaria normalmente o endereço bind, usado para o clustering, usando o argumento da linha de comando-bconforme o seguinte:$ EAP_HOME/bin/run.sh -c all -b 192.168.0.2No JBoss EAP 6, os endereços bind são claramente definidos pelos socket bindings relevantes com os arquivos da configuração do JBoss EAP 6. Para os servidores iniciados usando o domain controller, os endereços bind são especificados com o arquivodomain/configuration/host.xml. Para os servidores autônomos, os endereços bind são especificados com o arquivostandalone-ha.xml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow A interfaceCopy to Clipboard Copied! Toggle word wrap Toggle overflow publicé especificada na amostra acima como interface default para todos os sockets com o grupo socket bindingha-sockets.Configure o
jvmRoutepara suportar o mod_jk e mod_proxyNo JBoss EAP 5, o servidor da webjvmRoutefoi configurado usando a propriedade no arquivoserver.xml. No JBoss EAP 6, o atributojvmRouteé configurado no subsistema da web do arquivo de combinação do servidor usando o atributoinstance-idconforme o seguinte:O {JVM_ROUTE_SERVER} acima deve ser substituído pela ID do servidor jvmRoute.<subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host" native="false" instance-id="{JVM_ROUTE_SERVER}"><subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host" native="false" instance-id="{JVM_ROUTE_SERVER}">Copy to Clipboard Copied! Toggle word wrap Toggle overflow Oinstance-idpode ser determinado usando o Management Console.Especificação do endereço multicast e porta
No JBoss EAP 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-ue-m, respectivamente, como por exemplo:$ EAP_HOME/bin/run.sh -c all -u 228.11.11.11 -m 45688No JBoss EAP 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:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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ê iniciar o servidor. A seguinte amostra,Copy to Clipboard Copied! Toggle word wrap Toggle overflow jboss.mcast.addré o nome da variável para o endereço multicast e ojboss.mcast.porté o nome da variável para a porta.Você pode iniciar o seu servidor usando os argumentos da linha de comando:<socket-binding name="jgroups-udp" port="55200" multicast-address="${jboss.mcast.addr:230.0.0.4}" multicast-port="${jboss.mcast.port:45688}"/><socket-binding name="jgroups-udp" port="55200" multicast-address="${jboss.mcast.addr:230.0.0.4}" multicast-port="${jboss.mcast.port:45688}"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow $ EAP_HOME/bin/domain.sh -Djboss.mcast.addr=228.11.11.11 -Djboss.mcast.port=45688Uso da pilha de protocolo alternativo
No JBoss EAP 5.x, você pode manipular a pilha de protocolo default para todos os serviços de clustering usando a propriedade de sistemajboss.default.jgroups.stack.$ EAP_HOME/bin/run.sh -c all -Djboss.default.jgroups.stack=tcpNo JBoss EAP 6, a pilha do protocolo default é definida pelo subsistema JGroups com odomain.xmloustandalone-ha.xml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Substituição da Replicação Buddy
O JBoss EAP 5.x usou o JBoss Cache Buddy Replication para suprimir a replicação dos dados para todas as instâncias num cluster. É solicitado que você passe o argumento-Djboss.cluster.buddyReplna linha de comando quando você inicia o servidor do JBoss.No JBoss EAP 6, a Replicação Buddy foi substituída pelo cache distribuído bastante superior do Infinispan ou modo DIST. A distribuição é um modo do clustering potente que permite o Infinispan a escalar de forma linear à medida que mais servidores são adicionados ao cluster. Segue abaixo uma amostra de como configurar o servidor para uso do modo de cache DIST.- Abra a linha de comando e inicie o servidor com tanto o Perfil Completo ou HA. Por exemplo:
EAP_HOME/bin/standalone.sh -c standalone-ha.xml
EAP_HOME/bin/standalone.sh -c standalone-ha.xmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Abra outra linha de comando e conecte-se ao Management CLI.
- Insira a seguinte linha de comando para o Linux:
EAP_HOME/bin/jboss-cli.sh --connect
$ EAP_HOME/bin/jboss-cli.sh --connectCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Insira a seguinte linha de comando para o Windows:
C:\>EAP_HOME\bin\jboss-cli.bat --connect
C:\>EAP_HOME\bin\jboss-cli.bat --connectCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Você deve ver a seguinte resposta:Conectado ao controlador autônomo no localhost:9999
Conectado ao controlador autônomo no localhost:9999Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Imprima os seguintes comandos:
/subsystem=infinispan/cache-container=web/:write-attribute(name=default-cache,value=dist) /subsystem=infinispan/cache-container=web/distributed-cache=dist/:write-attribute(name=owners,value=3) :reload
/subsystem=infinispan/cache-container=web/:write-attribute(name=default-cache,value=dist) /subsystem=infinispan/cache-container=web/distributed-cache=dist/:write-attribute(name=owners,value=3) :reloadCopy to Clipboard Copied! Toggle word wrap Toggle overflow Você deverá ver a seguinte resposta após cada comando:"outcome" => "success"
"outcome" => "success"Copy to Clipboard Copied! Toggle word wrap Toggle overflow Esses comandos criam a seguinte configuração no subsistemainfinispando arquivostandalone-ha.xml:Refira-se ao capítulo Clustering nos Aplicativos da Web no Guia de Desenvolvimento do JBoss EAP 6 localizado no Portal do Cliente https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/ para maiores informações sobre este respeito.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.2.8.2. Implantação de um HA Singleton Copiar o linkLink copiado para a área de transferência!
No JBoss EAP 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 arquivos 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.
Procedimento 3.24. Implantação do Serviço HA Singleton
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.Crie um serviço singleton.
A seguinte listagem é uma amostra do serviço singleton:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Crie uma interface de lógica comercial para o SingletonService.
A seguinte amostra é uma interface lógica comercial para o SingletonService:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Inicie cada instância do JBoss EAP 6 com o clustering habilitado.
O método de habilitação com cluster depende se os servidores forem autônomos ou executando num managed domain.Habilite o clustering para servidores executando num managed 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.
Inicie o seu domain controller.
Abra a janela de comando para o seu sistema operacional.
Conecte ao Management CLI passando o endereço IP do domain controller ou nome DNS.
Nesta amostra, assuma que o endereço IP do domain controller é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
$ EAP_HOME/bin/jboss-cli.sh --connect --controller=192.168.0.14Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Insira a seguinte linha de comando para o Windows:
C:\>EAP_HOME\bin\jboss-cli.bat --connect --controller=192.168.0.14
C:\>EAP_HOME\bin\jboss-cli.bat --connect --controller=192.168.0.14Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Você deverá observar a seguinte resposta:Conectado ao domain controller no 192.168.0.14
Conectado ao domain controller no 192.168.0.14Copy to Clipboard Copied! Toggle word wrap Toggle overflow Adicione o grupo de servidor
main-server.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Crie um servidor nomeado
server-onee adicione-o ao grupo do servidormain-server.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Configure o JVM para o grupo do servidor
main-server.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Crie um servidor nomeado
server-two, coloque-o num grupo de servidor separado e configure a porta de deslocamento para 100.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Habilite o clustering editando manualmente os arquivos de configuração do servidor.
Interrompa o servidor do JBoss EAP 6.
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.Abra o arquivo de configuração
domain.xmlpara ediçãoDetermine um grupo de servidor para uso do seu perfilhae grupo socket bindingha-socketsconforme abaixo:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Abra o arquivo de configuração
host.xmlpara ediçãoModifique o arquivo conforme o seguinte:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Inicie o servidor.
- Digite
EAP_HOME/bin/domain.shpara o Linux - Digite
EAP_HOME\bin\domain.batpara o Microsoft Windows
Habilitação do cluster para servidores autônomos
Para habilitar o cluster para servidores autônomos, inicie o servidor usando o nome do nó e o arquivo da configuraçãostandalone-ha.xmlconforme abaixo:- Digite
EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=UNIQUE_NODE_NAMEpara o Linux - Digite
EAP_HOME\bin\standalone.bat --server-config=standalone-ha.xml -Djboss.node.name=UNIQUE_NODE_NAMEpara o Microsoft Windows
Nota
Configure o arquivostandalone-ha.xmlpara 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.Implantação do aplicativo aos servidores
Caso você use o Maven para implantar seu aplicativo, use o seguinte comando Maven para implantar o servidor executando nas portas default:mvn clean install jboss-as:deployPara 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.9. Alterações do Desenvolvimento do estilo de Serviço Copiar o linkLink copiado para a área de transferência!
3.2.9.1. Atualização dos Aplicativos que usam as Implantações de estilo de Serviço Copiar o linkLink copiado para a área de transferência!
Embora o JBoss EAP 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 EAP 5.x, eles devem ser executados com pouca ou sem nenhuma modificação no JBoss EAP 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 managed domain, a pasta de implantações encontra-se localizada no EAP_HOME/domain/deployments/.
3.2.10. Alterações da Invocação Remota Copiar o linkLink copiado para a área de transferência!
3.2.10.1. Migração dos Aplicativos Implantados do JBoss EAP 5 que realiza Invocações Remotas ao JBoss EAP 6 Copiar o linkLink copiado para a área de transferência!
Existem duas maneiras de tornar as invocações remotas ao servidor no JBoss EAP 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.
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>
ejb:<app-name>/<module-name>/<distinct-name>/<bean-name>!<fully-qualified-classname-of-the-remote-interface>
ejb:<app-name>/<module-name>/<distinct-name>/<bean-name>!<fully-qualified-classname-of-the-remote-interface>?stateful
ejb:<app-name>/<module-name>/<distinct-name>/<bean-name>!<fully-qualified-classname-of-the-remote-interface>?stateful
<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.
Assuma que você implantou o seguinte EJB stateless a um servidor do JBoss EAP 6. Perceba que isto o expõe a uma visualização remota para o bean.
final RemoteCalculator statefulRemoteCalculator = (RemoteCalculator) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName + "?stateful")
final RemoteCalculator statefulRemoteCalculator = (RemoteCalculator) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName + "?stateful")
3.2.10.2. Invocação do Bean de Sessão Remota usando o JNDI Copiar o linkLink copiado para a área de transferência!
ejb-remote quickstart 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.
Pré-requisitos
- Você deve possuir um projeto Maven criado e pronto para uso.
- A configuração para o repositório Maven do JBoss EAP 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-filecomo 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.
Procedimento 3.25. Adição da Configuração do Projeto Maven para a Invocação Remota dos Beans de Sessão
Adicione as dependências do projeto solicitadas
Opom.xmlpara o projeto deve ser atualizado para incluir as dependências necessárias.Adicione o arquivo
jboss-ejb-client.propertiesO API do cliente JBoss EJB espera encontrar um arquivo na raiz do projeto nomeadojboss-ejb-client.propertiesque contém a informação da conexão para o serviço JNDI. Adicione este arquivo ao diretóriosrc/main/resources/de seu projeto com o seguinte conteúdo.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Altere o portal e o nome do host para coincidir com o seu servidor. O4447é o número de porta default. Configure a linhaSSL_ENABLEDparatruee descomente a linhaSSL_STARTTLS. A interface remota no contêiner suporta as conexões com e sem segurança usando a mesma porta.Adicione dependências para as interfaces comerciais
Adicione as dependências Maven aopom.xmlpara interfaces comerciais remotas dos beans de sessão.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Procedimento 3.26. Obtenção de um Proxy Bean usando o JNDI e Métodos de Invocação do Bean
Manuseio das exceções checadas
Os métodos usados no seguinte código (InitialContext()elookup()) possuem uma exceção de checagem do tipojavax.naming.NamingException. Essas chamadas de método devem tanto ser inseridas num bloco de tentativa/captura que captura oNamingExceptionou num método que é declarado ao lançar oNamingException. Oejb-remotequickstart usa a segunda técnica.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);
final Hashtable jndiProperties = new Hashtable(); jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); final Context context = new InitialContext(jndiProperties);Copy to Clipboard Copied! Toggle word wrap Toggle overflow As propriedades de conexão para o serviço JNDI são lidas a partir do arquivojboss-ejb-client.properties.Uso do método lookup() do Contextp JNDI para obter um proxy de bean
Invoque o métodolookup()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());final RemoteCalculator statelessRemoteCalculator = (RemoteCalculator) context.lookup( "ejb:/jboss-as-ejb-remote-server-side/CalculatorBean!" + RemoteCalculator.class.getName());Copy to Clipboard Copied! Toggle word wrap Toggle overflow Os nomes do JNDI do bean de sessão são definidos usando a síntese especial.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.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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.
3.2.11. Alterações EJB 2.x Copiar o linkLink copiado para a área de transferência!
3.2.11.1. Atualização dos Aplicativos que usam o EJB 2.x Copiar o linkLink copiado para a área de transferência!
Procedimento 3.27. Execute o EJB 2.x no JBoss EAP 6
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, “Amostra do JNDI Namespaces nos Lançamentos Anteriores e como são especificados no JBoss EAP 6”.Modificação do Descritor do Arquivo
jboss-web.xmlModifique o<jndi-name>para cada<ejb-ref>usar o novo formato de pesquisa inteiramente qualificado JNDI.Substitua o arquivo do descritor da implantação
jboss.xmlO descritor da implantaçãojboss-ejb3.xmlsubstitui o descritor da implantaçãojboss.xmlpara substituição e adição à recursos fornecidos pelo Java Enterprise Edition (EE - Edição do Java Enterprise) definidos no descritor da implantaçãoejb-jar.xml. O novo arquivo é incompatível com ojboss.xmle ojboss.xmlé agora ignorado nas implantações.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 EAP 6 com o perfil completo.O clustering não é mais suportado
O clustering dos beans de entidade EJB 2.x não é mais suportado no JBoss EAP 6.
3.2.12. Alterações do JBoss AOP Copiar o linkLink copiado para a área de transferência!
3.2.12.1. Atualização dos Aplicativos que usam o JBoss AOP Copiar o linkLink copiado para a área de transferência!
- As configurações EJB3 padrões que eram realizadas anteriormente no arquivo
ejb3-interceptors-aop.xmlsão agora configuradas no arquivo de configuração. Isto é um arquivostandalone/configuration/standalone-full.xmlpara o servidor autônomo. Caso você esteja executando o seu servidor num managed domain, este é o arquivodomain/configuration/domain.xml. - Os Interceptores AOP ao lado do servidor devem modificar o uso do Java EE
Interceptordefault. Refira-se ao capítulo Interceptores de Contêiner no Guia de Desenvolvimento do JBoss EAP 6 localizado no Portal do Cliente https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/, para maiores informações sobre os interceptores do contêiner e como usar o interceptor ao lado do cliente.
- Caso você não esteja apto a refatorar o código, você pode obter uma cópia das bibliotecas do JBoss AOP e empacotá-las com o aplicativo. As bibliotecas AOP podem funcionar no JBoss EAP 6, mas não são implantadas. Você pode manualmente implantá-las usando o seguinte argumento da linha de comando, quando você inicia o seu servidor:
Djboss.aop.path=PATH_TO_AOP_CONFIGNota
Embora as bibliotecas do JBoss AOP possam funcionar no JBoss EAP 6, isto não é uma configuração suportada.
3.2.13. Aplicativos Seam 2.2 de Migração Copiar o linkLink copiado para a área de transferência!
3.2.13.1. Migração dos Arquivos Seam 2.2 para o JBoss EAP 6 Copiar o linkLink copiado para a área de transferência!
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 EAP 6 e copiar quaisquer JARs dependentes no diretório lib/ do aplicativo.
Importante
Procedimento 3.28. Migração dos Arquivos Seam 2.2
Atualização da configuração da fonte de dados
Algumas das amostras Seam 2.2 usam a fonte de dados JDBC default nomeadajava:/ExampleDS. A fonte de dados default foi alterada no JBoss EAP 6 parajava:jboss/datasources/ExampleDS. Caso seu aplicativo usar a fonte de dados da amostra, você pode realizar o seguinte: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”.- Caso você deseje usar um banco de dados de amostra que lança o JBoss EAP 6, modifique o arquivo
META-INF/persistence.xmlpara substituir o elementojta-data-sourceexistente 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>
<!-- <jta-data-source>java:/ExampleDS</jta-data-source> --> <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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 que sua alteração seja persistida na iniciação do servidor.A seguinte definição é uma cópia da fonte de dados HSQL definida no JBoss EAP 6:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Você pode também adicionar a definição da fonte de dados usando a interface da linha de comando do Management CLI. 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$ 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=saCopy to Clipboard Copied! Toggle word wrap Toggle overflow
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 arquivojboss-deployment-structure.xmlno diretórioMETA-INF/do EAR que contém os seguintes dados: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”.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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 oClassNotFoundExceptionsouClassCastExceptionsque 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
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 signatureCopy to Clipboard Copied! Toggle word wrap Toggle overflow 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/libe excluir o módulo Hibernate na seção de implantações doMETA-INF/jboss-deployment-structure.xml, conforme o seguinte:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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.Depuração e resolução dos erros Seam 2.2 JNDI
Quando você migrar o aplicativo Seam 2.2, você poderá ver errosjavax.naming.NameNotFoundExceptionno log conforme o seguinte:Caso você não deseje modificar as pesquisas JNDI através do código, você pode modificar o arquivojavax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''
javax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''Copy to Clipboard Copied! Toggle word wrap Toggle overflow components.xmldo aplicativo, conforme abaixo: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"/><!-- <core:init jndi-pattern="jboss-seam-booking/#{ejbName}/local" debug="true" distributable="false"/> --> <core:init debug="true" distributable="false"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Adição dos elementos do componente
Para cada mensagem INFO binding JNIDI, adicione um elementocomponentcorrespondente ao arquivocomponents.xml:<component class="org.jboss.seam.example.booking.AuthenticatorAction" jndi-name="java:app/jboss-seam-booking.jar/AuthenticatorAction" />
<component class="org.jboss.seam.example.booking.AuthenticatorAction" jndi-name="java:app/jboss-seam-booking.jar/AuthenticatorAction" />Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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.13.2, “Problemas de Migração do Seam 2.2 Archive”.
O arquivo Seam 2.2 implementa e é executado com êxito no JBoss EAP 6.
3.2.13.2. Problemas de Migração do Seam 2.2 Archive Copiar o linkLink copiado para a área de transferência!
- 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.jarnão permite o funcionamento da amostra Spring - Quando a amostra Spring estiver executando usando o
cglib.jarassinado que lançou o Seam 2.2.5 no JBoss EAP 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
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 packageCopy to Clipboard Copied! Toggle word wrap Toggle overflow A solução para este problema é sair docglib.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 EAP 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 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 EAP 5.1.2 e o RESTEasy 2.3.1.GA incluído no JBoss EAP 6.Para solucionar este problema use
jboss-deployment-structure.xmlpara 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 dojboss-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.SynchronizationInterceptore 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
ConcurrentAccessExceptionseja lançado imediatamente quando esta situação ocorrer. - A amostra Dvdstore cria falhas ordenadas com o
javax.ejb.EJBTransactionRolledbackException - A amostra do dvdstore exibe 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.
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.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Este problema é devido às alterações na especificação JPA.A solução para este problema é alterar o contexto de persistência para otransactionalnoCheckoutActione classesShowOrdersAction, além de usar a operação de mesclagem do gerenciador de entidade nos métodoscancelOrderedetailOrder. - O provedor do JBoss Cache Seam Cache não pode ser usado no JBoss EAP 6
- O JBoss Cache não é suportado no JBoss EAP 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
java.lang.NoClassDefFoundError: org/jboss/util/xml/JBossEntityResolverCopy to Clipboard Copied! Toggle word wrap Toggle overflow - O Hibernate 3.3.x Auto scan para o problema das entidades JPA com o JBoss EAP 6
- A correção para este problema é listar todas as classes no arquivo persistence.xml manualmente. Por exemplo:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - A chamdado aos componentes EJB Seam para não EJB Threads resulta num javax.naming.NameNotFoundException
- Este problema é o resultado de alterações no JBoss EAP 6 para implantar o novo sistema de carregamento de classe nova modular e para adotar as novas convenções do JNDI namespace padronizado. O
java:appnamespace é designado para os nomes compartilhados por todos os componentes num aplicativo único. Não EE threads, tais como os threads assíncrono Quartz, devem usar ojava:globalnamespace, que é compartilhado pelos aplicativos implantados na instância do servidor do aplicativo.Caso você receba umjavax.naming.NameNotFoundException, quando você tentar chamar os componentes do EJB Seam a partir dos métodos assíncrono Quartz, você deve modificar o arquivocomponents.xmlpara uso do nome JNDI global, por exemplo:<component class="org.jboss.seam.example.quartz.MyBean" jndi-name="java:global/seam-quartz/quartz-ejb/myBean"/>
<component class="org.jboss.seam.example.quartz.MyBean" jndi-name="java:global/seam-quartz/quartz-ejb/myBean"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Para maiores informações sobre as alterações do JNDI, refira-se à Seção 3.1.8.1, “Atualização dos Nomes JNDI Namespace do Aplicativo” . Para as maiores informações sobre este problema específico, refira-se ao BZ#948215 - Seam2.3 javax.naming.NameNotFoundException trying to call EJB Seam components from quartz asynchronous methods nas Notas de Lançamento 2.2.0 para o JBoss Web Framework Kit no Portal do Cliente no https://access.redhat.com/site/documentation/JBoss_Web_Framework_Kit/.
3.2.14. Aplicativos Spring de Migração Copiar o linkLink copiado para a área de transferência!
3.2.14.1. Aplicativos Spring de Migração Copiar o linkLink copiado para a área de transferência!
3.2.15. Outras Alterações que Afetam a Migração Copiar o linkLink copiado para a área de transferência!
3.2.15.1. Outras alterações que podem afetar sua Migração Copiar o linkLink copiado para a área de transferência!
3.2.15.2. Alteração do Nome Maven Plug-in Copiar o linkLink copiado para a área de transferência!
jboss-maven-plugin não foi atualizado e não funciona no JBoss EAP 6. Você deve usar o org.jboss.as.plugins:jboss-as-maven-plugin para implantar ao diretório correto.
3.2.15.3. Modificação dos Aplicativos do Cliente Copiar o linkLink copiado para a área de transferência!
jboss-client.jar e está localizado no diretório EAP_HOME/bin/client/. Isto substitui o EAP_HOME/client/jbossall-client.jar e contém todas as dependências requeridas ao conectar o JBoss EAP 6 a partir do cliente remoto.
Capítulo 4. Ferramentas e Dicas Copiar o linkLink copiado para a área de transferência!
4.1. Recursos para Assisti-lo com a Migração Copiar o linkLink copiado para a área de transferência!
4.1.1. Recursos que podem orientá-lo em sua Migração Copiar o linkLink copiado para a área de transferência!
- 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 orientá-lo na Migração” para maiores informações.
- Dicas de Depuração
- Para uma lista das causas e resoluções de problemas e erros que 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 EAP 6, consulte a Seção 4.3.1, “Revise a Migração dos Aplicativos de Amostra”.
4.1.2. Familiarize-se com as Ferramentas que podem orientá-lo na Migração Copiar o linkLink copiado para a área de transferência!
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 EAP 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 EAP 6.
4.1.3. Uso do Tattle para encontrar Dependências do Aplicativo Copiar o linkLink copiado para a área de transferência!
Devido às alterações de carregamento de classe no JBoss EAP 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.
jboss-deployment-structure.xml do aplicativo.
Procedimento 4.1. Instalação e execução do Tattletale para encontrar dependências do aplicativo
Nota
4.1.4. Download e Instalação do Tattletale Copiar o linkLink copiado para a área de transferência!
Procedimento 4.2.
- 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.
- Descomprima o arquivo ao diretório de sua escolha.
- Modifique o arquivo
TATTLETALE_HOME/jboss-tattletale.propertiesrealizando o seguinte:- Adicione o
ee6eas7à propriedadeprofiles.profiles=java5, java6, ee6, as7
profiles=java5, java6, ee6, as7Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Descomente as propriedades
scanereports.
Nota
4.1.5. Criação e Revisão do Relatório Tattletale Copiar o linkLink copiado para a área de transferência!
Procedimento 4.3.
- Crie um relatório Tattletale emitindo o comando:
java -jarTATTLETALE_HOME/tattletale.jarAPPLICATION_ARCHIVEOUTPUT_DIRECTORYPor exemplo:java -jar tattletale-1.2.0.Beta2/tattletale.jar applications/jboss-seam-booking.ear output-results/ - Num navegador, abra o arquivo
OUTPUT_DIRECTORY/index.htmle clique em "JBoss EAP 6" na seção "Reports".- 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.
- O link
jboss-deployment-structure.xmlna 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
4.1.6. Uso da Ferramenta IronJacamar para Migração da Fonte de Dados e Configurações do Adaptador de Recurso Copiar o linkLink copiado para a área de transferência!
Nas versões anteriores do servidor do aplicativo, as fontes de dados e adaptadores de recurso eram configuradas e implantadas 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 EAP 6. As ferramentas analisam o arquivo de configuração da fonte a partir do lançamento anterior, criam e gravam 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 EAP 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.
Procedimento 4.4. Instalação e execução da ferramenta de Migração IronJacamar
Nota
4.1.7. Download e Instalação da Ferramenta de Migração IronJacamar Copiar o linkLink copiado para a área de transferência!
Nota
Procedimento 4.5.
- Baixe o IronJacamar 1.1 ou distribuição ampla a partir do: http://www.jboss.org/ironjacamar/downloads/
- Descomprime o arquivo baixado num diretório de sua escolha.
- 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
4.1.8. Uso da Ferramenta de Migração IronJacamar para converter um Arquivo de Configuração da Fonte de Dados Copiar o linkLink copiado para a área de transferência!
Procedimento 4.6.
- Abra uma linha de comando e navegue ao diretório
IRONJACAMAR_HOME/docs/as/. - Execute o script conversor digitando o seguinte comando:
- No Linux:
./converter.sh -dsSOURCE_FILETARGET_FILE - No Microsoft Windows:
./converter.bat -dsSOURCE_FILETARGET_FILE
OSOURCE_FILEé o arquivo -ds.xml da fonte de dados do lançamento anterior. OTARGET_FILEcontém uma nova configuração.Por exemplo, para converter o arquivo de configuração da fonte de dadosjboss-seam-booking-ds.xmllocalizado no diretório atual, você digitaria:- No Linux:
./converter.sh -dsjboss-seam-booking-ds.xmlnew-datasource-config.xml - No Microsoft Windows:
./converter.bat -dsjboss-seam-booking-ds.xmlnew-datasource-config.xml
Perceba que o parâmetro para a conversão da fonte de dados é-ds. - 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.1"><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 iniciação do servidor.- Caso você esteja executando um managed domain, copie o XML ao 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.
- 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.xmlpara a amostra do Seam 2.2 Booking que foi lançado com o JBoss EAP 5.x:Segue abaixo o arquivo de configuração que foi gerado pela execução do script conversor. O arquivo gerado contém um elementoCopy to Clipboard Copied! Toggle word wrap Toggle overflow <driver-class>. A maneira preferida de definir a classe do driver no JBoss EAP 6 é usar um elemento<driver>. Segue abaixo o XML resultando no arquivo de configuração do JBoss EAP 6 com modificações para comentar o elemento<driver-class>e adicionar o elemento<driver>:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Nota
4.1.9. Uso da Ferramenta IronJacamar para Converter um Arquivo de Configuração do Adaptador de Recurso Copiar o linkLink copiado para a área de transferência!
Procedimento 4.7.
- Abra uma linha de comando e navegue ao diretório
IRONJACAMAR_HOME/docs/as/. - Execute o script conversor digitando o seguinte comando:
- No Linux:
./converter.sh -raSOURCE_FILETARGET_FILE - No Microsoft Windows:
./converter.bat -raSOURCE_FILETARGET_FILE
OSOURCE_FILEé um arquivo -ds.xml adaptador de recurso do lançamento anterior. OTARGET_FILEcontém uma nova configuração.Por exemplo, para converter o arquivo de configuração do adaptador de recursomttestadapter-ds.xmllocalizado no diretório atual, você digitaria:- No Linux:
./converter.sh -ramttestadapter-ds.xmlnew-adapter-config.xml - No Microsoft Windows:
./converter.bat -ramttestadapter-ds.xmlnew-adapter-config.xml
Perceba que o parâmetro para a conversão do adaptador de recurso é-ra. - 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.1">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.- Caso você esteja executando um managed 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.
- Modificação do XML gerado ao novo arquivo de configuração.Segue abaixo um exemplo do arquivo de configuração do adaptador de recurso
mttestadapter-ds.xmla partir do JBoss EAP 5.x TestSuite: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 EAP 6 com modificações ao valor do elementoCopy to Clipboard Copied! Toggle word wrap Toggle overflow <class-name>.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Nota
4.2. Problemas da Migração de Depuração Copiar o linkLink copiado para a área de transferência!
4.2.1. Depuração e Solução dos Problemas de Migração Copiar o linkLink copiado para a área de transferência!
4.2.2. Depuração e Solução do ClassNotFoundExceptions e NoClassDefFoundErrors Copiar o linkLink copiado para a área de transferência!
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.
- Tente primeiro a Seção 4.2.3, “Busque a Dependência de Módulo do JBoss”
- 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 Copiar o linkLink copiado para a área de transferência!
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.
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)
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)
Procedimento 4.9.
- Determine primeiramente se existe um módulo claro para a classe.
- Navegue ao diretório
EAP_HOME/modules/system/layers/base/e busque pelo caminho do módulo combinando a classe nomeada noClassNotFoundException.Você pode encontrar oorg/apache/commons/logging/de caminho modular. - Abra o arquivo
EAP_HOME/modules/system/layers/base/org/apache/commons/logging/main/module.xmle encontre o nome do módulo. Neste caso, isto é "org.apache.commons.logging". - Adicione o nome do módulo às Dependências no arquivo
MANIFEST.MF:Manifest-Version: 1.0 Dependencies: org.apache.commons.logging
Manifest-Version: 1.0 Dependencies: org.apache.commons.loggingCopy to Clipboard Copied! Toggle word wrap Toggle overflow
- Caso não haja caminho de módulo óbvio para a classe, você precisa encontrar a dependência em outra localização.
- Busque pela classe nomeada no
ClassNotFoundExceptiondo Relatório Tattletale. - Busque o módulo contendo o JAR no diretório
EAP_HOME/modulese encontre o nome do módulo como na etapa anterior.
4.2.4. Busca do JAR na Instalação Anterior Copiar o linkLink copiado para a área de transferência!
lib/ anterior do servidor.
ClassNotFoundException no log:
Caused by: java.lang.NoClassDefFoundError: org/hibernate/validator/ClassValidator at java.lang.Class.getDeclaredMethods0(Native Method)
Caused by: java.lang.NoClassDefFoundError: org/hibernate/validator/ClassValidator at java.lang.Class.getDeclaredMethods0(Native Method)
- Abra o terminal e navegue ao diretório
EAP5_HOME/. - Emita o comando:
grep 'org.hibernate.validator.ClassValidator' `find . \-name '*.jar'` - 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
Binary file ./jboss-eap-5.1/seam/lib/hibernate-validator.jar matchesCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 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 aos Módulos no capítulo Iniciação dos Aplicativos de Desenvolvimento do Guia de Desenvolvimento para o JBoss EAP 6 no https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/. - Reconstrua e reimplante o aplicativo.
4.2.5. Depuração e Resolução dos ClassCastExceptions Copiar o linkLink copiado para a área de transferência!
Procedimento 4.10.
- Busque pelo aplicativo para encontrar todos os JAR(s) que contém a classe nomeada pelo
ClassCastException. Caso exista um módulo definido para a classe, encontre e remova os JAR(s) duplicados a partir do WAR ou EAR do aplicativo. - Encontre o módulo do JBoss contendo a classe e defina claramente a dependência no arquivo
MANIFEST.MFou no arquivojboss-deployment-structure.xml. Refira-se ao Carregamento de Classe e Subimplantações no capítulo Carregamento de Classe e Módulos do Guia de Desenvolvimento para o JBoss EAP 6 no https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/ para maiores informações. - 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
ClassCastExceptionno log:java.lang.ClassCastException: com.example1.CustomClass1 cannot be cast to com.example2.CustomClass2
java.lang.ClassCastException: com.example1.CustomClass1 cannot be cast to com.example2.CustomClass2Copy to Clipboard Copied! Toggle word wrap Toggle overflow - No seu código, imprima a informação do carregador das classes nomeados pelo
ClassCastExceptionao 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());logger.info("Class loader for CustomClass1: " + com.example1.CustomClass1.getClass().getClassLoader().toString()); logger.info("Class loader for CustomClass2: " + com.example2.CustomClass2.getClass().getClassLoader().toString());Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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 Copiar o linkLink copiado para a área de transferência!
- Renomeie o arquivo JAR a um nome que é diferente ao WAR, de forma que a web gerada e os contextos WAR sejam únicos.
- Forneça um elemento
<context-root>ao arquivojboss-web.xml. - Forneça um elemento
<context-root>ao arquivojboss-webservices.xml. - Personalize o elemento
<context-root>para o WAR no arquivoapplication.xml.
4.2.7. Depuração e Resolução dos Erros da Página de Depuração do JBoss Seam Copiar o linkLink copiado para a área de transferência!
Figura 4.1. Página de Depuração do JBoss Seam
Procedimento 4.11.
- Expanda a seção
Componentna página e procure pelo componenteorg.jboss.seam.caughtException. - A causa e o rastreamento de pilha deve levá-lo às dependências ausentes.
Figura 4.2. Informação
org.jboss.seam.caughtExceptiondo componente - 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.slf4jaoMANIFEST.MFManifest-Version: 1.0 Dependencies: org.slf4j
Manifest-Version: 1.0 Dependencies: org.slf4jCopy to Clipboard Copied! Toggle word wrap Toggle overflow Outra opção é adicionar uma dependência para o módulo ao arquivojboss-deployment-structure.xml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.3. Revise a Migração dos Aplicativos da Amostra Copiar o linkLink copiado para a área de transferência!
4.3.1. Revise a Migração dos Aplicativos de Amostra Copiar o linkLink copiado para a área de transferência!
Segue abaixo uma lista dos aplicativos de amostra do JBoss EAP 5.x que foram migrados ao JBoss EAP 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 EAP 6 Copiar o linkLink copiado para a área de transferência!
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 EAP 6. Esse aplicativo de amostra pode ser encontrado na distribuição do JBoss EAP 5.1 sob EAP5.1_HOME/jboss-eap-5.1/seam/examples/jpa/
Importante
Procedimento 4.12. Migração da amostra Seam 2.2 JPA
Remoção do arquivo jboss-web
Remova o arquivojboss-web.xmldo diretóriojboss-seam-jpa.war/WEB-INF/. O carregamento da classe definido nojboss-web.xmlé agora o comportamento default.Modificação do arquivo
jboss-seam-jpa.jar/META-INF/persistence.xmlconforme abaixo.- Remova ou comente a propriedade
hibernate.cache.provider_classno arquivojboss-seam-jpa.war/WEB-INF/classes/META-INF/persistence.xml:<!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->
<!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Adicione a propriedade do módulo do fornecedor do arquivo
jboss-seam-booking.jar/META-INF/persistence.xml:<property name="jboss.as.jpa.providerModule" value="hibernate3-bundled" />
<property name="jboss.as.jpa.providerModule" value="hibernate3-bundled" />Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Altere a propriedade
jta-data-sourcepara uso do nome JNDI da fonte de dados JDBC:<jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
<jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Adição das dependências Seam 2.2
Copie os seguintes JARs da biblioteca Seam 2.2,SEAM_HOME/lib/, ao diretóriojboss-seam-jpa.war/WEB-INF/lib/:- antlr.jar
- slf4j-api.jar
- slf4j-log4j12.jar
- hibernate-entitymanager.jar
- hibernate-core.jar
- hibernate-annotations.jar
- hibernate-commons-annotations.jar
- hibernate-validator.jar
Criação de um arquivo jboss-deployment-structure para adicionar as dependências restantes
Crie um arquivojboss-deployment-structure.xmlna pastajboss-seam-jpa.war/WEB-INF/contendo os seguintes dados:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
O aplicativo da amostra Seam 2.2 implanta e executa com êxito no JBoss EAP 6.
4.3.3. Migração da Amostra do Seam 2.2 JPA para o JBoss EAP 6 Copiar o linkLink copiado para a área de transferência!
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 EAP 6”. Para migrar o aplicativo, você deve realizar o seguinte:
- Inicialize o JSF 1.2 ao invés do JSF 2 default.
- Empacote versões antigas dos Hibernate JARs ao invés de usar aquelas que lançam o JBoss EAP 6.
- Altere os bindings JNDI para uso da nova sintaxe portátil do Java EE 6 JNDI.
Importante
Procedimento 4.13. Migração da amostra Seam 2.2 Booking
Crie o arquivo
jboss-deployment-structure.xmlCrie um novo arquivo nomeadojboss-deployment-structure.xmlnojboss-seam-booking.ear/META-INF/e adicione o seguinte conteúdo:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Modifique o arquivo
jboss-seam-booking.jar/META-INF/persistence.xmlconforme o seguinte.- Remova ou comente a propriedade do hibernate para a classe do provedor do cache:
<!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->
<!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Adicione a propriedade do módulo do provedor ao arquivo
jboss-seam-booking.jar/META-INF/persistence.xml:<property name="jboss.as.jpa.providerModule" value="hibernate3-bundled" />
<property name="jboss.as.jpa.providerModule" value="hibernate3-bundled" />Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Altere a propriedade
jta-data-sourcepara uso do nome JNDI da fonte de dados JDBC:<jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
<jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Copie os JARs a partir da distribuição Seam 2.2
Copie os seguintes JARs a partir da distribuição Seam 2.2EAP5.x_HOME/jboss-eap5.x/seam/lib/no diretóriojboss-seam-booking.ear/lib.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Altere os nomes de pesquisa JNDI
Altere os strings de pesquisa JNDI no arquivojboss-seam-booking.war/WEB-INF/components.xml. O JBoss EAP 6 efetua o binds nos EJBs usando as regras de sintaxe portátil JNDI e você não pode usar o jndiPattern que era usado no JBoss EAP 5. Segue abaixo os strings de pesquisa EJB JNDI do aplicativo que devem ser alterados no JBoss EAP 6:Os strings de pesquisa para os EJBs de framework Seam 2.2 devem ser alteradas conforme abaixo:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Você pode usar uma das seguintes abordagens:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Adição dos elementos do componente
Você pode adicionar umjndi-namepara cada EJB aoWEB-INF/components.xml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
O aplicativo da amostra Seam 2.2 Booking implanta e executa com êxito no JBoss EAP 6.
4.3.4. Migração do Seam 2.2 Booking Archive ao JBoss EAP 6: Instruções de Etapa-por-Etapa Copiar o linkLink copiado para a área de transferência!
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
Procedimento 4.14. Migração de seu aplicativo
4.3.5. Construção e Depuração da Versão do JBoss EAP 5.1 do Aplicativo Seam 2.2 Booking Copiar o linkLink copiado para a área de transferência!
Procedimento 4.15. Construção e implantação do EAR
- Contrução do EAR:
cd /EAP5_HOME/jboss-eap5.1/seam/examples/booking ANT_HOME/ant explode
$ cd /EAP5_HOME/jboss-eap5.1/seam/examples/booking $ ANT_HOME/ant explodeCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 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
$ 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.earCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Inicie o servidor do JBoss EAP 6 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.dodeployINFO [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.dodeployCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Crie um arquivo vazio com o nome
jboss-seam-booking.ear.dodeploye copie-o ao diretórioEAP6_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"
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"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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.Clique na Seção 4.3.4, “Migração do Seam 2.2 Booking Archive ao JBoss EAP 6: Instruções de Etapa-por-Etapa” para retornar ao tópico anterior.
4.3.6. Depuração e resolução do erros e exceções do Seam 2.2 Booking Archive Deployment Copiar o linkLink copiado para a área de transferência!
Importante
Procedimento 4.16. Depuração e resolução dos erros de implantação e exceções
- Problema - java.lang.ClassNotFoundException: javax.faces.FacesExceptionQuando você implanta o aplicativo, o log contém o seguinte erro:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow O que significa:O ClassNotFoundException indica que falta uma dependência. Neste caso, ele não pode encontrar a classe
javax.faces.FacesExceptione 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:Ambos os módulos possuem o mesmo nome de módulo:javax/faces/api/main javax/faces/api/1.2
javax/faces/api/main javax/faces/api/1.2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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 arquivoMANIFEST.MFe 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 arquivojboss-deployment-structure.xmlno diretório doMETA-INF/do EAR que contém os seguintes dados:Na seçãoCopy to Clipboard Copied! Toggle word wrap Toggle overflow deployment, você adiciona a dependência para ojavax.faces.apido 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 arquivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failede criando um arquivojboss-seam-booking.ear.dodeployvazio no mesmo diretório. - Problema - java.lang.ClassNotFoundException: org.apache.commons.logging.LogQuando você implanta o aplicativo, o log contém o seguinte erro:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow O que significa:O
ClassNotFoundExceptionindica a falta de uma dependência. Neste caso, ele não pode buscar a classeorg.apache.commons.logging.Loge 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 caminhoorg/apache/commons/logging/. O nome do módulo é “org.apache.commons.logging”.Modifique o arquivojboss-deployment-structure.xmle adicione a dependência do módulo à seção de implantação do arquivo.O<module name="org.apache.commons.logging" export="true"/>
<module name="org.apache.commons.logging" export="true"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow jboss-deployment-structure.xmldeve parecer-se com o seguinte:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Reimplante o aplicativo apenas deletando o arquivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failede criando um arquivojboss-seam-booking.ear.dodeployvazio no mesmo diretório. - Problema - java.lang.ClassNotFoundException: org.dom4j.DocumentExceptionQuando 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]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]Copy to Clipboard Copied! Toggle word wrap Toggle overflow O que significa:O
ClassNotFoundExceptionindica que falta uma dependência. Neste caso, ele não pode buscar pela classeorg.dom4j.DocumentException.Como resolver isto:Encontre o nome do módulo no diretório
EAP6_HOME/modules/system/layers/base/procurando peloorg/dom4j/DocumentException. O nome do módulo é “org.dom4j”. Modifique o arquivojboss-deployment-structure.xmlpara adicionar a dependência do módulo à seção de implantação do arquivo.O arquivo<module name="org.dom4j" export="true"/>
<module name="org.dom4j" export="true"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow jboss-deployment-structure.xmldeve agora parecer-se com o abaixo:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Reimplante o aplicativo apenas deletando o arquivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failede criando um arquivojboss-seam-booking.ear.dodeployvazio no mesmo diretório. - Problema - java.lang.ClassNotFoundException: org.hibernate.validator.InvalidValueQuando 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]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]Copy to Clipboard Copied! Toggle word wrap Toggle overflow O que significa:O
ClassNotFoundExceptionindica que falta uma dependência. Neste caso, isto não pode encontrar a classeorg.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 EAP 5.1. Procure pelo JAR que contém a classe ausente no diretórioEAP5_HOME/seam/lib/. Digite o seguinte para abrí-lo:O resultado apresenta:cd EAP5_HOME/seam/lib grep 'org.hibernate.validator.InvalidValue' `find . -name '*.jar'`
$ cd EAP5_HOME/seam/lib $ grep 'org.hibernate.validator.InvalidValue' `find . -name '*.jar'`Copy to Clipboard Copied! Toggle word wrap Toggle overflow Neste caso, copie oBinary file ./hibernate-validator.jar matches Binary file ./test/hibernate-all.jar matches
$ Binary file ./hibernate-validator.jar matches $ Binary file ./test/hibernate-all.jar matchesCopy to Clipboard Copied! Toggle word wrap Toggle overflow hibernate-validator.jarpara o diretóriojboss-seam-booking.ear/lib/cp EAP5_HOME/seam/lib/hibernate-validator.jar jboss-seam-booking.ear/lib
$ cp EAP5_HOME/seam/lib/hibernate-validator.jar jboss-seam-booking.ear/libCopy to Clipboard Copied! Toggle word wrap Toggle overflow Reimplante o aplicativo apenas deletando o arquivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failede criando um arquivojboss-seam-booking.ear.dodeployvazio no mesmo diretório. - Problema - java.lang.InstantiationException: org.jboss.seam.jsf.SeamApplicationFactoryQuando você implanta o aplicativo, o log contém o seguinte erro:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow O que significa:O
com.sun.faces.config.ConfigurationExceptionejava.lang.InstantiationExceptionindicam 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ódulocom.sun.faces, existem dois móduloscom.sun.jsf-impl. Uma checagem rápida dojsf-impl-1.2_13.jarno diretório 1.2 demonstra que isto contém as classescom.sun.faces. Assim como realizado com ojavax.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 ojboss-deployment-structure.xmlpara 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:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Reimplante o aplicativo apenas deletando o arquivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failede criando um arquivojboss-seam-booking.ear.dodeployvazio no mesmo diretório. - Problema - java.lang.ClassNotFoundException: org.apache.commons.collections.ArrayStackQuando 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]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]Copy to Clipboard Copied! Toggle word wrap Toggle overflow O que significa:O
ClassNotFoundExceptionindica que falta uma dependência. Neste caso, ele não pode buscar a classeorg.apache.commons.collections.ArrayStack.Como resolver isto:Encontre o nome do módulo no diretório
EAP6_HOME/modules/system/layers/base/procurando pelo caminhoorg/apache/commons/collections. O nome do módulo é “org.apache.commons.collections”. Modifique ojboss-deployment-structure.xmlpara adicionar a dependência do módulo à seção de implantação do arquivo.O arquivo<module name="org.apache.commons.collections" export="true"/>
<module name="org.apache.commons.collections" export="true"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow jboss-deployment-structure.xmldeve agora parecer-se com o abaixo:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Reimplante o aplicativo apenas deletando o arquivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failede criando um arquivojboss-seam-booking.ear.dodeployvazio no mesmo diretório. - Problema - Serviços com dependências indisponíveis/faltantesQuando 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 ]"]}}}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 ]"]}}}Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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á:
O “/em” indica um Gerenciador de Entidade e problema de fonte de dados.missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".AuthenticatorAction.\"env/org.jboss.seam.example.booking.AuthenticatorAction/em\" ]
missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".AuthenticatorAction.\"env/org.jboss.seam.example.booking.AuthenticatorAction/em\" ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow Como resolver isto:No JBoss EAP 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 EAP 6 lança uma fonte de dados de amostra que já está definida no arquivostandalone.xml, modifique o arquivopersistence.xmlpara uso da amostra da fonte de dados neste aplicativo. Quando pesquisando no arquivostandalone.xml, você pode perceber que ojndi-namepara amostra da fonte de dados éjava:jboss/datasources/ExampleDS. Modifique o arquivojboss-seam-booking.jar/META-INF/persistence.xmlpara comentar o elementojta-data-sourceexistente e substituí-lo pelo o seguinte:<!-- <jta-data-source>java:/bookingDatasource</jta-data-source> --> <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
<!-- <jta-data-source>java:/bookingDatasource</jta-data-source> --> <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Reimplante o aplicativo apenas deletando o arquivoEAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failede criando um arquivojboss-seam-booking.ear.dodeployvazio no mesmo diretório. - 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 execução "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 execução.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.Clique na Seção 4.3.4, “Migração do Seam 2.2 Booking Archive ao JBoss EAP 6: Instruções de Etapa-por-Etapa” para retornar ao tópico anterior.
4.3.7. Depuração e Resolução de erros e exceções do Seam 2.2 Booking Archive Runtime Copiar o linkLink copiado para a área de transferência!
Importante
Procedimento 4.17. Depuração e resolução das exceções e erros do período de execução
- 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:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow O que significa:Um
NameNotFoundExceptionindica um problema de nomeação JNDI. As regras de nomeação JNDI foram alteradas no JBoss EAP 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:
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 arquivoCopy to Clipboard Copied! Toggle word wrap Toggle overflow lib/components.xmldo 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 elementocore:initconforme o seguinte:Em seguida, você precisa adicionar o EjbSynchronizations e TimerServiceDispatcher JNDI bindings. Adicione os seguintes componentes ao arquivo:<!-- <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: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"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow O arquivo components.xml deve parecer-se com o seguinte:<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.transaction.EjbSynchronizations" jndi-name="java:app/jboss-seam/EjbSynchronizations"/> <component class="org.jboss.seam.async.TimerServiceDispatcher" jndi-name="java:app/jboss-seam/TimerServiceDispatcher"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy to Clipboard Copied! Toggle word wrap Toggle overflow Reimplante o aplicativo apenas excluindo o arquivostandalone/deployments/jboss-seam-booking.ear.failede criando um arquivojboss-seam-booking.ear.dodeployvazio no mesmo diretório. - Problema - O aplicativo implanta e executa sem o erro. Quando você acessa o URL http://localhost:8080/seam-booking/ num navegador e tenta o login, isto falha com a mensagem "O Login falhou. A transação falhou." Você deve verificar um traço de exceção no log do servidor:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow O que significa:O ClassNotFoundException indica a biblioteca Hibernate ausente. Neste caso está no
hibernate-core.jar.Como resolver isto:Copie o
hibernate-core.jarJAR a partir no diretórioEAP5_HOME/seam/lib/ao diretóriojboss-seam-booking.ear/lib.Reimplante o aplicativo apenas excluindo o arquivostandalone/deployments/jboss-seam-booking.ear.failede criando um arquivojboss-seam-booking.ear.dodeployvazio no mesmo diretório. - Problema - O aplicativo implanta e executa sem erro. Quando você acessa o URL http://localhost:8080/seam-booking/ num navegador, você está apto a efetuar o login com sucesso. No entanto, quando você tentar reservar um hotel, você verá um traço da exceção.Para depurar isto, você deve primeiramente remover o
jboss-seam-booking.ear/jboss-seam-booking.war/WEB-INF/lib/jboss-seam-debug.jaruma vez que isto mascara o erro verdadeiro. Neste caso, você deve verificar o seguinte erro:java.lang.NoClassDefFoundError: org/hibernate/annotations/common/reflection/ReflectionManager
java.lang.NoClassDefFoundError: org/hibernate/annotations/common/reflection/ReflectionManagerCopy to Clipboard Copied! Toggle word wrap Toggle overflow O que significa:O NoClassDefFoundError indica a biblioteca Hibernate ausente.
Como resolver isto:Copie o
hibernate-annotations.jarehibernate-commons-annotations.jarJARs a partir do diretórioEAP5_HOME/seam/lib/ao diretóriojboss-seam-booking.ear/lib.Reimplante o aplicativo apenas excluindo o arquivostandalone/deployments/jboss-seam-booking.ear.failede criando um arquivojboss-seam-booking.ear.dodeployvazio no mesmo diretório. - Os erros do período de execução e aplicativo deve ser resolvidoNeste caso, o aplicativo implanta e executa sem erro.Clique na Seção 4.3.4, “Migração do Seam 2.2 Booking Archive ao JBoss EAP 6: Instruções de Etapa-por-Etapa” para retornar ao tópico anterior.
4.3.8. Revisão do Sumário das Alterações feitas quando Migrando o Aplicativo Seam 2.2 Booking Copiar o linkLink copiado para a área de transferência!
Importante
- Você criou um arquivo
jboss-deployment-structure.xmlno diretórioMETA-INF/do EAR. Você adicionou o<dependencies>e<exclusions>para resolver oClassNotFoundExceptions. Este arquivo contém os seguintes dados:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Você copiou os seguintes JARs a partir do diretório
EAP5_HOME/jboss-eap-5.1/seam/lib/ao diretóriojboss-seam-booking.ear/lib/para solucionar oClassNotFoundExceptions:- hibernate-core.jar
- hibernate-validator.jar
- Você modificou o arquivo
jboss-seam-booking.jar/META-INF/persistence.xmlconforme o seguinte.- Você alterou o elemento
jta-data-sourcepara uso do banco de dados da amostra que lança o JBoss EAP 6:<!-- <jta-data-source>java:/bookingDatasource</jta-data-source> --> <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
<!-- <jta-data-source>java:/bookingDatasource</jta-data-source> --> <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Você comentou a propriedade hibernate.cache.provider_class:
<!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->
<!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- Você modificou o arquivo
lib/components.xmldo WAR para uso de novos JNDI bindings- Você pode substituir o elemento existente
core:initconforme 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"/><!-- <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"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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"/>
<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"/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Apêndice A. Histórico de Revisão Copiar o linkLink copiado para a área de transferência!
| Histórico de Revisões | |||
|---|---|---|---|
| Revisão 1.0.0-2 | Mon Oct 13 2014 | ||
| |||