Isolamento de ClassLoader por EAR no JBoss

Um relato sobre uma dificuldade encontrada com o JBoss, versão 4.2.3.GA para JDK1.6, relacionado ao isolamento de ClassLoader por EAR.

Relato abaixo uma dificuldade encontrada com o JBoss, versão 4.2.3.GA para JDK1.6, relacionado ao isolamento do ClassLoader por EAR.

É realmente estranho o parâmetro de configuração de deploy Isolated do arquivo \deploy\ear-deployer.xml ser false como default. Isso faz com que o ClassLoader do JBoss carregue uma única vez uma determinada classe presente em um módulo Java (Utility JAR) de um determinado EAR. Se outro EAR contiver aquela mesma classe, mesmo que em outra versão, o JBoss ignorará completamente esta. Na prática, é como se a primeira classe carregada pelo JBoss se tornasse globalizada para todas as aplicações. Ainda bem que isso é configurável… Mas demoramos um pouco para descobrir.

No meu fraco entendimento do assunto, nem deveria haver este parâmetro. Mas já que ele existe, sinceramente gostaria de ouvir uma explicação plausível do porque Isolated=false é default .

Para um melhor entendimento do assunto, encontrei os seguintes endereços:

http://community.jboss.org/wiki/ClassLoadingConfiguration (procure por EARDeployer nesta página)

http://stackoverflow.com/questions/1139367/deploying-multiple-versions-of-same-ejbs-and-classes-to-same-jboss-server (2º resposta à pergunta)

À procura de um “part-time” Java

À procura de um “part-time” Java

Atualmente estou me programando para trabalhar como freelancer por algum tempo. O perfil de projeto que estou procurando deverá ser, necessariamente, em Java para a Web. Posso atuar somente com Arquitetura (7 anos) e/ou Análise-Desenvolvimento (10 anos).

Em meu último trabalho como freelancer atuei como Arquiteto-Desenvolvedor para o Projeto Time to Talk Cardio. Construí um Framework sob a Plataforma Java 6, o qual denominei JAgile. Foram utilizados os frameworks Struts e Hibernate, banco de dados MySQL e o Tomat Web Server.

  • Leia mais sobre minha experiência com a linguagem de programação Java clicando aqui
  • Se desejar entrar em contato, clique aqui.

Galeria de fotos

Uma pequena demonstração da minha futura página de álbuns, usando o plugin FLAGallery.

Abaixo uma demonstração da minha página de álbuns, que pretendo criar. Só gostaria de saber como criar permissão de visualização para esta página. Alguém sabe?

[flagallery gid=1 name=”Gallery” stylishgrey]

Gostou deste slideshow? Trata-se de um plugin do WordPress chamado FLAGallery (Flash Album Gallery). Existem ainda skinks gratuitos disponíveis, os quais podem ser encontrados em http://photogallerycreator.com

WTP Eclipse Plugin x JBoss

Um caminho simples para publicar EarProjects ou WarProjects utilizando o WTP incluso no Eclipse Ganymede e servidor de aplicação JBoss4.2.3.GA

Visto que não encontrei na Internet nenhum ant build modificado do WebTools para publicações no JBoss, de maneira a “explodir” um EAR ou WAR no servidor de aplicação, resolvi eu mesmo modificar o arquivo server323.xml padrão. Abaixo descrevo a solução.

A solução abaixo foi testada com a versão do WTP inclusa no Eclipse Ganymede e servidor de aplicação JBoss 4.2.3.GA.

1) Baixe os arquivos ant-contrib-0.6.jar e ant4eclipse-0.5.0.rc1.jar

2) Prepare o runtime do Apache ANT no workspace do Eclipse:

No workspace do Eclipse, vá em “Windows –> Preferences –> Ant –> Runtime –> Global Entries –> Add JARs” e referencie as duas bibliotecas acima (1).

3) Se você não tiver esse projeto (LibraryANT), crie a seguinte classe Java:

—————————————————————-

WebModulesTask.java

/**
* @author leonardop
* 14/10/2009
*/
public class WebModulesTask extends Task {
private String ear;
private String webModules;

public static class WarFilenameFilter implements FilenameFilter {
/**
* Method overridden accept
* @see java.io.FilenameFilter#accept(java.io.File, java.lang.String)
*/
public boolean accept(File dir, String name) {
return name != null && name.endsWith(“.war”);
}
}

/**
* Constructor of WebModulesTask
*/
public WebModulesTask() {
super();
}

/**
* Method getWebModulesDiscovered
* @return String
*/
private String getWebModulesDiscovered() {
System.out.println(“this.ear = ” + this.ear);
StringBuffer sbWebModules = new StringBuffer();
File file = new File(this.ear);
if (file.isDirectory()) {
File[] warFiles = file.listFiles(new WarFilenameFilter());
for (int index = 0; index < warFiles.length; index++) {
String warFilename = warFiles[index].getName();
sbWebModules.append(warFilename.substring(0, warFilename.lastIndexOf(‘.’)));
if (index + 1 < warFiles.length)
sbWebModules.append(‘,’);
}
}
else {
System.out.println(“NÃO É UM DIRETÓRIO!!”);
// TODO extract ear file
}
return sbWebModules.toString();
}

/**
* Method overridden execute
* @see org.apache.tools.ant.Task#execute()
*/
public void execute() throws BuildException {
super.getProject().setProperty(this.webModules, this.getWebModulesDiscovered());
}

/**
* Method getEar
* @return Returns the ear.
*/
public String getEar() {
return this.ear;
}

/**
* Method setEar
* @param ear The ear to set.
*/
public void setEar(String ear) {
this.ear = ear;
}

/**
* Method getWebModules
* @return Returns the webModules.
*/
public String getWebModules() {
return this.webModules;
}

/**
* Method setWebModules
* @param webModules The webModules to set.
*/
public void setWebModules(String webModules) {
this.webModules = webModules;
}
}

—————————————————————-

4) Agora crie um arquivo  jee_antlib.xml, no diretório root de fontes Java do projeto onde está a classe Java acima. Este arquivo deve ter seguinte conteúdo:

—————————————————————-

<?xml version=”1.0″?>
<antlib>
<typedef name=”getWebModules” classname=”package.WebModulesTask” />
</antlib>

—————————————————————-

5) Seguindo o mesmo passo (2), adicione o projeto Java criado, o qual contém a classe Java acima, assim como o antlib.xml

6) Criar e editar o arquivo abaixo:

/eclipse/plugins/org.eclipse.jst.server.generic.jboss_1.5.206.v20090115/buildfiles/jboss42exploded.xml

——————————————————————

<project name=”deployextension” default=”deploy.j2ee.web” basedir=”.”>
<property name=”pause.deploy” value=”10″ />
<property name=”pause.undeploy” value=”5″ />

<!– declare ant4eclipse –>
<taskdef resource=”net/sf/ant4eclipse/antlib.xml” />
<!– optional: declare ant-contrib –>
<taskdef resource=”net/sf/antcontrib/antlib.xml” />
<!– declare antlib –>
<taskdef resource=”jee_antlib.xml” />

<!– PACKED EAR (DEFAULT)
<target name=”deploy.j2ee.ear”>
<jar destfile=”${project.working.dir}/${module.name}.ear”>
<zipfileset dir=”${module.dir}”>
<include name=”**/*.*”/>
<exclude name=”**/*.java”/>
</zipfileset>
</jar>
<move file=”${project.working.dir}/${module.name}.ear” todir=”${server.publish.dir}”/>
<sleep seconds=”${pause.deploy}”/>
</target>
–>
<!– EXPLODED EAR –>
<target name=”deploy.j2ee.ear”>
<echo>Copiando ${module.dir} em ${server.publish.dir}/${module.name}.ear</echo>
<copy todir=”${server.publish.dir}/${module.name}.ear”>
<fileset dir=”${module.dir}”>
<include name=”**/*.*” />
<exclude name=”**/*.war” />
</fileset>
</copy>
<echo>Buscando módulos web…</echo>
<getWebModules ear=”${module.dir}” webmodules=”webModulesProperty” />
<foreach list=”${webModulesProperty}” target=”deploy.j2ee.ear.webModule” param=”webModule.name” trim=”yes” inheritall=”true” />
<sleep seconds=”${pause.deploy}” />
</target>
<target name=”deploy.j2ee.ear.webModule”>
<echo>Copiando ${project.working.dir}/${webModule.name} em ${server.publish.dir}/${module.name}.ear/${webModule.name}.war</echo>
<copy todir=”${server.publish.dir}/${module.name}.ear/${webModule.name}.war”>
<fileset dir=”${project.working.dir}/${webModule.name}”>
<include name=”**/*.*” />
</fileset>
</copy>
</target>

<!– PACKED WAR (DEFAULT)
<target name=”deploy.j2ee.web”>
<jar destfile=”${project.working.dir}/${module.name}.war”>
<zipfileset dir=”${module.dir}”>
<include name=”**/*.*”/>
<exclude name=”**/*.war”/>
</zipfileset>
</jar>
<move file=”${project.working.dir}/${module.name}.war” todir=”${server.publish.dir}”/>
<sleep seconds=”${pause.deploy}”/>
</target>
–>
<!– EXPLODED WAR –>
<target name=”deploy.j2ee.web”>
<copy todir=”${server.publish.dir}/${module.name}.war”>
<fileset dir=”${module.dir}”>
<include name=”**/*.*” />
<exclude name=”**/*.war” />
</fileset>
</copy>
<sleep seconds=”${pause.deploy}” />
</target>

<target name=”deploy.j2ee.ejb”>
<jar destfile=”${project.working.dir}/${module.name}.jar”>
<zipfileset dir=”${module.dir}”>
<include name=”**/*.*” />
<exclude name=”**/*.java” />
</zipfileset>
</jar>
<move file=”${project.working.dir}/${module.name}.jar” todir=”${server.publish.dir}” />
<sleep seconds=”${pause.deploy}” />
</target>

<!– PACKED WAR (DEFAULT)
<target name=”undeploy.j2ee.web”>
<delete file=”${server.publish.dir}/${module.name}.war” failonerror=”false” />
<sleep seconds=”${pause.undeploy}” />
</target>
–>
<target name=”undeploy.j2ee.web”>
<delete dir=”${server.publish.dir}/${module.name}.war” failonerror=”false” />
<sleep seconds=”${pause.undeploy}” />
</target>

<target name=”undeploy.j2ee.ejb”>
<delete file=”${server.publish.dir}/${module.name}.jar” failonerror=”false” />
<sleep seconds=”${pause.undeploy}” />
</target>

<!– PACKED EAR (DEFAULT)
<target name=”undeploy.j2ee.ear”>
<delete file=”${server.publish.dir}/${module.name}.ear” failonerror=”false”>
</delete>
<sleep seconds=”${pause.undeploy}” />
</target>
–>
<target name=”undeploy.j2ee.ear”>
<delete dir=”${server.publish.dir}/${module.name}.ear” failonerror=”false” />
<sleep seconds=”${pause.undeploy}” />
</target>

</project>

——————————————————————

7) Editar o arquivo:

/eclipse/plugins/org.eclipse.jst.server.generic.jboss_1.5.206.v20090115/servers/jboss42.serverdef

Substitua, dentro do arquivo, a referência do arquivo jboss323.xml por jboss42exploded.xml, conforme abaixo:

—————————————–

<publisherdata>
<dataname>build.file</dataname>
<datavalue>/buildfiles/jboss42exploded.xml</datavalue>
</publisherdata>

—————————————–

8) Reinicie o Eclipse e parta para o abraço! 🙂

NOTA IMPORTANTE: Como é característica do JBoss, sempre que um EAR é publicado “explodido” no diretório /JBOSS_DIST/server/default/deploy, necessariamente a instância default deverá ser reiniciada. Para rápidas atualizações dos recursos web (html, js, imagens, jsp, css, etc), crie um ant-build simples que copie somente os arquivos alterados para o respectivo WAR “explodido” no servidor. Qualquer dúvida estou à disposição.

Leonardo Pereira