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.