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.

Deixe um comentário

Leonardo Pereira