Eclipse – Resolver dependencias con Ant en proyectos de GWT

noviembre 18, 2010

Uno de mis dolores de cabeza con Eclipse, es la resolucion de las dependencias. En Visual Studio cuando agregamos una dependencia a una libreria o proyecto, sus respectivas dll’s son copiadas al directorio de salida -donde queda el ejecutable de la aplicacion o al directorio bin en el caso de aplicaciones web- al momento de compilar. En Eclipse esto no pasa , en realidad, no se como ni si sea posible. Para resolver las dependencias, Eclipse usa el classpath y no tiene problemas a la hora de ejecutar o depurar la aplicacion desde el IDE. Pero cuando intentas copiar (deploy) la aplicacion a un servidor vienen los problemas ya que no se encuentran los JAR’s dependientes en el direcotrio WEB-INF/lib. Para resolverlo basta con exportar cada uno de los JAR’s de los proyectos dependientes en esa carpeta de forma manual. Este procedimiento se vuelve muy tedioso conforme aumenta el numero de dependencias o actualizas los proyectos dependientes frecuentemente.

Como la mayoria de proyectos que genero son de GWT, he creado un script de Ant que copia el directorio war a una carpeta llamada “deployme” y luego resuelve las dependencias recusrivamente generando y copiando los JAR’s necesarios a la carpeta “deployme/WEB-INF/lib”. Una vez hecho esto, con las dependencias resueltas, podemos copiar la carpeta “deployme” al servidor😀
Para ejecutar el script necesitas primero instalar ant4eclipse y ant-contrib, asi como instalar el soporte de scripts de javascript.
La seccion con las etiquetas de “jdtClassPathLibrary” son para que ant4eclipse pueda resolver las librerias de usuario, si no tuvieras ninguna, solo necesitas indicarle como resolver la de “com.google.gwt.eclipse.core.GWT_CONTAINER”

<?xml version="1.0" encoding="UTF-8"?>
<project name="gwt-dependency-build" default="build" basedir="." 
	xmlns:a4e="antlib:org.ant4eclipse" 
	xmlns:ac="antlib:net.sf.antcontrib">

	<property name="web-project" value="MI_PROYECTO_GWT" />
	<property name="workspace" value="${basedir}/.." />

	<a4e:jdtClassPathLibrary name="org.eclipse.jdt.USER_LIBRARY/SmartGwt">
		<fileset dir="/home/vladimir/Projects/Librerias/smartgwt-2.2/" includes="*.jar" />
	</a4e:jdtClassPathLibrary>
	<a4e:jdtClassPathLibrary name="com.google.gwt.eclipse.core.GWT_CONTAINER">
		<fileset dir="/opt/eclipse-helios/plugins/com.google.gwt.eclipse.sdkbundle.2.0.4_2.0.4.v201006301309/gwt-2.0.4/" includes="gwt-user.jar, gwt-dev.jar, gwt-servlet.jar" />
	</a4e:jdtClassPathLibrary>
	<a4e:jdtClassPathLibrary name="org.eclipse.jdt.USER_LIBRARY/GwtCKEditor">
	  <fileset dir="/home/vladimir/Projects/Librerias/ckeditor-gwt" includes="gwt-ckeditor.jar"/>
	</a4e:jdtClassPathLibrary >
	<a4e:jdtClassPathLibrary name="org.eclipse.jdt.USER_LIBRARY/Gson">
	  <fileset dir="/home/vladimir/Projects/Librerias/google-gson-1.4" includes="gson-1.4.jar" />
	</a4e:jdtClassPathLibrary >
	
	<ac:var name="dependencyList" value="" />

	<target name="build">
		<list-projects project="${web-project}" />
		<script language="javascript">
		  <![CDATA[
			importPackage(java.lang, java.util);
			
		    var jars = project.getProperty("dependencyList").split(",");
			var tmp=new ArrayList();
			for(i=0;jars[i]!=null;i++){
				if(!tmp.contains(jars[i])){
					tmp.add(jars[i]);
				}
			}
			var dependencies=tmp.toString();
		    project.setProperty("dependencies", dependencies.substring(1,dependencies.length()-1));
		  ]]>
		  </script> 
		<echo>Dependencies found: ${dependencies}</echo>
		<echo>Copying "war" directory to "deployme"</echo>
		<copy todir="deployme">
			<fileset dir="war" />
		</copy>
		<a4e:getJdtOutputPath workspaceDirectory="${workspace}" projectName="${web-project}" property="web-project-classes-dir" />
		<ac:for list="${dependencies}" param="dependency" trim="true">
			<sequential>
				<a4e:getProjectDirectory workspaceDirectory="${workspace}" projectName="@{dependency}" property="dependency-dir" />
				<a4e:getJdtOutputPath workspaceDirectory="${workspace}" projectName="@{dependency}" property="dependency-classes-dir" />
				<ac:if>
					<not>
						<equals arg1="@{dependency}" arg2="${web-project}" />
					</not>
					<ac:then>
						<echo>Compiling ${dependency-classes-dir} into deployme/WEB-INF/lib/@{dependency}.jar</echo>
						<jar destfile="deployme/WEB-INF/lib/@{dependency}.jar" basedir="${dependency-classes-dir}" />
					</ac:then>
				</ac:if>
				
			</sequential>
		</ac:for>
	</target>

	<macrodef name="list-projects">
		<attribute name="project" />
		<attribute name="prefix" default="recurse" />
		<sequential>
			<a4e:getUsedProjects property="@{prefix}.usedProjects" workspaceDirectory="${basedir}/.." projectName="@{project}" separator="," />
			
			<ac:for param="usedProject" list="${@{prefix}.usedProjects}" delimiter=",">
				<sequential>
					<list-projects project="@@{usedProject}" />
				</sequential>
			</ac:for>
			<ac:if>
				<equals arg1="" arg2="${dependencyList}"/>
				<then><ac:var name="dependencyList" value="@{project}" /></then>
				<else><ac:var name="dependencyList" value="${dependencyList},@{project}" /></else>
			</ac:if>
		</sequential>
	</macrodef>
</project>

Una respuesta to “Eclipse – Resolver dependencias con Ant en proyectos de GWT”


  1. […] (uncompress it).One of my worst headaches is solving project dependency but fortunately I found a way to ease this process. With the migration I moved my files from /home/vladimir to /home/cirovladimir,  my eclipse […]


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: