Capítulo 3. Migração do seu Aplicativo
3.1. Alterações Exigidas pela Maioria dos Aplicativos
3.1.1. Revisão das Alterações Exigidas pela Maioria dos Aplicativos
3.1.2. Alterações do Carregamento de Classe
3.1.2.1. Atualização do Aplicativo Devido às Alterações de Carregamento de Classe
- Primeiro, veja o empacotamento do seu aplicativo e as suas dependências. Para mais informações, consulte: Seção 3.1.2.3, “Atualização das Dependências do Aplicativo Devido às Alterações de Carregamento de Classe”
- Caso o seu aplicativo realize o registro em log, será necessário especificar corretamente as dependências do módulo. Para mais informações, consulte: Seção 3.1.4.1, “Modificação das Dependências de Registro em Log”
- Devido às alterações do carregamento de classe modular, pode ser que seja necessário alterar a estrutura do empacotamento do seu EAR ou WAR. Para mais informações, consulte: Seção 3.1.5.1, “Modificação do Empacotamento de EARS e WARs”
3.1.2.2. Compreendendo as Dependências de Módulo
Um módulo só é capaz de acessar as suas próprias classes e as classes de qualquer módulo que possua uma dependência explícita ou implícita.
Procedimento 3.1. Compreendendo as Dependências de Módulo
Compreendendo as dependências implícitas
Os implantadores dentro do servidor adicionam automaticamente e de forma implícita algumas dependências de módulo comumente usadas, comojavax.api
esun.jdk
. Isto permite que as classes sejam visíveis à implantação durante o tempo de execução e reduz a tarefa do desenvolvedor de adicionar explicitamente as dependências. Para obter mais detalhes sobre como e quando essas dependências implícitas são adicionadas, consulte Implicit Module Dependencies no capítulo entitulado Class Loading and Modules no guia Development Guide para o JBoss EAP 6 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, caso contrário as dependências ausentes resultarão em erros de implantação ou de tempo de execução. Caso esteja faltando uma dependência, você encontrará rastreios comoClassNotFoundExceptions
ouNoClassDefFoundErrors
no log do servidor. Caso mais de um módulo carregue o mesmo JAR ou um módulo carregue uma classe que estenda uma classe carregada por um módulo diferente, você encontrará rastreios comoClassCastExceptions
no servidor do log. Para especificar as dependências explicitamente, modifique oMANIFEST.MF
ou crie um arquivo de descritor de implantação específico do JBossjboss-deployment-structure.xml
. Para mais informações sobre as dependências de módulos, consulte Overview of Class Loading and Modules no capítulo entitulado Class Loading and Module no guia Development Guide para o JBoss EAP 6 em 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 de Carregamento de Classe
O carregamento de classe no JBoss EAP 6 é consideravelmente diferente das versões anteriores do JBoss EAP. O carregamento de classe agora é baseado no projeto JBoss Modules. Ao invés de um carregador de classe único e hierárquico que carrega todos os JARS em um caminho de classe plana, cada biblioteca torna-se um módulo que conecta-se apenas com os módulos exatos dos quais ela depende. As implantações no JBoss EAP 6 também são módulos e elas não têm acesso às classes que são definidas nos JARs no servidor do aplicativo, a não ser que uma dependência explícita seja definida nessas classes. Algumas dependências de módulo definidas pelo servidor do aplicativo são configuradas automaticamente para você. Por exemplo: caso você esteja implantando um aplicativo Java EE, uma dependência no Java EE API é adicionada automaticamente ou implicitamente. Para acesso à lista completa de dependências adicionadas automaticamente pelo servidor, consulte Implicit Module Dependencies no capítulo Class Loading and Modules do guia Development Guide para o JBoss EAP 6 em https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.
Quando você migrar o seu aplicativo para JBoss EAP 6, você pode precisar de desempenhar 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
3.1.3.1. Criação ou Modificação dos Arquivos que Controlam o Carregamento de Classe no EAP 6
Devido à alteração no JBoss EAP 6 para o uso do carregamento de classe modular, você pode precisar de criar ou modificar um ou mais arquivos para adicionar dependências ou evitar que dependências automáticas sejam carregadas. Para mais informações sobre o carregamento de classe e precedência do carregamento de classe, consulte o capítulo entitulado Class Loading and Modules no guia Development Guide para o JBoss EAP 6 em https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.
- jboss-web.xml
- Caso tenha definido um elemento
<class-loading>
no arquivojboss-web.xml
, será necessário removê-lo. O comportamento que isto causou no JBoss EAP 5 é agora o comportamento do carregamento de classe padrão no JBoss EAP 6, portanto ele não é mais necessário. Caso este elemento não seja removido, você encontrará um ParseError e XMLStreamException exibidos no log do servidor.Segue abaixo um exemplo de um elemento<class-loading>
no arquivojboss-web.xml
que foi convertido em comentário.<!DOCTYPE jboss-web PUBLIC "-//JBoss//DTD Web Application 4.2//EN" "http://www.jboss.org/j2ee/dtd/jboss-web_4_2.dtd"> <jboss-web> <!-- <class-loading java2ClassLoadingCompliance="false"> <loader-repository> seam.jboss.org:loader=MyApplication <loader-repository-config>java2ParentDelegation=false</loader-repository-config> </loader-repository> </class-loading> --> </jboss-web>
- MANIFEST.MF
- Editado manualmente
- Dependendo dos componentes ou módulos que o seu aplicativo usar, será necessário adicionar uma ou mais dependências a este arquivo. Você pode adicioná-las tanto como
Dependencies
ou como entradasClass-Path
.Segue abaixo um exemploMANIFEST.MF
editado por um desenvolvedor:Manifest-Version: 1.0 Dependencies: org.jboss.logmanager Class-Path: OrderManagerEJB.jar
Caso você modifique esse arquivo, certifique-se de incluir um caractere de nova linha no final do arquivo. - Usando o Maven
- Se você usar o Maven, será necessário modificar o seu arquivo
pom.xml
para gerar as dependências no arquivoMANIFEST.MF
. Se o seu aplicativo usar o EJB 3.0, você pode encontrar uma seção no arquivopom.xml
parecendo com o seguinte:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-ejb-plugin</artifactId> <configuration> <ejbVersion>3.0</ejbVersion> </configuration> </plugin>
Se o código EJB 3.0 usarorg.apache.commons.log
, você precisará da dependência no arquivoMANIFEST.MF
. Para gerar essa dependência, adicione o elemento<plugin>
ao arquivopom.xml
, conforme se segue:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-ejb-plugin</artifactId> <configuration> <ejbVersion>3.0</ejbVersion> <archive> <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile> </archive> </configuration> </plugin>
No exemplo acima, o arquivosrc/main/resources/META-INF/MANIFEST.MF
precisa conter apenas a entrada da dependência:Dependencies: org.apache.commons.logging
O Maven gerará o arquivoMANIFEST.MF
completo:Manifest-Version: 1.0 Dependencies: org.apache.commons.logging
- jboss-deployment-structure.xml
- Esse arquivo é um descritor de implantação específico do JBoss que pode ser usado para controlar o carregamento de classe de forma detalhada. Assim como o
MANIFEST.MF
, esse arquivo pode ser usado para adicionar dependências. Ele também pode evitar que dependências automáticas sejam adicionadas, definir módulos adicionais, alterar o comportamento de carregamentos de classes isoladas de uma implantação EAR e adicionar raízes de recursos adicionais a um módulo.Segue abaixo um exemplo de um arquivojboss-deployment-structure.xml
que adiciona uma dependência ao módulo JSF 1.2 e evita o carregamento automático do módulo JSF 2.0.<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> <deployment> <dependencies> <module name="javax.faces.api" slot="1.2" export="true"/> <module name="com.sun.jsf-impl" slot="1.2" export="true"/> </dependencies> </deployment> <sub-deployment name="jboss-seam-booking.war"> <exclusions> <module name="javax.faces.api" slot="main"/> <module name="com.sun.jsf-impl" slot="main"/> </exclusions> <dependencies> <module name="javax.faces.api" slot="1.2"/> <module name="com.sun.jsf-impl" slot="1.2"/> </dependencies> </sub-deployment> </jboss-deployment-structure>
Para mais informações sobre este arquivo, consulte: Seção 3.1.3.2, “jboss-deployment-structure.xml”. - application.xml
- Nas versões anteriores do JBoss EAP, a ordem das implantações dentro de um EAR era controlada usando o arquivo
jboss-app.xml
. Este não é mais o caso. A especificação Java EE6 fornece o elemento<initialize-in-order>
noapplication.xml
, permitindo o controle da ordem em que os módulos Java EE são implantados dentro de um EAR.Na maioria das vezes, não é necessário especificar a ordem da implantação. Se o seu aplicativo usa injeções de dependência e referências de recurso para referir-se a componentes em módulos externos, na maioria dos casos, o elemento<initialize-in-order>
não é necessário, já que o servidor do aplicativo está apto a determinar implicitamente a maneira correta e ideal de ordenar os componentes.Vamos supor que você possui um aplicativo que contém ummyBeans.jar
e ummyApp.war
que são empacotados dentro de ummyApp.ear
. Um servlet nomyApp.war
usa uma anotação@EJB
para injetar um bean a partir domyBeans.jar
. Neste caso, o servidor do aplicativo possui o conhecimento apropriado para garantir que o componente EJB esteja disponível antes do servlet ser iniciado, não havendo a necessidade de usar o elemento<initialize-in-order>
.No entanto, se esse servlet usar referências remotas de estilo de pesquisa JNDI de legacia para acesso ao bean, como a seguir, pode ser que a ordem do módulo precise ser especificada.init() { Context ctx = new InitialContext(); ctx.lookup("TheBeanInMyBeansModule"); }
Neste caso, o servidor não está apto a determinar que o componente EJB está nomyBeans.jar
e será necessário impor que os componentes nomyBeans.jar
sejam inicializados e ativados antes dos componentes nomyApp.war
. Para fazer isto, é necessário configurar o elemento<initialize-in-order>
paratrue
e especificar a ordem dos módulosmyBeans.jar
emyApp.war
no arquivoapplication.xml
.Segue abaixo um exemplo que usa o elemento<initialize-in-order>
para controlar a ordem de implantação. OmyBeans.jar
é implantado antes do arquivomyApp.war
.<application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="6" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd"> <application-name>myApp</application-name> <initialize-in-order>true</initialize-in-order> <module> <ejb>myBeans.jar</ejb> </module> <module> <web> <web-uri>myApp.war</web-uri> <context-root>myApp</context-root> </web> </module> </application>
O esquema para o arquivoapplication.xml
pode ser encontrado no http://java.sun.com/xml/ns/javaee/application_6.xsd.Nota
Observe que a configuração do elemento<initialize-in-order>
paratrue
reduz a velocidade da implantação. É preferível definir as dependências apropriadas usando injeções de dependência ou referências de recurso, já que isto permite ao contêiner maior flexibilidade na otimização das implantações. - jboss-ejb3.xml
- O descritor de implantação
jboss-ejb3.xml
ocupa o lugar do descritor de implantaçãojboss.xml
substituindo e adicionando os recursos fornecidos pelo descritor de implantaçãoejb-jar.xml
do Java Enterprise Edition (EE). O novo arquivo é incompatível com ojboss.xml
, e ojboss.xml
é agora ignorado nas implantações. - login-config.xml
- O arquivo
login-config.xml
não é mais usado para a configuração de segurança. A segurança é agora configurada no elemento<security-domain>
no arquivo de configuração do servidor. Para um servidor autônomo, o arquivo deve serstandalone/configuration/standalone.xml
. Caso esteja executando o seu servidor em um domínio gerenciado, o arquivo deve serdomain/configuration/domain.xml
.
3.1.3.2. jboss-deployment-structure.xml
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 de classe na implantação.
EAP_HOME/docs/schema/jboss-deployment-structure-1_2.xsd
3.1.3.3. Empacotamento de Recursos para o Novo Sistema de Carregamento de Classe Modular
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 web são carregados somente a partir dos diretórios WEB-INF/classes
e WEB-INF/lib
. A falta do empacotamento dos artefatos do aplicativo nas localizações especificadas pode resultar em ClassNotFoundException
, NoClassDefError
ou em outros erros de tempo de execução.
- Modificação do Empacotamento de Recursos
- Para disponibilizar os recursos apenas para o aplicativo, você deve agrupar os arquivos de propriedades, JARs e outros artefatos com WAR movendo-os para o diretório
WEB-INF/classes/
ouWEB-INF/lib/
. Essa abordagem está descrita em mais detalhes aqui: Seção 3.1.3.4, “Alteração da Localização das Propriedades ResourceBundle” - Criação de um Módulo Personalizado
- Caso queira disponibilizar os recursos personalizados a todos os aplicativos em execução no servidor do JBoss EAP 6, você deve criar um módulo personalizado. Esta abordagem está descrita em mais detalhes aqui: 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
Nas versões anteriores do JBoss EAP, o diretório EAP_HOME/server/SERVER_NAME/conf/
estava no caminho de classe e disponível para o aplicativo. Para disponibilizar as propriedades para o caminho de classe do aplicativo no JBoss EAP 6, você deve empacotá-las dentro do seu aplicativo.
Procedimento 3.2. Alteração da Localização das Propriedades ResourceBundle
- Caso esteja implantando um arquivo WAR, essas propriedades devem ser empacotadas na pasta
WEB-INF/classes/
do WAR. - Caso queira que essas propriedades fiquem acessíveis a todos os componentes em um EAR, elas devem ser empacotadas na raiz de um JAR e, então, o JAR deve ser colocado na pasta
lib/
do EAR.
3.1.3.5. Criação de um Módulo Personalizado
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/module
para conter os arquivos e JARs. Por exemplo:$ cd EAP_HOME/modules/
$ mkdir -p myorg-conf/main/properties
- Mova os arquivos de propriedades para o diretório
EAP_HOME/modules/myorg-conf/main/properties/
criado na etapa anterior. - Crie um arquivo
module.xml
no diretórioEAP_HOME/modules/myorg-conf/main/
contendo o seguinte XML:<module xmlns="urn:jboss:module:1.1" name="myorg-conf"> <resources> <resource-root path="properties"/> </resources> </module>
- Modifique o subsistema
ee
no arquivo de configuração do servidor. Você pode usar o JBoss CLI ou pode editar manualmente o arquivo.- Siga as seguintes etapas para modificar o arquivo de configuração do servidor usando o JBoss CLI.
- Inicie o servidor e conecte-se ao Gerenciamento CLI.
- Para o Linux, insira o seguinte na linha de comando:
EAP_HOME/bin/jboss-cli.sh --connect
- Para o Windows, insira o seguinte na linha de comando:
C:\>EAP_HOME\bin\jboss-cli.bat --connect
Você deverá ver a seguinte resposta:Conectado ao controlador autônomo em localhost:9999
- 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"}])
Você deverá ver o seguinte resultado:{"outcome" => "success"}
- Siga essas etapas caso prefira editar manualmente o arquivo de configuração do servidor.
- Interrompa o servidor e abra o arquivo de configuração do servidor em um editor de texto. Caso esteja executando um servidor autônomo, o arquivo será
EAP_HOME/standalone/configuration/standalone.xml
ou, caso esteja executando um domínio gerenciado, o arquivo seráEAP_HOME/domain/configuration/domain.xml
. - Encontre o subsistema
ee
e adicione o módulo global paramyorg-conf
. Segue um exemplo do elemento do subsistemaee
modificado para a inclusão do elementomyorg-conf
:Exemplo 3.1. elemento
myorg-conf
<subsystem xmlns="urn:jboss:domain:ee:1.0" > <global-modules> <module name="myorg-conf" slot="main" /> </global-modules> </subsystem>
- Presumindo que você copiou um arquivo nomeado
my.properties
à localização de módulo correta, você poderá agora carregar os arquivos de propriedades usando um código semelhante ao seguinte:Exemplo 3.2. Carregue o arquivo de propriedades
Thread.currentThread().getContextClassLoader().getResource("my.properties");
3.1.4. Alterações do Registro em Log
3.1.4.1. Modificação das Dependências de Registro em Log
O JBoss LogManager suporta front ends para todas as estruturas de registro, portanto você pode manter seu atual código de registro ou mover para a nova infraestrutura de registro do JBoss. Independente da sua decisão, devido às alterações do carregamento de classes modulares, é provável que tenha que modificar seu aplicativo para adicionar as dependências necessárias.
Procedimento 3.4. Atualização do código de registro do aplicativo
3.1.4.2. Atualização do Código de Aplicativo para Estruturas de Registro em Log de Terceiros
No JBoss EAP 6, as dependências de registro para estruturas de terceiros comuns, como o Apache Commons Logging, Apache log4j, SLF4J e Java Logging, são adicionadas por padrão. Normalmente, é preferível usar a estrutura de resgistro fornecida pelo contêiner JBoss EAP. No entanto, caso necessite de uma funcionalidade específica fornecida por uma estrutura de terceiros, o módulo do JBoss EAP correspondente deve ser removido de sua implantação. Observe que, embora a sua implantação utilize a estrutura de registro em log de terceiros, os logs do servidor continuam a usar a configuração do subsistema de registro do JBoss EAP.
org.apache.log4j
do JBoss EAP 6 de sua implantação. O primeiro procedimento funciona em qualquer versão do JBoss EAP 6. O segundo procedimento é válido apenas no JBoss EAP 6.3 ou em versões posteriores.
Procedimento 3.5. Configuração do JBoss EAP 6 para usar um arquivo log4j.properties ou log4j.xml
Nota
- Crie um
jboss-deployment-structure.xml
com o seguinte conteúdo:<jboss-deployment-structure> <deployment> <!-- Exclusions allow you to prevent the server from automatically adding some dependencies --> <exclusions> <module name="org.apache.log4j" /> </exclusions> </deployment> </jboss-deployment-structure>
- Posicione o arquivo
jboss-deployment-structure.xml
no diretórioMETA-INF/
ou no diretórioWEB-INF/
, caso esteja implantando um WAR. Do contrário, posicione-o no diretórioMETA-INF/
caso esteja implantando um EAR. Se a sua implantação incluir componentes dependentes, o módulo também deve ser removido para cada subimplantação. - Adicione o arquivo
log4j.properties
oulog4j.xml
no diretóriolib/
de seu EAR ou no diretórioWEB-INF/classes/
de sua implantação WAR. Caso prefira posicionar o arquivo no diretóriolib/
de seu WAR, você deve especificar o caminho<resource-root>
no arquivojboss-deployment-structure.xml
.<jboss-deployment-structure> <deployment> <!-- Exclusions allow you to prevent the server from automatically adding some dependencies --> <exclusions> <module name="org.apache.log4j" /> </exclusions> <resources> <resource-root path="lib" /> </resources> </deployment> </jboss-deployment-structure>
- Inicie o servidor do JBoss EAP 6 com o seguinte argumento de tempo de execução para evitar que um
ClassCastException
apareça no console no momento de implantação do aplicativo:-Dorg.jboss.as.logging.per-deployment=false
- Implante seu aplicativo.
Procedimento 3.6. Configuração das Dependências de Registro para o JBoss EAP 6.3 ou versões posteriores
add-logging-api-dependencies
para remover as dependências da estrutura de registro em log de terceiros. As etapas a seguir demonstram como modificar este atributo de registro em um servidor autônomo do JBoss EAP.
- Inicie o servidor do JBoss EAP 6 com o seguinte argumento de tempo de execução para evitar que um
ClassCastException
apareça no console no momento de implantação do aplicativo:-Dorg.jboss.as.logging.per-deployment=false
- Abra um terminal e conecte-se ao Gerenciamento CLI.
- Para o Linux, insira a seguinte linha de comando:
$ EAP_HOME/bin/jboss-cli.sh --connect
- Para o Windows, insira a seguinte linha de comando:
C:\>EAP_HOME\bin\jboss-cli.bat --connect
- Modifique o atributo
add-logging-api-dependencies
no subsistema de registro.Este atributo controla se o contêiner deve adicionar ou não as dependências API implícitas de registro às suas implantações.- Se definido como
true
, que é o padrão, todas as dependências API implícitas de registro serão adicionadas. - Se definido como
false
, as dependências não serão adicionadas às suas implantações.
Para remover as dependências de estrutura de registro em log de terceiros, você deve definir este atributo comofalse
usando o seguinte comando:/subsystem=logging:write-attribute(name=add-logging-api-dependencies, value=false)
Este comando adiciona o elemento<add-logging-api-dependencies>
ao subsistemalogging
do arquivo de configuraçãostandalone.xml
.<subsystem xmlns="urn:jboss:domain:logging:1.4"> <add-logging-api-dependencies value="false"/> .... </subsystem>
- Implante seu aplicativo.
3.1.4.3. Modificação do Código para Uso da Nova Estrutura de Registro do JBoss
Para usar a nova estrutura, altere suas importações e código conforme abaixo:
Procedimento 3.7. Modificação do Código e das Dependências para Uso da Estrutura de Registro do JBoss
Alteração de suas importações e código de registro
Segue abaixo um exemplo do código que usa a nova estrutura de registro do JBoss:import org.jboss.logging.Level; import org.jboss.logging.Logger; private static final Logger logger = Logger.getLogger(MyClass.class.toString()); if(logger.isTraceEnabled()) { logger.tracef("Starting...", subsystem); }
Adição da dependência de registro
O JAR contendo as classes de registro do JBoss está localizado no módulo nomeadoorg.jboss.logging
. O seu arquivoMANIFEST-MF
deve parecer com o seguinte:Manifest-Version: 1.0 Dependencies: org.jboss.logging
Por favor consulte Seção 3.1.2.3, “Atualização das Dependências do Aplicativo Devido às Alterações de Carregamento de Classe” e Seção 4.2.1, “Depuração e Solução de Problemas de Migração” para mais informações sobre como encontrar a dependência do módulo.
3.1.5. Alterações do Empacotamento do Aplicativo
3.1.5.1. Modificação do Empacotamento de EARS e WARs
Quando a migração de seu aplicativo for efetuada, você pode ter que alterar a estrutura de empacotamento de seu EAR ou WAR devido à alteração do carregamento de classe modular. As dependências de módulo estão carregadas na seguinte ordem:
- Dependências do sistema
- Dependências do Usuário
- Recursos Locais
- Dependências inter-implantadas
Procedimento 3.8. Modificação do empacotamento de arquivos
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 subimplantação EJB jar dentro do EAR é um módulo separado. As classes não possuem acesso às classes em outros módulos dentro do EAR, a não ser que as dependências explícitas tenham sido definidas. As subimplantações sempre possuem uma dependência automática no módulo pai que fornece-as acesso às classes no diretórioEAR/lib/
. No entanto, as subimplantações nem sempre possuem uma dependência automática para permití-las acessar umas às outras. 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>
Por padrão, isto é configurado como falso, permitindo que as subimplantações vejam as classes pertencentes às outras subimplantações dentro do EAR.Para mais informações sobre o carregamento de classe, consulte o capítulo entitulado Class Loading and Modules no guia Development Guide para o JBoss EAP 6 em https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.
3.1.6. Alterações na Configuração do Adaptador de Recursos e Datasource
3.1.6.1. Atualização do Aplicativo devido às Alterações de Configuração
- Se seu aplicativo usa uma fonte de dados, consulte : Seção 3.1.6.2, “Atualização da Configuração da DataSource”.
- Se o seu aplicativo usa JPA e atualmente agrupa JARs Hibernate, consulte: Seção 3.1.6.4, “Configuração da Fonte de Dados para o Hibernate ou JPA” para opções de migração.
- Se o seu aplicativo usa um adaptador de recursos, consulte: Seção 3.1.6.5, “Atualização da Configuração do Adaptador de Recurso”.
- Revise as informações a seguir sobre como configurar as alterações para segurança básica: 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 DataSource
Nas versões anteriores do JBoss EAP, a configuração da DataSource JCA foi definida em um arquivo com um sufixo *-ds.xml
. Esse arquivo foi, então, 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. Apesar desse método de configuração da DataSource ainda possuir suporte para desenvolvimento, ele não é recomendado para produção já que não possui suporte pelas ferramentas administrativas e de gerenciamento do JBoss.
domain/configuration/domain.xml
. Se a instância do JBoss EAP 6 estiver em execução como um servidor autônomo, a DataSource é configurada no standalone/configuration/standalone.xml file
. As DataSources configuradas dessa maneira podem ser gerenciadas e controladas usando as interfaces de gerenciamento do JBoss, incluindo o Console de Gerenciamento da Web e a interface de linha de comando (CLI). Essas ferramentas facilitam o gerenciamento de implantações e a configuração dos servidores múltiplos em execução no domínio gerenciado.
Um driver compatível com JDBC 4.0 pode ser instalado como uma implantação ou como um módulo básico. 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 mais detalhes sobre como fazer um driver compatível com o JDBC 4.0 e como atualizar a configuração atual da sua DataSource para uma gerenciável pelo Console de Gerenciamento da Web e CLI, consulte Seção 3.1.6.3, “Instalação e Configuração do Driver JDBC”.
Você pode usar a ferramenta IronJacamar para migrar as configurações da DataSource e do ResourceAdapter. Esta ferramenta converte os arquivos de configuração de estilo *-ds.xml
no formato esperado pelo JBoss EAP 6. Consulte Seção 4.1.6, “Uso da Ferramenta IronJacamar para a Migração das Configurações do Adaptador de Recursos e das Fontes de Dados” para mais informações.
Nas versões prévias do JBoss EAP, era possível executar uma pesquisa remota JNDI dos objetos da DataSource, no entanto esta prática nunca foi recomendada pelas seguintes razões.
- O controle do cliente de um recurso de servidor não é confiável e pode resultar em conexões vazadas caso o cliente trave ou perca a conexão para o servidor.
- O desempenho é muito lento pois todas as operações do banco de dados possuem proxy através de um
MBean
. - Não há suporte para a propagação da transação.
NotSerializableException
quando migrar o seu aplicativo. A abordagem recomendada é a criação de um EJB para acesso à DataSource e, então, a solicitação do EJB remotamente. Para mais informações, consulte a seção entitulada Remote Invocation Changes neste livro. Informações adicionais podem ser encontradas no guia Development Guide para o JBoss 6 em https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.
3.1.6.3. Instalação e Configuração do Driver JDBC
O driver JDBC pode ser instalado no contêiner em uma das duas seguintes maneiras:
- Como implantação
- Como módulo principal
domain/configuration/domain.xml
. Caso a instância do JBoss EAP 6 esteja sendo executada como um servidor autônomo, a fonte de dados é configurada no arquivo standalone/configuration/standalone.xml
. As informações de referência de esquema, que são as mesmas em ambos os modos, podem ser encontradas no diretório doc/
de instalação do JBoss EAP 6. Para fins desta discussão, pressuponha-se que o servidor esteja sendo executado como servidor autônomo e a fonte de dados esteja configurada no arquivo standalone.xml
.
Procedimento 3.9. Instalação e Configuração do Driver JDBC
Instalação do Driver JDBC.
Instalação do Driver JDBC como uma implantação.
Esta é a maneira recomendada de instalar o driver. Quando o driver JDBC é instalado como uma implantação, ele é implantado como um JAR regular. Caso a instância do JBoss EAP 6 esteja sendo executada como um servidor autônomo, copie o JAR compatível com o JDBC 4.0 no diretórioEAP_HOME/standalone/deployments/
. Para um domínio gerenciado, você deve usar o Console de Gerenciamento ou Gerenciamento CLI para implantar o JAR nos grupos do servidor.Segue um exemplo de um driver MySQL JDBC instalado como uma implantação no servidor autônomo:$cp mysql-connector-java-5.1.15.jar
EAP_HOME/standalone/deployments/
Qualquer driver compatível com o JDBC 4.0 é automaticamente reconhecido e instalado no sistema por nome e versão. Um JAR compatível com o JDBC 4.0 contém um arquivo de texto nomeadoMETA-INF/services/java.sql.Driver
que especifica o(s) nome(s) da classe do driver. Caso o driver não seja compatível com o JDBC 4.0, ele pode ser implantável em uma das seguintes maneiras:- Crie e adicione o arquivo
java.sql.Driver
ao JAR sob o caminhoMETA-INF/services/
. Esse arquivo deve conter o nome de classe do driver, por exemplo:com.mysql.jdbc.Driver
- Crie um arquivo
java.sql.Driver
no diretório de implantação. Para uma instância do JBoss EAP 6 executando como um servidor autônomo, o arquivo deve ser posicionado aqui:EAP_HOME/standalone/deployments/META-INF/services/java.sql.Driver
. Caso o servidor esteja em um domínio gerenciado, você deve usar o Console de Gerenciamento ou o Gerenciamento CLI para implantar o arquivo.
Os aspectos positivos desta abordagem são:Os aspectos negativos desta abordagem são:- Este é o método mais simples já que não há necessidade de definir um módulo.
- Quando o servidor executa em um domínio gerenciado, as implantações que usam esta abordagem são propagadas automaticamente a todos os servidores no domínio. Isto significa que o administrador não precisa distribuir o driver JAR manualmente.
- Se o driver JDBC consiste em mais de um JAR, por exemplo o driver JAR mais um JAR de licença dependente ou um JAR de localização, você não pode instalar o driver como uma implantação. O JDBC deve ser instalado como um módulo principal.
- Caso o driver não seja 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 para um JAR ou sobreposto no diretório
deployments/
.
Instalação do Driver JDBC como um módulo principal.
Para instalar um driver JDBC como um módulo principal, uma estrutura do caminho do arquivo sob o diretórioEAP_HOME/modules/
deve ser criada. Esta estrutura contém o JAR do driver JDBC, JARs de localização ou licenças adicionais do fornecedor e um arquivomodule.xml
para a definição do módulo.Instalação do Driver MySQL JDBC como um módulo principal
- Crie uma estrutura de diretório
EAP_HOME/modules/com/mysql/main/
- No subdiretório
main/
, crie um arquivomodule.xml
contendo a seguinte definição do módulo para o driver MySQL JDBC:<?xml version="1.0" encoding="UTF-8"?> <module xmlns="urn:jboss:module:1.0" name="com.mysql"> <resources> <resource-root path="mysql-connector-java-5.1.15.jar"/> </resources> <dependencies> <module name="javax.api"/> </dependencies> </module>
O nome do módulo, "com.mysql", coincide com a estrutura do diretório para esse módulo. O elemento<dependencies>
é usado para especificar as dependências do módulo em outros módulos. Neste caso, como no caso de todas as fonte de dados JDBC, ele é 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 possua espaço no início do arquivomodule.xml
ou obterá um erro "Novas dependências ausentes/não satisfatórias" para este driver. - Copie MySQL JDBC driver JAR no diretório
EAP_HOME/modules/com/mysql/main/
:$ cp mysql-connector-java-5.1.15.jar
EAP_HOME/modules/com/mysql/main/
Instalação do driver IBM DB2 JDBC e do JAR de licença como um módulo principal.
Este exemplo é fornecido apenas para demonstrar a implantação de drivers que requerem JARs além do JAR do Driver JDBC.- Crie a estrutura do diretório
EAP_HOME/modules/com/ibm/db2/main/
. - No subdiretório
main/
crie um arquivomodule.xml
contendo a seguinte definição do módulo para a licença e o driver IBM DB2 JDBC:<?xml version="1.0" encoding="UTF-8"?> <module xmlns="urn:jboss:module:1.1" name="com.ibm.db2"> <resources> <resource-root path="db2jcc.jar"/> <resource-root path="db2jcc_license_cisuz.jar"/> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies> </module>
Nota
Certifique-se de que você NÃO possua espaço no início do arquivomodule.xml
ou obterá um erro "Novas dependências ausentes/não satisfatórias" para este driver. - Copie o driver JDBC e o JAR de licença no diretório
EAP_HOME/modules/com/ibm/db2/main/
.$ cp db2jcc.jar
EAP_HOME/modules/com/ibm/db2/main/
$ cp db2jcc_license_cisuz.jarEAP_HOME/modules/com/ibm/db2/main/
Os aspectos positivos desta abordagem são:Os aspectos negativos desta abordagem são:- Esta é a única abordagem que funciona quando o driver JDBC consiste em 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 criar uma sobreposição de arquivo.
- É mais difícil configurar um módulo.
- O módulo deve ser manualmente copiado para cada servidor em execução em um domínio gerenciado.
Configuração da fonte de dados.
Adição do driver do banco de dados.
Adicione o elemento<driver>
ao elemento<drivers>
do mesmo arquivo. Mais uma vez, isto contém algumas das mesmas informações sobre a fonte de dados 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.Driver
que especifica o nome de classe do driver. O servidor usa este arquivo para encontrar o nome da(s) classe(s) do driver no JAR. Um driver que é compatível com o JDBC 4.0 não requer um elemento<driver-class>
, desde que ele já esteja especificado no JAR. Segue um exemplo do elemento do driver para um driver MySQL compatível com o JDBC 4.0:<driver name="mysql-connector-java-5.1.15.jar" module="com.mysql"/>
Um driver que não seja compatível com o JDBC 4.0 requer um atributo<driver-class>
para identificar a classe do driver já que não há um arquivoMETA-INF/services/java.sql.Driver
que especifique o nome da classe do driver. Segue um exemplo do elemento do driver para um 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>
Criação da fonte de dados.
Crie um elemento<datasource>
na seção<datasources>
do arquivostandalone.xml
. Este arquivo contém muitas das mesmas informações sobre a 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 a sua alteração seja efetivada ao reiniciar o servidor.Segue um exemplo de um elemento da fonte de dados MySQL no arquivostandalone.xml
:<datasource jndi-name="java:/YourDatasourceName" pool-name="YourDatasourceName"> <connection-url>jdbc:mysql://localhost:3306/YourApplicationURL</connection-url> <driver>mysql-connector-java-5.1.15.jar</driver> <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation> <pool> <min-pool-size>100</min-pool-size> <max-pool-size>200</max-pool-size> </pool> <security> <user-name>USERID</user-name> <password>PASSWORD</password> </security> <statement> <prepared-statement-cache-size>100</prepared-statement-cache-size> <share-prepared-statements/> </statement> </datasource>
Atualização das referências JNDI no código do aplicativo.
Você deve substituir os antigos nomes de pesquisa JNDI no código fonte do aplicativo para usar os novos nomes padronizados da fonte de dados JNDI que você definiu anteriormente. Consulte Seção 3.1.8.4, “Modificação do Aplicativo para Seguir as Novas Regras do Namespace JNDI” para mais informações.Você deve substituir também quaisquer anotações@Resource
existentes que acessam a fonte de dados para utilizar o novo nome JNDI. Por exemplo:@Resource(name = "java:/YourDatasourceName").
3.1.6.4. Configuração da Fonte de Dados para o Hibernate ou JPA
Procedimento 3.10. Remoção do pacote Hibernate
- Remova os JARs Hibernate das pastas da biblioteca do seu aplicativo.
- Remova ou converta em comentário o elemento
<hibernate.transaction.manager_lookup_class>
no seu arquivopersistence.xml
, já que este elemento não é necessário.
3.1.6.5. Atualização da Configuração do Adaptador de Recurso
Nas versões anteriores do servidor do aplicativo, a configuração do adaptador de recursos era definida em um arquivo com um sufixo *-ds.xml
. No JBoss EAP 6, um adaptador de recursos é configurado no arquivo de configuração do servidor. Se estiver executando em um domínio gerenciado, o arquivo de configuração é o arquivo EAP_HOME/domain/configuration/domain.xml
. Se estiver executando em um servidor autônomo, configure o adaptador de recursos no arquivo EAP_HOME/standalone/configuration/standalone.xml
. A informação de referência do esquema, que é a mesma para ambos os módulos, pode ser encontrada sob Schemas no site do IronJacamar aqui: http://www.ironjacamar.org/documentation.html.
Importante
As informações do descritor do adaptador de recursos estão definidas sob o elemento do subsistema a seguir no arquivo de configuração do servidor:
<subsystem xmlns="urn:jboss:domain:resource-adapters:1.1"/>Algumas das mesmas informações que foram definidas anteriormente no arquivo
*-ds.xml
do adaptador de recursos serão usadas.
<resource-adapters> <resource-adapter> <archive>multiple-full.rar</archive> <config-property name="Name">ResourceAdapterValue</config-property> <transaction-support>NoTransaction</transaction-support> <connection-definitions> <connection-definition class-name="org.jboss.jca.test.deployers.spec.rars.multiple.MultipleManagedConnectionFactory1" enabled="true" jndi-name="java:/eis/MultipleConnectionFactory1" pool-name="MultipleConnectionFactory1"> <config-property name="Name">MultipleConnectionFactory1Value</config-property> </connection-definition> <connection-definition class-name="org.jboss.jca.test.deployers.spec.rars.multiple.MultipleManagedConnectionFactory2" enabled="true" jndi-name="java:/eis/MultipleConnectionFactory2" pool-name="MultipleConnectionFactory2"> <config-property name="Name">MultipleConnectionFactory2Value</config-property> </connection-definition> </connection-definitions> <admin-objects> <admin-object class-name="org.jboss.jca.test.deployers.spec.rars.multiple.MultipleAdminObject1Impl" jndi-name="java:/eis/MultipleAdminObject1"> <config-property name="Name">MultipleAdminObject1Value</config-property> </admin-object> <admin-object class-name="org.jboss.jca.test.deployers.spec.rars.multiple.MultipleAdminObject2Impl" jndi-name="java:/eis/MultipleAdminObject2"> <config-property name="Name">MultipleAdminObject2Value</config-property> </admin-object> </admin-objects> </resource-adapter> </resource-adapters>
3.1.7. Alterações de Segurança
3.1.7.1. Configuração das Alterações de Segurança do Aplicativo
Nas versões anteriores do JBoss EAP, os arquivos de propriedades localizados no diretório EAP_HOME/server/SERVER_NAME/conf/
estavam no caminho de classe e poderiam ser facilmente encontrados pelo UsersRolesLoginModule
. No JBoss EAP 6, a estrutura do diretório foi alterada. Os arquivos de propriedades devem ser empacotados dentro do aplicativo para disponibilizá-los no caminho de classe.
Importante
security-domains
para standalone/configuration/standalone.xml
ou o arquivo de configuração do servidor domain/configuration/domain.xml
:
<security-domain name="example"> <authentication> <login-module code="UsersRoles" flag="required"> <module-option name="usersProperties" value="${jboss.server.config.dir}/example-users.properties"/> <module-option name="rolesProperties" value="${jboss.server.config.dir}/example-roles.properties"/> </login-module> </authentication> </security-domain>
${jboss.server.config.dir}
refere-se ao diretório EAP_HOME/standalone/configuration/
. Se a instância estiver executando em um domínio gerenciado, ${jboss.server.config.dir}
refere-se ao diretório EAP_HOME/domain/configuration/
.
No JBoss EAP 6, os domínios de segurança não usam mais o prefixo java:/jaas/
nos seus nomes.
- Para os aplicativos Web, você deve remover este prefixo das configurações do domínio de segurança em
jboss-web.xml
. - Para os aplicativos Empresariais (Enterprise), você deve remover este prefixo das configurações do domínio de segurança no arquivo
jboss-ejb3.xml
. Esse arquivo substituiujboss.xml
no JBoss EAP 6.
3.1.7.2. Atualização dos Aplicativos que Utilizam PicketLink STS e dos Serviços Web
Se o seu aplicativo JBoss EAP 6.1 usa PicketLink STS e serviços Web, você pode precisar de fazer alterações quando migrar para o JBoss EAP 6.2 ou versões mais recentes. Uma correção aplicada ao JBoss EAP para solucionar CVE-2013-2133 reforça as verificações de autorização pelo contêiner antes da execução de quaisquer manipuladores JAXWS anexos aos pontos de extremidade WS baseados em EJB3. Consequentemente, algumas das funcionalidades do PicketLink podem ser afetadas já que o PicketLink SAML2Handler
estabelece uma entidade de segurança que deve ser utilizada mais tarde no processo. Pode ser que você encontre NullPointerException
no log do servidor já que a entidade é NULL
quando HandlerAuthInterceptor
acessa SAML2Handler
. Esta verificação de segurança deve ser desabilitada para a correção deste problema.
Procedimento 3.11. Desabilitação das Verificações de Autorização Adicionais
- Você pode desabilitar as verificações de autorização adicionais e continuar usando as implantações PicktLink existentes usando um dos seguintes métodos.
Definição de uma Propriedade em Todo o Sistema
As verificações de autorização adicionais podem ser desabilitadas ao nível do servidor definindo o valor da propriedade do sistemaorg.jboss.ws.cxf.disableHandlerAuthChecks
paratrue
. Este método afeta qualquer implantação realizada ao servidor do aplicativo.Consulte o tópico entitulado Configure System Properties Using the Management CLI no guia Administration and Configuration Guide do JBoss EAP para mais informações sobre como definir uma propriedade de sistema.Criação de uma Propriedade no Arquivo de Descritor de Serviços Web da Implantação
As verificações de autorização adicionais podem ser desabilitadas ao nível da implantação definindo o valor da propriedadeorg.jboss.ws.cxf.disableHandlerAuthChecks
paratrue
no arquivojboss-webservices.xml
. Este método impacta somente a implantação específica.- Crie um arquivo
jboss-webservices.xml
no diretórioMETA-INF/
da implantação que deseja desabilitar as verificações da autorização adicionais. - Adicione o seguinte conteúdo:
<?xml version="1.1" encoding="UTF-8"?> <webservices xmlns="http://www.jboss.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.2" xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee"> <property> <name>org.jboss.ws.cxf.disableHandlerAuthChecks</name> <value>true</value> </property> </webservices>
Nota
org.jboss.ws.cxf.disableHandlerAuthChecks
renderiza um sistema vulnerável ao CVE-2013-2133. Se o aplicativo espera que as restrições de segurança declaradas nos métodos EJB sejam aplicadas e não as aplica de maneira independente ao manipulador JAX-WS, então a propriedade não deve ser habilitada. A propriedade deve ser apenas usada para fins de compatibilidade com versões anteriores, quando precisa-se evitar a interrupção do aplicativo.
3.1.8. Alterações JNDI
3.1.8.1. Atualização dos Nomes do Namespace JNDI do Aplicativo
O EJB 3.1 introduziu um namespace JNDI global padronizado e uma série de namespaces relacionados que mapeiam vários escopos do aplicativo Java EE. Os nomes EJB Portáteis estão vinculados a apenas três deles: java:global
, java:module
e java:app
. Os aplicativos com EJBs que usam o JNDI devem ser alterados para seguirem a nova convenção padronizada do JNDI namespace.
Procedimento 3.12. Modificação das pesquisas JNDI
- Saiba mais Seção 3.1.8.2, “Nomes JNDI EJB Portáteis ”
Exemplos de namespaces JNDI em versões anteriores e de como são especificados no JBoss EAP 6 podem ser encontrados aqui: Seção 3.1.8.5, “Exemplos de Namespaces JNDI em Versões Anteriores e a Maneira Como São Especificados no JBoss EAP 6”
3.1.8.2. Nomes JNDI EJB Portáteis
A especificação Java EE 6 define quatro namespaces lógicos, cada um com o seu próprio escopo. No entanto, os nomes EJB portáteis estão vinculados a apenas três deles. A tabela a seguir mostra detalhes de quando e como usar cada namespace.
Namespace JNDI | Descrição |
---|---|
java:global |
Os nomes neste namespace são compartilhados por todos os aplicativos implantados em uma instância do servidor do aplicativo. Use nomes neste namespace para encontrar os arquivos EJBs externos implantados no mesmo servidor.
Exemplo de um namespace java:global:
java:global/jboss-seam-booking/jboss-seam-booking-jar/HotelBookingAction
|
java:module |
Os nomes neste namespace são compartilhados por todos os componentes em um módulo, por exemplo, todos os beans enterprise em um módulo EJB único ou todos os componentes em um módulo web.
Exemplo de um namespace java:module:
java:module/HotelBookingAction!org.jboss.seam.example.booking.HotelBooking
|
java:app |
Os nomes neste namespace são compartilhados por todos os componentes em um único aplicativo. Por exemplo, um arquivo jar EJB e um WAR no mesmo arquivo EAR teriam acesso aos recursos no namespace java:app.
Exemplo de um namespace java:app:
java:app/jboss-seam-booking-jar/HotelBookingAction
|
3.1.8.3. Revisão das Regras do Namespace JNDI
O JBoss EAP 6 aprimorou os nomes do namespace JNDI, não apenas para fornecer regras consistentes e previsíveis para cada nome vinculado ao servidor do aplicativo, mas também para evitar problemas futuros de compatibilidade. Isto significa que você pode vir a ter problemas com os namespaces atuais no seu aplicativo, caso eles não sigam as novas regras.
- Os nomes relativos não qualificados, como
DefaultDS
oujdbc/DefaultDS
, devem ser qualificados relativos ajava:comp/env
,java:module/env
oujava:jboss/env
, dependendo do contexto. - Os nomes
absolute
não qualificados, como/jdbc/DefaultDS
, devem ser qualificados relativos a um nomejava:jboss/root
. - Os nomes
absolute
qualificados, comojava:/jdbc/DefaultDS
, devem ser qualificados da mesma forma que os nomesabsolute
não qualificados acima. - O namespace
java:jboss
especial é compartilhado por toda a instância do servidor AS. - Qualquer nome
relative
com um prefixojava:
deve estar em um dos cinco namespaces:comp
,module
,app
,global
ou o proprietáriojboss
. Qualquer nome começando comjava:xxx
, onde xxx não coincide com nenhum dos cinco acima, resultaria em um erro de nome inválido.
3.1.8.4. Modificação do Aplicativo para Seguir as Novas Regras do Namespace JNDI
- Segue abaixo um exemplo de um pesquisa JNDI no JBoss EAP 5.1. Este código é geralmente encontrado em um método de inicialização.
private ProductManager productManager; try { context = new InitialContext(); productManager = (ProductManager) context.lookup("OrderManagerApp/ProductManagerBean/local"); } catch(Exception lookupError) { throw new ServletException("Unable to find the ProductManager bean", lookupError); }
Observe que o nome de pesquisa éOrderManagerApp/ProductManagerBean/local
. - Segue abaixo um exemplo de como a mesma pesquisa seria codificada no JBoss EAP 6, usando injeção de dependência.
@EJB(lookup="java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager") private ProductManager productManager;
Os valores de pesquisa são agora definidos como variáveis de membro e usam o novo nomejava:app
do namespace JNDI portátiljava:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager
. - Caso prefira não usar a injeção de dependência, você pode continuar a criar o novo InitialContext, conforme acima, e a modificar a busca para usar o novo nome do namespace JNDI.
private ProductManager productManager; try { context = new InitialContext(); productManager = (ProductManager) context.lookup("java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager"); } catch(Exception lookupError) { throw new ServletException("Unable to find the ProductManager bean", lookupError); }
3.1.8.5. Exemplos de Namespaces JNDI em Versões Anteriores e a Maneira Como São Especificados no JBoss EAP 6
Namespace no JBoss EAP 5.x | Namespace no JBoss EAP 6 | Comentários Adicionais |
---|---|---|
OrderManagerApp/ProductManagerBean/local | java:module/ProductManagerBean!services.ejb.ProductManager | Associação padrão Java EE 6. Com escopo para o módulo atual e acessível somente dentro do mesmo módulo. |
OrderManagerApp/ProductManagerBean/local | java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager | Associação padrão Java EE 6. Com escopo para o aplicativo atual e acessível somente dentro do mesmo aplicativo. |
OrderManagerApp/ProductManagerBean/local | java:global/OrderManagerApp/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager | Associação padrão Java EE 6. Com escopo para o servidor do aplicativo e acessível globalmente. |
java:comp/UserTransaction | java:comp/UserTransaction | O namespace tem como escopo o componente atual. Não é acessível para threads que não são Java EE 6, por exemplo, os threads criados diretamente pelo seu aplicativo. |
java:comp/UserTransaction | java:jboss/UserTransaction | Acessível globalmente. Use este, caso java:comp/UserTransaction não esteja disponível. |
java:/TransactionManager | java:jboss/TransactionManager | |
java:/TransactionSynchronizationRegistry | java:jboss/TransactionSynchronizationRegistry |
3.1.9. Mapeamento dos Atributos dos Conectores HTTP/HTTPS/AJP
3.1.9.1. Mapeamento dos Atributos dos Conectores HTTP/HTTPS/AJP
Nome do Atributo na Versão Anterior | Equivalente ao JBoss EAP 6 | Detalhes |
---|---|---|
maxThreads | max-connections | Este atributo dimensiona o pool de conexões/threads do JBossWeb. Ele é definido nos conectores no subsistema web. O padrão é 512 por núcleo da CPU.
<connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http" enabled="true" max-connections="200" /> |
minSpareThreads
maxSpareThreads
| N/D | Não há um equivalente para minSpareThreads ou maxSpareThreads já que há pouco incentivo para a recuperação de threads. Caso use um executor para o conector, ao invés do pool de thread do operador padrão, a coisa mais próxima disto seria o tamanho core-threads e os atributos keepalive-time . |
proxyName
proxyPort
|
proxy-name
proxy-port
| Este atributo é definido no conector no subsistema web .
<connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http" enabled="true" proxy-name="proxy.com" proxy-port="80"/> |
redirectPort
|
redirect-port
|
Este atributo é definido no
conector no subsistema web .
connector name="http" protocol="HTTP/1.1" scheme="https" secure="true" socket-binding="http" redirect-port="8443" proxy-name="loadbalancer.hostname.com" proxy-port="443" |
enableLookups
|
enable-lookups
|
Este atributo é definido no
conector no subsistema web .
<connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http" enable-lookups="true"/>" |
MaxHttpHeaderSize
| Propriedade do Sistema | Este atributo é definido usando as Propriedades do Sistema. O valor padrão é 8 KB.
<system-properties> <property name="org.apache.coyote.http11.Http11Protocol.MAX_HEADER_SIZE" value="8192"/> </system-properties> |
maxKeepAliveRequests
| Propriedade do Sistema | Este atributo é definido usando as Propriedades do Sistema.
<system-properties> <property name="org.apache.coyote.http11.Http11Protocol.MAX_KEEP_ALIVE_REQUESTS" value="1"/> </system-properties> |
connectionTimeout
| Propriedade do Sistema | Este atributo é definido usando as Propriedades do Sistema. As configurações a seguir definem AJP connectionTimeout para 600000 milissegundos (10 minutos) e HTTP connectionTimeout para 120000 milissegundos (2 minutos).
<system-properties> <!-- connectionTimeout for AJP connector. Default value is "-1" (no timeout). --> <property name="org.apache.coyote.ajp.DEFAULT_CONNECTION_TIMEOUT" value="600000"/> <!-- connectionTimeout for HTTP connector. Default value is "60000". --> <property name="org.apache.coyote.http11.DEFAULT_CONNECTION_TIMEOUT" value="120000"/> </system-properties> |
compactação
| Propriedade do Sistema | Este atributo habilita compactação. Você pode especificar o tipo de conteúdo, cujo padrão é text/html,text/xml,text/plain . Você também pode especificar o tamanho mínimo do conteúdo a ser compactado, cujo padrão é 2048 bytes. A compactação é definida usando as Propriedades do Sistema.
<system-properties> <property name="org.apache.coyote.http11.Http11Protocol.COMPRESSION" value="on"/> <property name="org.apache.coyote.http11.Http11Protocol.COMPRESSION_MIN_SIZE" value="4096"/> <property name="org.apache.coyote.http11.Http11Protocol.COMPRESSION_MIME_TYPES" value="text/javascript,text/css,text/html"/> </system-properties> |
URIEncoding
| Propriedade do Sistema | Este atributo é definido usando as Propriedades do Sistema.
<system-properties> <property name="org.apache.catalina.connector.URI_ENCODING" value="UTF-8"/> </system-properties> |
useBodyEncodingForURI
| Propriedade do Sistema | Este atributo é definido usando as Propriedades do Sistema.
<system-properties> <property name="org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING" value="true"/> </system-properties> |
servidor
| Propriedade do Sistema | Este atributo é definido usando as Propriedades do Sistema.
<system-properties> <property name="org.apache.coyote.http11.Http11Protocol.SERVER" value="NewServerHeader"/> </system-properties> |
allowTrace
| Propriedade do Sistema | Este atributo é definido usando as Propriedades do Sistema.
<system-properties> <property name="org.apache.catalina.connector.ALLOW_TRACE " value="true"/> </system-properties> |
xpoweredby
| Propriedade do Sistema | Este atributo é definido usando as Propriedades do Sistema.
<system-properties> <property name="org.apache.catalina.connector.X_POWERED_BY " value="true"/> </system-properties> |
keepAliveTimeout
| N/D |
Antes do JBoss 6.4, não havia um parâmetro equivalente no JBoss EAP 6. Internamente, foi padronizado para o valor
connectionTimeout .
No JBoss EAP 6.4, uma nova propriedade de sistema,
org.apache.coyote.http11.DEFAULT_KEEP_ALIVE_TIMEOUT , foi introduzida para controlar o keepAliveTimeout. O argumento -Dorg.apache.coyote.http11.DEFAULT_KEEP_ALIVE_TIMEOUT passa a fazer efeito quando usado com o argumento -Dorg.apache.coyote.http11.DEFAULT_DISABLE_UPLOAD_TIMEOUT=true .
|
disableUploadTimeout
connectionUploadTimeout
| N/D |
Atualmente, não há parâmetros equivalentes no JBoss EAP 6. O
disableUploadTimeout é verdadeiro por padrão e o connectionUploadTimeout usa internamente o valor connectionTimeout .
|
packetSize
| Propriedade do Sistema | Este atributo é definido usando as Propriedades do Sistema. As configurações a seguir definem AJP packetSize para 20000
<system-properties> <property name="org.apache.coyote.ajp.MAX_PACKET_SIZE" value="20000"/> </system-properties> |
maxPostSize
maxSavePostSize
|
max-post-size
max-save-post-size
| Um valor de 0 significa ilimitado. Observe que este parâmetro pode limitar o tamanho dos dados apenas quando Content-Type é application/x-www-form-urlencoded . Para mais informações, consulte esta solução no Portal do Consumidor: How to limit data size of HTTP POST method from a client to JBoss |
tomcatAuthentication
| Propriedade do Sistema |
Dependendo da versão do JBoss EAP 6, este atributo é definido usando a Propriedade de Sistema
org.apache.coyote.ajp.AprProcessor.TOMCATAUTHENTICATION ou org.apache.coyote.ajp.DEFAULT_TOMCAT_AUTHENTICATION . É necessário corrigir ou atualizar todas as versões do servidor.
No JBoss EAP 6.0.1, tomcatAuthentication é configurado usando a seguinte propriedade.
<system-properties> <property name="org.apache.coyote.ajp.AprProcessor.TOMCATAUTHENTICATION" value="false"/> </system-properties>
No JBoss EAP 6.1 e nas versões mais recentes, tomcatAuthentication é configurado usando a seguinte propriedade.
<system-properties> <property name="org.apache.coyote.ajp.DEFAULT_TOMCAT_AUTHENTICATION" value="false"/> </system-properties>
Para mais informações, consulte esta solução no Portal do Consumidor How to configure tomcatAuthentication in JBoss EAP 6
|