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

As alterações de configuração e carregamento de classe no JBoss EAP 6 irão impactar quase todos os aplicativos. O JBoss EAP 6 também usa uma nova sintaxe de nomeação JNDI portátil padrão. Essas alterações irão impactar a maioria dos aplicativos por isso, sugere-se que, antes de migrar o seu aplicativo, você revise as seguintes informações primeiro:

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

O carregamento de classe modular trata-se de uma mudança significativa no JBoss EAP 6 e irá impactar quase todos os aplicativos. Revise as informações a seguir antes de migrar o seu aplicativo.
  1. 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”
  2. 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”
  3. 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

Sumário

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

  1. 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, como javax.api e sun.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/.
  2. 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 como ClassNotFoundExceptions ou NoClassDefFoundErrors 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 como ClassCastExceptions no servidor do log. Para especificar as dependências explicitamente, modifique o MANIFEST.MF ou crie um arquivo de descritor de implantação específico do JBoss jboss-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

Sumário

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/.

Tarefas

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

Sumário

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/.

Os seguintes arquivos são usados para controlar o carregamento de classe no JBoss EAP 6:
jboss-web.xml
Caso tenha definido um elemento <class-loading> no arquivo jboss-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 arquivo jboss-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 exemplo MANIFEST.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 arquivo MANIFEST.MF. Se o seu aplicativo usar o EJB 3.0, você pode encontrar uma seção no arquivo pom.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 usar org.apache.commons.log, você precisará da dependência no arquivo MANIFEST.MF. Para gerar essa dependência, adicione o elemento <plugin> ao arquivo pom.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 arquivo src/main/resources/META-INF/MANIFEST.MF precisa conter apenas a entrada da dependência:
Dependencies: org.apache.commons.logging
O Maven gerará o arquivo MANIFEST.MF completo:
Manifest-Version: 1.0
Dependencies: org.apache.commons.logging
jboss-deployment-structure.xml
Esse arquivo é um descritor de implantação específico do JBoss que pode ser usado para controlar o carregamento 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 arquivo jboss-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> no application.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 um myBeans.jar e um myApp.war que são empacotados dentro de um myApp.ear. Um servlet no myApp.war usa uma anotação @EJB para injetar um bean a partir do myBeans.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á no myBeans.jar e será necessário impor que os componentes no myBeans.jar sejam inicializados e ativados antes dos componentes no myApp.war. Para fazer isto, é necessário configurar o elemento <initialize-in-order> para true e especificar a ordem dos módulos myBeans.jar e myApp.war no arquivo application.xml.
Segue abaixo um exemplo que usa o elemento <initialize-in-order> para controlar a ordem de implantação. O myBeans.jar é implantado antes do arquivo myApp.war.
<application xmlns="http://java.sun.com/xml/ns/javaee" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="6"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
             http://java.sun.com/xml/ns/javaee/application_6.xsd">
    <application-name>myApp</application-name>
    <initialize-in-order>true</initialize-in-order>
    <module>
        <ejb>myBeans.jar</ejb>
    </module>
    <module>
        <web>
            <web-uri>myApp.war</web-uri>
            <context-root>myApp</context-root>
        </web>
    </module>
</application>
O esquema para o arquivo application.xml pode ser encontrado no http://java.sun.com/xml/ns/javaee/application_6.xsd.

Nota

Observe que a configuração do elemento <initialize-in-order> para true 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ção jboss.xml substituindo e adicionando os recursos fornecidos pelo descritor de implantação ejb-jar.xml do Java Enterprise Edition (EE). O novo arquivo é incompatível com o jboss.xml, e o jboss.xml é agora ignorado nas implantações.
login-config.xml
O arquivo login-config.xml não é mais usado para a configuração de segurança. A segurança é agora configurada no elemento <security-domain> no arquivo de configuração do servidor. Para um servidor autônomo, o arquivo deve ser standalone/configuration/standalone.xml. Caso esteja executando o seu servidor em um domínio gerenciado, o arquivo deve ser domain/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.
O esquema XML para este descritor de implantação está no 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

Sumário

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.

Para resolver esses erros de carregamento de classe, a estrutura do seu arquivo de aplicativo deve ser modificada ou um módulo personalizado deve ser definido.

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/ ou WEB-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

Sumário

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

  1. Caso esteja implantando um arquivo WAR, essas propriedades devem ser empacotadas na pasta WEB-INF/classes/ do WAR.
  2. 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

O procedimento a seguir descreve como criar um módulo personalizado para disponibilizar arquivos de propriedades e outros recursos a todos os aplicativos sendo executados no servidor do JBoss EAP.

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

  1. Crie e preencha a estrutura do diretório module/.
    1. Crie uma estrutura de diretório sob o diretório EAP_HOME/module para conter os arquivos e JARs. Por exemplo:
      $ cd EAP_HOME/modules/ 
      $ mkdir -p myorg-conf/main/properties
    2. Mova os arquivos de propriedades para o diretório EAP_HOME/modules/myorg-conf/main/properties/ criado na etapa anterior.
    3. Crie um arquivo module.xml no diretório EAP_HOME/modules/myorg-conf/main/ contendo o seguinte XML:
      <module xmlns="urn:jboss:module:1.1" name="myorg-conf">
          <resources>
              <resource-root path="properties"/>
          </resources>
      </module>
  2. Modifique o subsistema ee no arquivo de configuração do servidor. Você pode usar o JBoss CLI ou pode editar manualmente o arquivo.
    • Siga as seguintes etapas para modificar o arquivo de configuração do servidor usando o JBoss CLI.
      1. Inicie o servidor e conecte-se ao Gerenciamento CLI.
        • 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
      2. Para criar o elemento myorg-conf <global-modules> no subsistema ee, digite o seguinte na linha de comando:
        /subsystem=ee:write-attribute(name=global-modules, value=[{"name"=>"myorg-conf","slot"=>"main"}])
        Você deverá ver o seguinte resultado:
        {"outcome" => "success"}
    • Siga essas etapas caso prefira editar manualmente o arquivo de configuração do servidor.
      1. 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.
      2. Encontre o subsistema ee e adicione o módulo global para myorg-conf. Segue um exemplo do elemento do subsistema ee modificado para a inclusão do elemento myorg-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>
  3. 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

Sumário

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.

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

Sumário

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.

Os seguintes procedimentos demonstram como remover o módulo 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

Este procedimento funciona em todas as versões do JBoss EAP 6.

Nota

Já que este método utiliza um arquivo de configuração log4j, você não poderá alterar mais a configuração de registro do log4j durante o tempo de execução.
  1. 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>
    
  2. Posicione o arquivo jboss-deployment-structure.xml no diretório META-INF/ ou no diretório WEB-INF/, caso esteja implantando um WAR. Do contrário, posicione-o no diretório META-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.
  3. Adicione o arquivo log4j.properties ou log4j.xml no diretório lib/ de seu EAR ou no diretório WEB-INF/classes/ de sua implantação WAR. Caso prefira posicionar o arquivo no diretório lib/ de seu WAR, você deve especificar o caminho <resource-root> no arquivo jboss-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>
    
  4. 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
  5. Implante seu aplicativo.

Procedimento 3.6. Configuração das Dependências de Registro para o JBoss EAP 6.3 ou versões posteriores

No JBoss EAP 6.3 e em versões posteriores, você pode usar o novo atributo do sistema de registro 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.
  1. 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
  2. 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
      
  3. 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 como false 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 subsistema logging do arquivo de configuração standalone.xml.
    <subsystem xmlns="urn:jboss:domain:logging:1.4">
        <add-logging-api-dependencies value="false"/>
        ....
    </subsystem>
    
  4. Implante seu aplicativo.

3.1.4.3. Modificação do Código para Uso da Nova Estrutura de Registro do JBoss

Sumário

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

  1. 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);
    }
    
  2. Adição da dependência de registro

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

3.1.5. Alterações do Empacotamento do Aplicativo

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

Sumário

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:

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

Procedimento 3.8. Modificação do empacotamento de arquivos

  1. 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ório WEB-INF/lib/ são tratadas da mesma forma que as classes no diretório WEB-INF/classes.
  2. Empacotamento de um EAR

    Um EAR consiste de módulos múltiplos. O diretório EAR/lib/ é um módulo único e cada WAR ou 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ório EAR/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 subsistema ee, 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

No JBoss EAP 5, os serviços e subsistemas foram configurados em diversos arquivos diferentes. No JBoss EAP 6, a configuração é agora realizada basicamente em um arquivo. Caso o seu aplicativo utilize qualquer um dos seguintes recursos ou serviços, alterações de configuração podem ser necessárias.
  1. Se seu aplicativo usa uma fonte de dados, consulte : Seção 3.1.6.2, “Atualização da Configuração da DataSource”.
  2. 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.
  3. 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”.
  4. 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

Sumário

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.

No JBoss EAP 6, a DataSource é configurada no arquivo de configuração do servidor. Se a instância do JBoss EAP 6 estiver em execução em um domínio gerenciado, a DataSource é configurada no arquivo 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.
A seção seguinte descreve como modificar a configuração da sua DataSource, de forma que ela possa ser gerenciada e suportada pelas ferramentas de gerenciamento disponíveis.
Migração para uma Configuração de DataSource Gerenciável para o JBoss EAP 6

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”.

Se o seu aplicativo usa Hibernate ou JPA, ele pode requerer alterações adicionais. Consulte Seção 3.1.6.4, “Configuração da Fonte de Dados para o Hibernate ou JPA” para mais informações.
Usando a Ferramenta de Migração IronJacamar para Converter os Dados de Configuração

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.

Migração do Código que Realiza Pesquisas de DataSource Remotas

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.

Esta funcionalidade foi removida do JBoss EAP 6 e você pode encontrar 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

Sumário

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

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

No JBoss EAP 6, a fonte de dados é configurada no arquivo de configuração do servidor. Caso a instância do JBoss EAP 6 esteja sendo executada em um domínio gerenciado, a fonte de dados é configurada no arquivo 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

  1. Instalação do Driver JDBC.

    1. 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ório EAP_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 nomeado META-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 caminho META-INF/services/. Esse arquivo deve conter o nome de classe do driver, por exemplo:
        com.mysql.jdbc.Driver
      • Crie um arquivo java.sql.Driver no diretório de implantação. Para uma instância do JBoss 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:
      • 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.
      Os aspectos negativos desta abordagem são:
      • 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/.
    2. 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ório EAP_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 arquivo module.xml para a definição do módulo.
      • Instalação do Driver MySQL JDBC como um módulo principal

        1. Crie uma estrutura de diretório EAP_HOME/modules/com/mysql/main/
        2. No subdiretório main/, crie um arquivo module.xml contendo a seguinte definição do módulo para o 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 nomeado javax.api. Este módulo está localizado sob o diretório modules/system/layers/base/javax/api/main/.

          Nota

          Certifique-se de que você NÃO possua espaço no início do arquivo module.xml ou obterá um erro "Novas dependências ausentes/não satisfatórias" para este driver.
        3. 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.
        1. Crie a estrutura do diretório EAP_HOME/modules/com/ibm/db2/main/.
        2. No subdiretório main/ crie um arquivo module.xml contendo a seguinte definição do módulo para 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 arquivo module.xml ou obterá um erro "Novas dependências ausentes/não satisfatórias" para este driver.
        3. 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.jar EAP_HOME/modules/com/ibm/db2/main/
      Os aspectos positivos 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.
      Os aspectos negativos desta abordagem são:
      • É 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.
  2. Configuração da fonte de dados.

    1. 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 arquivo META-INF/services/java.sql.Driver que especifica o nome de classe do driver. O servidor usa este arquivo para encontrar o nome da(s) classe(s) 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 arquivo META-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>
      
    2. Criação da fonte de dados.

      Crie um elemento <datasource> na seção <datasources> do arquivo standalone.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 arquivo standalone.xml:
      <datasource jndi-name="java:/YourDatasourceName" pool-name="YourDatasourceName">
        <connection-url>jdbc:mysql://localhost:3306/YourApplicationURL</connection-url>
        <driver>mysql-connector-java-5.1.15.jar</driver>
        <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
        <pool>
          <min-pool-size>100</min-pool-size>
          <max-pool-size>200</max-pool-size>
        </pool>
        <security>
          <user-name>USERID</user-name>
          <password>PASSWORD</password>
        </security>
        <statement>
          <prepared-statement-cache-size>100</prepared-statement-cache-size>
          <share-prepared-statements/>
        </statement>
      </datasource>
      
  3. 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

Se o seu aplicativo usa JPA e agrupa atualmente JARs Hibernate, pode ser que você queira usar o Hibernate que está incluído no JBoss EAP 6. Para usar essa versão do Hibernate, você deve remover o pacote antigo do Hibernate do seu aplicativo.

Procedimento 3.10. Remoção do pacote Hibernate

  1. Remova os JARs Hibernate das pastas da biblioteca do seu aplicativo.
  2. Remova ou converta em comentário o elemento <hibernate.transaction.manager_lookup_class> no seu arquivo persistence.xml, já que este elemento não é necessário.

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

Sumário

Nas versões anteriores do servidor do aplicativo, a configuração do adaptador 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

Você deve interromper o servidor antes de editar o arquivo de configuração do servidor para que a sua alteração permaneça ao reiniciar o servidor.
Definição do adaptador de recursos

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.

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

3.1.7. Alterações de Segurança

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

Configuração da segurança para a autenticação básica

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

O servidor deve ser interrompido antes de editar o arquivo de configuração do servidor para que a sua alteração permaneça ao reiniciar o servidor.
Para configurar a segurança para uma autenticação básica, adicione um novo domínio de segurança sob 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>
Se a instância do JBoss EAP 6 estiver executando como um servidor autônomo, ${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/.
Modificação dos nomes do domínio de segurança

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 substituiu jboss.xml no JBoss EAP 6.

3.1.8. Alterações JNDI

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

Sumário

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.

Exemplos de Mapeamentos JNDI

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

Sumário

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.

Tabela 3.1. Namespaces JNDI Portáveis
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
Você pode encontrar mais informações sobre os contextos de nomeação JNDI na seção EE.5.2.2, "Application Component Environment Namespaces" em "JSR 316: JavaTM Platform, Enterprise Edition (Java EE) Specification, v6". Você pode baixar a especificação aqui: http://jcp.org/en/jsr/detail?id=316

3.1.8.3. Revisão das Regras do Namespace JNDI

Sumário

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 namespaces devem seguir as seguintes regras:

  1. Os nomes relativos não qualificados, como DefaultDS ou jdbc/DefaultDS, devem ser qualificados relativos a java:comp/env, java:module/env ou java:jboss/env, dependendo do contexto.
  2. Os nomes absolute não qualificados, como /jdbc/DefaultDS, devem ser qualificados relativos a um nome java:jboss/root.
  3. Os nomes absolute qualificados, como java:/jdbc/DefaultDS, devem ser qualificados da mesma forma que os nomes absolute não qualificados acima.
  4. O namespace java:jboss especial é compartilhado por toda a instância do servidor AS.
  5. Qualquer nome relative com um prefixo java: deve estar em um dos cinco namespaces: comp, module, app, global ou o proprietário jboss. Qualquer nome começando com java: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 nome java:app do namespace JNDI portátil java: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

Tabela 3.2. Tabela de Mapeamento de Namespaces JNDI
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

A tabela a seguir mostra como mapear os atributos dos Conectores HTTP, HTTPS e AJP das versões anteriores para os novos atributos na Red Hat JBoss Enterprise Application Platform 6.
Tabela 3.3. Mapeamento dos Atributos dos Conectores
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
Para mais informações sobre os atributos de conectores, consulte esta solução no Portal do Consumidor: Equivalent HTTP/HTTPS/AJP connector attributes mapping between JBoss EAP 5.x and JBoss EAP 6.x
Red Hat logoGithubRedditYoutubeTwitter

Aprender

Experimente, compre e venda

Comunidades

Sobre a documentação da Red Hat

Ajudamos os usuários da Red Hat a inovar e atingir seus objetivos com nossos produtos e serviços com conteúdo em que podem confiar. Explore nossas atualizações recentes.

Tornando o open source mais inclusivo

A Red Hat está comprometida em substituir a linguagem problemática em nosso código, documentação e propriedades da web. Para mais detalhes veja o Blog da Red Hat.

Sobre a Red Hat

Fornecemos soluções robustas que facilitam o trabalho das empresas em plataformas e ambientes, desde o data center principal até a borda da rede.

© 2024 Red Hat, Inc.