Gradle - Groovy + Ant + Ivy

10 respostas
X

Gradle é um sistema de build semelhante ao Maven mas com alguns melhoramentos.

Ao usar o Ant para compilar os projetos, era necessário gerenciar dependèncias manualmente, jogando os jars dentro da pasta lib. O Maven com seus repositórios remotos faz download das dependências, mas apesar dessa conveniência, isso só resolve o problema de ter os jars disponíves para o build. Cada dependêcia possui suas próprias dependêcias e muitas vezes dependências diversas usam versões diferentes das mesmas dependências, isso gera um grafo acíclico de dependências e Maven não resolve esse problema, que cai nas mãos do usuário.

Gradle, utiliza o Apache Ivy como gerenciador de dependências(anos-luz a frente do que o Maven faz) que dentre outras coisas monta o gráfo das dependências, resolve conflitos automaticamente, é compatível com repositórios maven incluindo o Archiva.

O maven utiliza plugins para oferecer fucnionalidades extras, isso é bom para necessidas simples, mas para build mais complexos com muitos subprojetos isso pode complicar mais o script. Uma grande vantagem do gradle é a utilização do groovy para definir as tasks e configurações em geral isso unido as tasks e plugins providas pelo Gradle.

Uso o Maven e apesar das pequenas falhas ele faz o serviço, mas achei o Gradle um concorrente com bastante potencial.

Exemplo de um script Gradle:

// -*- coding: utf-8  mode: groovy -*-
ant.property ( file : 'build.properties' )

type = 'war'
group = 'my.project.package'
name = 'projectozzz'
version = '0.1-SNAPSHOT'
url = 'http://porject.com.br/'

usePlugin('war')
sourceCompatibility = 1.6
targetCompatibility = 1.6
groovySrcDirName = 'src/main'
groovyTestSrcDirName = 'src/test'
dependencies {
  addMavenStyleRepo ( 'Maven' , 'http://repo1.maven.org/maven2' , 
				 'http://download.java.net/maven/2'
		    )
  addMavenRepo ( "file://${ System.properties.'user.home' }/.m2/repository" )
  compile ( [
		'org.freemarker:freemarker:2.3.14',
		'com.sun.jersey:jersey-spring:1.0',
		'org.springframework:spring-mock:2.0.8',
		'javax.persistence:persistence-api:1.0.2',
		'cglib:cglib-nodep:2.1_3',
		'log4j:log4j:1.2.14',
		'net.sf.ehcache:ehcache:1.5.0',
		'org.hibernate:hibernate:3.2.6.ga',
		'org.hibernate:hibernate-annotations:3.3.0.ga',
		'org.hibernate:hibernate-commons-annotations:3.3.0.ga',
		'javax.transaction:jta:1.1',
		'org.springframework:spring-core:2.5.6',
		'org.springframework:spring-web:2.5.6',
		'org.springframework:spring-jdbc:2.5.6',
		'org.springframework:spring-orm:2.5.6',
		'org.springframework:spring-aop:2.5.6',
		'org.springframework.security:spring-security-core:2.0.4',
		'org.springframework:spring-beans:2.5.6',
		'org.springframework:spring-context:2.5.6',
		'org.springframework:spring-context-support:2.5.6',
		'org.springframework:spring-tx:2.5.6',
		'org.apache.struts:struts2-core:2.0.11.2',
		'org.apache.struts:struts2-sitemesh-plugin:2.0.11.2',
		'org.apache.struts:struts2-spring-plugin:2.0.11.2',
		'com.opensymphony:xwork:2.0.5',
		'opensymphony:ognl:2.6.11',
		'javax.transaction:jta:1.1',
		'metasolr:metasolr:0.0.2',
		'solr:solr:nightly',
		'solr:solr-commons:nightly',
		'javax.servlet:servlet-api:2.5',
		'javax.servlet:jsp-api:2.0',
		'mysql:mysql-connector-java:5.1.6',
		'opensymphony:sitemesh:2.3',
		'org.dbunit:dbunit:2.2',
		'junit:junit:4.4',
		'commons-dbcp:commons-dbcp:1.2.2',
		'commons-collections:commons-collections:3.2.1',
		'commons-beanutils:commons-beanutils:1.8.0',
		'org.easymock:easymock:2.4',
		'org.springframework:spring-test:2.5.6',
		'jai:jai_core:1.1.3-dr-b01',
		'jai:jai_codec:1.1.3-dr-b01',
		'jai:mlibwrapper_jai:1.1.3-dr-b01',
		'org.springframework:spring-jms:2.5.6',
		'org.apache.activemq:activemq-core:4.1.1',
		'commons-vfs:commons-vfs:1.0',
		'javax.mail:mail:1.4',
		'net.sourceforge.collections:collections-generic:4.01',
		'org.subethamail:subethasmtp-wiser:1.2',
 		'geronimo-spec:geronimo-spec-jms:1.1-rc4',
		'commons-httpclient:commons-httpclient:3.1',
		'commons-dbcp:commons-dbcp:1.2.2',
		'commons-collections:commons-collections:3.2.1',
		'commons-io:commons-io:1.4',
		'commons-logging:commons-logging:1.1.1',
		'commons-fileupload:commons-fileupload:1.2.1',
		'commons-lang:commons-lang:2.4',
		'javax.ws.rs:jsr311-api:1.0',
		'org.openqa.selenium.client-drivers:selenium-java-client-driver:1.0-beta-1'
             ] )

	testRuntime ( [
                 'asm:asm-attrs:2.2.3' ,
                 'jmock:jmock:1.2.0' ,
                 'jmock:jmock-clib:1.2.0' ,
                 'xmlunit:xmlunit:1.2' ,
                 'hsqldb:hsqldb:1.8.0.7' ,
                 ] )

	runtime ( [
	             'org.apache.ant:ant-junit:1.7.1' ,
	             'org.apache.ant:ant-launcher:1.7.1' ,
	             ] )
}

Script do maven correspondente(+/-):

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>my.project</groupId>
	<artifactId>projectzzz</artifactId>
	<packaging>war</packaging>
	<name>Projectzzz</name>
	<version>1.0-SNAPSHOT</version>
	<url>http://project.com.br/</url>
	<build>
		<finalName>project</finalName>
		<extensions>
			<extension>
				<groupId>com.oracle</groupId>
				<artifactId>ojdbc14</artifactId>
				<version>10.2.0.3.0</version>
			</extension>
		</extensions>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-plugin</artifactId>
				<configuration>
					<skip>true</skip>
				</configuration>
			</plugin>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.6</source>
					<target>1.6</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
			<plugin>
				<artifactId>maven-eclipse-plugin</artifactId>
				<configuration>
					<wtpversion>1.0</wtpversion>
				</configuration>
			</plugin>
			<plugin>
				<artifactId>maven-clean-plugin</artifactId>
				<executions>
					<execution>
						<id>auto-clean</id>
						<phase>validate</phase>
						<goals>
							<goal>clean</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
	<repositories>
		<repository>
			<id>repo2</id>
			<name>Repository</name>
			<url>
				http://maverepos2.com.br
			</url>
		</repository>
		<repository>
			<id>mvnsearch</id>
			<name>mvn search</name>
			<url>http://www.mvnsearch.org/maven2</url>
		</repository>
		<repository>
		    <id>spring-milestone</id>
		    <name>Spring Milestone Repository</name>
		    <url>http://s3.amazonaws.com/maven.springframework.org/milestone</url>
		</repository>
	</repositories>
	<pluginRepositories>
		<pluginRepository>
			<id>Codehaus Snapshots</id>
			<url>http://snapshots.repository.codehaus.org/</url>
			<snapshots>
				<enabled>true</enabled>
			</snapshots>
			<releases>
				<enabled>false</enabled>
			</releases>
		</pluginRepository>
	</pluginRepositories>
	<dependencies>

		<dependency>
			<groupId>jai</groupId>
			<artifactId>jai_core</artifactId>
			<version>1.1.3-dr-b01</version>
		</dependency>
		<dependency>
			<groupId>jai</groupId>
			<artifactId>jai_codec</artifactId>
			<version>1.1.3-dr-b01</version>
		</dependency>
		<dependency>
			<groupId>jai</groupId>
			<artifactId>mlibwrapper_jai</artifactId>
			<version>1.1.3-dr-b01</version>
		</dependency>

		<dependency>
			<groupId>net.sf.ehcache</groupId>
		      <artifactId>ehcache</artifactId>     
		      <version>1.5.0</version>

			<exclusions>
				<exclusion>
					<groupId>org.acegisecurity</groupId>
					<artifactId>acegi-security</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-aop</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-collections</groupId>
					<artifactId>commons-collections</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.hibernate</groupId>
					<artifactId>hibernate</artifactId>
				</exclusion>
				<exclusion>
					<groupId>dom4j</groupId>
					<artifactId>dom4j</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-httpclient</groupId>
					<artifactId>commons-httpclient</artifactId>
				</exclusion>
				<exclusion>
				 	<groupId>org.springframework</groupId>
	      			<artifactId>spring-mock</artifactId>     
				</exclusion>
				<exclusion>
				 	<groupId>jgroups</groupId>
	      			<artifactId>jgroups-all</artifactId>     
				</exclusion>
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.servlet</groupId>
					<artifactId>servlet-api</artifactId>
				</exclusion>
				<exclusion>
					<groupId>junit</groupId>
					<artifactId>junit</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate</artifactId>
			<version>3.2.6.ga</version>
			<exclusions>
				<exclusion>
					<groupId>net.sf.ehcache</groupId>
					<artifactId>ehcache</artifactId>
				</exclusion>
				<exclusion>
					<groupId>jaxen</groupId>
					<artifactId>jaxen</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-collections</groupId>
					<artifactId>commons-collections</artifactId>
				</exclusion>
				<exclusion>
					<groupId>c3p0</groupId>
					<artifactId>c3p0</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.transaction</groupId>
					<artifactId>jta</artifactId>
				</exclusion>
	             <exclusion>
                    <groupId>asm</groupId>
                    <artifactId>asm</artifactId>
                </exclusion>
                 <exclusion>
                         <groupId>asm</groupId>
                         <artifactId>asm-attrs</artifactId>
                 </exclusion>              
                 <exclusion>
                         <groupId>cglib</groupId>
                         <artifactId>cglib</artifactId>
                 </exclusion>

				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-annotations</artifactId>
			<version>3.3.0.ga</version>
			<exclusions>
				<exclusion>
					<groupId>org.hibernate</groupId>
					<artifactId>hibernate</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.apache.lucene</groupId>
					<artifactId>lucene-core</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.persistence</groupId>
					<artifactId>persistence-api</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-commons-annotations</artifactId>
			<version>3.3.0.ga</version>
			<exclusions>
				<exclusion>
					<groupId>org.hibernate</groupId>
					<artifactId>hibernate</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.apache.lucene</groupId>
					<artifactId>lucene-core</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.persistence</groupId>
					<artifactId>persistence-api</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>javax.transaction</groupId>
			<artifactId>jta</artifactId>
			<version>1.1</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>2.5.6</version>
			<exclusions>
				<exclusion>
					<groupId>javax.servlet</groupId>
					<artifactId>servlet-api</artifactId>
				</exclusion>
				<exclusion>
					<groupId>log4j</groupId>
					<artifactId>log4j</artifactId>
				</exclusion>
				<exclusion>
					<groupId>asm</groupId>
					<artifactId>asm</artifactId>
				</exclusion>
				<exclusion>
					<groupId>backport-util-concurrent</groupId>
					<artifactId>backport-util-concurrent</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-collections</groupId>
					<artifactId>commons-collections</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>2.5.6</version>
			<exclusions>
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-codec</groupId>
					<artifactId>commons-codec</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.servlet</groupId>
					<artifactId>servlet-api</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-fileupload</groupId>
					<artifactId>commons-fileupload</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-core</artifactId>
				</exclusion>
				<exclusion>
					<groupId>backport-util-concurrent</groupId>
					<artifactId>backport-util-concurrent</artifactId>
				</exclusion>
				<exclusion>
					<groupId>log4j</groupId>
					<artifactId>log4j</artifactId>
				</exclusion>				
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>2.5.6</version>
			<exclusions>
				<exclusion>
					<groupId>log4j</groupId>
					<artifactId>log4j</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.servlet</groupId>
					<artifactId>servlet-api</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-core</artifactId>
				</exclusion>
				<exclusion>
					<groupId>backport-util-concurrent</groupId>
					<artifactId>backport-util-concurrent</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>2.5.6</version>
			<exclusions>
				<exclusion>
					<groupId>org.hibernate</groupId>
					<artifactId>hibernate</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.transaction</groupId>
					<artifactId>jta</artifactId>
				</exclusion>
				<exclusion>
					<groupId>log4j</groupId>
					<artifactId>log4j</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-web</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-core</artifactId>
				</exclusion>
				<exclusion>
					<groupId>backport-util-concurrent</groupId>
					<artifactId>backport-util-concurrent</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.persistence</groupId>
					<artifactId>persistence-api</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>2.5.6</version>
			<exclusions>
				<exclusion>
					<groupId>javax.servlet</groupId>
					<artifactId>servlet-api</artifactId>
				</exclusion>
				<exclusion>
					<groupId>log4j</groupId>
					<artifactId>log4j</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-core</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>commons-dbcp</groupId>
			<artifactId>commons-dbcp</artifactId>
			<version>1.2.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-core</artifactId>
			<version>2.0.11.2</version>
			<exclusions>
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-io</groupId>
					<artifactId>commons-io</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-fileupload</groupId>
					<artifactId>commons-fileupload</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-core</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-aop</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-beans</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-web</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-context</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-mock</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.servlet</groupId>
					<artifactId>servlet-api</artifactId>
				</exclusion>
				<exclusion>
					<groupId>asm</groupId>
					<artifactId>asm</artifactId>
				</exclusion>
				<exclusion>
					<groupId>freemarker</groupId>
					<artifactId>freemarker</artifactId>
				</exclusion>
				<exclusion>
					<groupId>junit</groupId>
					<artifactId>junit</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-lang</groupId>
					<artifactId>commons-lang</artifactId>
				</exclusion>
				<exclusion>
					<groupId>velocity</groupId>
					<artifactId>velocity</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-sitemesh-plugin</artifactId>
			<version>2.0.11.2</version>
			<exclusions>
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-io</groupId>
					<artifactId>commons-io</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-fileupload</groupId>
					<artifactId>commons-fileupload</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-core</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-aop</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-beans</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-web</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-context</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-mock</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.servlet</groupId>
					<artifactId>servlet-api</artifactId>
				</exclusion>
				<exclusion>
					<groupId>asm</groupId>
					<artifactId>asm</artifactId>
				</exclusion>
				<exclusion>
					<groupId>opensymphony</groupId>
					<artifactId>sitemesh</artifactId>
				</exclusion>
				<exclusion>
					<groupId>freemarker</groupId>
					<artifactId>freemarker</artifactId>
				</exclusion>
				<exclusion>
					<groupId>junit</groupId>
					<artifactId>junit</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-lang</groupId>
					<artifactId>commons-lang</artifactId>
				</exclusion>
				<exclusion>
					<groupId>velocity</groupId>
					<artifactId>velocity</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-spring-plugin</artifactId>
			<version>2.0.11.2</version>
			<exclusions>
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-io</groupId>
					<artifactId>commons-io</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-fileupload</groupId>
					<artifactId>commons-fileupload</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-core</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-web</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-beans</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-context</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-aop</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-mock</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.servlet</groupId>
					<artifactId>servlet-api</artifactId>
				</exclusion>
				<exclusion>
					<groupId>asm</groupId>
					<artifactId>asm</artifactId>
				</exclusion>
				<exclusion>
					<groupId>freemarker</groupId>
					<artifactId>freemarker</artifactId>
				</exclusion>
				<exclusion>
					<groupId>junit</groupId>
					<artifactId>junit</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-lang</groupId>
					<artifactId>commons-lang</artifactId>
				</exclusion>
				<exclusion>
					<groupId>velocity</groupId>
					<artifactId>velocity</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>metasolr</groupId>
			<artifactId>metasolr</artifactId>
			<version>0.0.2</version>
			<exclusions>
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-codec</groupId>
					<artifactId>commons-codec</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-collections</groupId>
					<artifactId>commons-collections</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-httpclient</groupId>
					<artifactId>commons-httpclient</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>solr</groupId>
			<artifactId>solr</artifactId>
			<version>nightly</version>
		</dependency>
		<dependency>
			<groupId>solr</groupId>
			<artifactId>solr-commons</artifactId>
			<version>nightly</version>
		</dependency>
		<dependency>
			<groupId>commons-httpclient</groupId>
			<artifactId>commons-httpclient</artifactId>
			<version>3.1</version>
			<exclusions>
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.0</version>
			<scope>compile</scope>
			<exclusions>
				<exclusion>
					<groupId>javax.servlet</groupId>
					<artifactId>servlet-api</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.acegisecurity</groupId>
			<artifactId>acegi-security</artifactId>
			<version>1.0.6</version>
			<exclusions>
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-collections</groupId>
					<artifactId>commons-collections</artifactId>
				</exclusion>
				<exclusion>
					<groupId>taglibs</groupId>
					<artifactId>standard</artifactId>
				</exclusion>
				<exclusion>
					<groupId>log4j</groupId>
					<artifactId>log4j</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-core</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-support</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-remoting</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-jdbc</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-mock</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-web</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.servlet</groupId>
					<artifactId>servlet-api</artifactId>
				</exclusion>
				<exclusion>
					<groupId>aspectj</groupId>
					<artifactId>aspectjrt</artifactId>
				</exclusion>
				<exclusion>
					<groupId>net.sf.ehcache</groupId>
					<artifactId>ehcache</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-codec</groupId>
					<artifactId>commons-codec</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-lang</groupId>
					<artifactId>commons-lang</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>commons-dbcp</groupId>
			<artifactId>commons-dbcp</artifactId>
			<version>1.2.2</version>
		</dependency>
		
		<dependency>
			<groupId>commons-collections</groupId>
			<artifactId>commons-collections</artifactId>
			<version>3.2.1</version>
		</dependency>
		<dependency>
		    <groupId>commons-io</groupId>
		    <artifactId>commons-io</artifactId>
		    <version>1.4</version>
		</dependency>
		<dependency>
		    <groupId>commons-fileupload</groupId>
		    <artifactId>commons-fileupload</artifactId>
		    <version>1.2.1</version>
		    <exclusions>
			    <exclusion>
					<groupId>commons-io</groupId>
					<artifactId>commons-io</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.servlet</groupId>
					<artifactId>servlet-api</artifactId>
				</exclusion>
		    </exclusions>
		    
		</dependency>
		
		<dependency>
			<groupId>org.apache.lucene</groupId>
			<artifactId>lucene-core</artifactId>
			<version>2.3.0</version>
		</dependency>
	    <dependency>
	      <groupId>mysql</groupId>
	      <artifactId>mysql-connector-java</artifactId>     
	      <version>5.1.6</version>
	    </dependency>
	    <dependency>
	      <groupId>postgresql</groupId>
	      <artifactId>postgresql</artifactId>     
	      <version>8.2-507.jdbc4</version>
	    </dependency>	    
		<dependency>
			<groupId>opensymphony</groupId>
			<artifactId>sitemesh</artifactId>
			<version>2.3</version>
		</dependency>

		<dependency>
			<groupId>org.dbunit</groupId>
			<artifactId>dbunit</artifactId>
			<version>2.2</version>
			<exclusions>
				<exclusion>
					<groupId>commons-collections</groupId>
					<artifactId>commons-collections</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
				<exclusion>
					<groupId>junit</groupId>
					<artifactId>junit</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-lang</groupId>
					<artifactId>commons-lang</artifactId>
				</exclusion>			
				<exclusion>
					<groupId>ant</groupId>
					<artifactId>ant</artifactId>
				</exclusion>	
			</exclusions>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.4</version>
		</dependency>
		<dependency>
			<groupId>org.openqa.selenium.client-drivers</groupId>
			<artifactId>selenium-java-client-driver</artifactId>
			<version>1.0-beta-1</version>
			<exclusions>
				<exclusion>
					<groupId>org.openqa.selenium.core</groupId>
					<artifactId>selenium-core</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.openqa.selenium.server</groupId>
					<artifactId>selenium-server</artifactId>
				</exclusion>
				<exclusion>
					<groupId>junit</groupId>
					<artifactId>junit</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<!-- JMS -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jms</artifactId>
			<version>2.5.6</version>
			<exclusions>
				<exclusion>
					<groupId>freemarker</groupId>
					<artifactId>freemarker</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-core</artifactId>
				</exclusion>
				<exclusion>
					<groupId>log4j</groupId>
					<artifactId>log4j</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.servlet</groupId>
					<artifactId>servlet-api</artifactId>
				</exclusion>
				<exclusion>
					<groupId>backport-util-concurrent</groupId>
					<artifactId>backport-util-concurrent</artifactId>
				</exclusion>
				<exclusion>
					<groupId>net.sf.ehcache</groupId>
					<artifactId>ehcache</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-collections</groupId>
					<artifactId>commons-collections</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.apache.activemq</groupId>
			<artifactId>activemq-core</artifactId>
			<version>4.1.1</version>
			<exclusions>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
				<exclusion>
					<groupId>log4j</groupId>
					<artifactId>log4j</artifactId>
				</exclusion>
				<exclusion>
					<groupId>backport-util-concurrent</groupId>
					<artifactId>backport-util-concurrent</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-pool</groupId>
					<artifactId>commons-pool</artifactId>
				</exclusion>
				<exclusion>
					<groupId>xml-apis</groupId>
					<artifactId>xml-apis</artifactId>
				</exclusion>
				<exclusion>
					<groupId>xerces</groupId>
					<artifactId>xercesimpl</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>commons-vfs</groupId>
			<artifactId>commons-vfs</artifactId>
			<version>1.0</version>
			<exclusions>
				<exclusion>
					<groupId>commons-httpclient</groupId>
					<artifactId>commons-httpclient</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-collections</groupId>
					<artifactId>commons-collections</artifactId>
				</exclusion>
				<exclusion>
					<groupId>ant</groupId>
					<artifactId>ant</artifactId>
				</exclusion>
				<exclusion>
					<groupId>xml-apis</groupId>
					<artifactId>xml-apis</artifactId>
				</exclusion>
				<exclusion>
					<groupId>xerces</groupId>
					<artifactId>xercesimpl</artifactId>
				</exclusion>
				<exclusion>
					<groupId>xalan</groupId>
					<artifactId>xalan</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
	    <dependency>
	      <groupId>javax.mail</groupId>
	      <artifactId>mail</artifactId>     
	      <version>1.4</version>
	    </dependency>
	    <dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>2.5.6</version>
			<exclusions>
				<exclusion>
					<groupId>asm</groupId>
					<artifactId>asm</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.hibernate</groupId>
					<artifactId>hibernate</artifactId>
				</exclusion>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring-orm</artifactId>
				</exclusion>	
				<exclusion>
					<groupId>log4j</groupId>
					<artifactId>log4j</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.servlet</groupId>
					<artifactId>servlet-api</artifactId>
				</exclusion>
				<exclusion>
					<groupId>backport-util-concurrent</groupId>
					<artifactId>backport-util-concurrent</artifactId>
				</exclusion>
				<exclusion>
					<groupId>net.sf.ehcache</groupId>
					<artifactId>ehcache</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-collections</groupId>
					<artifactId>commons-collections</artifactId>
				</exclusion>
				<exclusion>
					<groupId>junit</groupId>
					<artifactId>junit</artifactId>
				</exclusion>
				<exclusion>
					<groupId>jasperreports</groupId>
					<artifactId>jasperreports</artifactId>
				</exclusion>
				<exclusion>
					<groupId>commons-fileupload</groupId>
					<artifactId>commons-fileupload</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.persistence</groupId>
					<artifactId>persistence-api</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
		    <groupId>org.easymock</groupId>
		    <artifactId>easymock</artifactId>
		    <version>2.4</version>
		</dependency>
		 <dependency>
		      <groupId>org.subethamail</groupId>
		      <artifactId>subethasmtp-wiser</artifactId>     
		      <version>1.2</version>
		      <exclusions>
		      	<exclusion>
		      		<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
		      	</exclusion>
		      </exclusions>
	    </dependency>
	    <dependency>
	      <groupId>br.com.ideais.spring</groupId>
	      <artifactId>ideais-spring</artifactId>     
	      <version>0.1.0</version>
	    </dependency>
	    <dependency>
	      <groupId>org.freemarker</groupId>
	      <artifactId>freemarker</artifactId>     
	      <version>2.3.14</version>
	    </dependency>
	    <dependency>
	      <groupId>net.sourceforge.collections</groupId>
	      <artifactId>collections-generic</artifactId>     
	      <version>4.01</version>
	    </dependency>
	    <dependency>
		    <groupId>com.sun.jersey</groupId>
		    <artifactId>jersey-spring</artifactId>
		    <version>1.0</version>
		    <exclusions>
		    	<exclusion>
					<groupId>javax.servlet</groupId>
					<artifactId>servlet-api</artifactId>
				</exclusion>
		    </exclusions>
		</dependency>
		<dependency>
	      <groupId>org.springframework</groupId>
	      <artifactId>spring-mock</artifactId>     
	      <version>2.0.8</version>
	      <exclusions>
	      	<exclusion>
	      		<groupId>commons-logging</groupId>
	      		<artifactId>commons-logging</artifactId>
	      	</exclusion>
	      	<exclusion>
				<groupId>javax.servlet</groupId>
				<artifactId>servlet-api</artifactId>
			</exclusion>
			<exclusion>
				<groupId>junit</groupId>
				<artifactId>junit</artifactId>
			</exclusion>
			<exclusion>
				<groupId>javax.persistence</groupId>
				<artifactId>persistence-api</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.springframework</groupId>
				<artifactId>spring-beans</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.springframework</groupId>
				<artifactId>spring-context</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.springframework</groupId>
				<artifactId>spring-core</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.springframework</groupId>
				<artifactId>spring-jdbc</artifactId>
			</exclusion>
			<exclusion>
				<groupId>org.springframework</groupId>
				<artifactId>spring-webmvc</artifactId>
			</exclusion>
	      </exclusions>
    	</dependency>
    	<dependency>
   			<groupId>javax.persistence</groupId>
			<artifactId>persistence-api</artifactId>
			<version>1.0.2</version>
		</dependency>
		<dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib-nodep</artifactId>
            <version>2.1_3</version>
        </dependency>
   		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.14</version>
        </dependency>  
	</dependencies>
</project>

Apache Ivy
Gradle

10 Respostas

Q

nossa cara, apesar do xml ser mais verborrágico ainda achei mais legível

X

Só pra comparação eu adicionei o pom.xml desse projeto.

Esse é um projeto real baseado em maven2 o qual eu portei para gradle só para teste.

A

Eu acho o Ivy algo extremamente mal pensado, pra não dizer gambiarra da pura.

Outros malefícios do Ivy envolvem o fato de que você acaba de dizer ‘tchau’ ao acesso do código-fonte das suas dependências, e as ferramentas para gerência de repositório, e os inúmeros plugins do mesmo.

E vendo o seu pom.xml, tenho a impressão de que você não se interessou em ler sobre parent poms, ou em criar um pom para cada grupo de dependências.

Obviamente, você foi pro Ivy porque não compreende o Maven. E se ainda não te disseram isso, eu farei este tortuoso favor: Você acabou de levar zero no módulo “Gerencia de Artefatos de Dependências no Maven 2” da disciplina.

X

Aldrin Leal:

E vendo o seu pom.xml, tenho a impressão de que você não se interessou em ler sobre parent poms, ou em criar um pom para cada grupo de dependências.

Obviamente, você foi pro Ivy porque não compreende o Maven. E se ainda não te disseram isso, eu farei este tortuoso favor: Você acabou de levar zero no módulo “Gerencia de Artefatos de Dependências no Maven 2” da disciplina.

Usamos parent poms(chamamos de super poms) para multi-projetos, um pom por projeto. Esse pom cheio de exclusions é produto de um programa chamado “Dependency Manager” que faz a resolução de conflitos e dependencias duplicadas. A solução na documentação do maven usando dependencyMediation e dependencyManagement é extremamente verbosa e complexa.

A solução do Ivy de calcular um grafo das dependencias cruzando com as dependências transitivas é muito mais elegante e obvia para o usuario.

O fonte das dependêcias geralmente é publicado junto com os binários nos repositorios maven. Sao tao acessíveis quando os binários. O Ivy é um gerenciador de dependéncias, nao de repositorios.

Por que motivos?

A

xymor:
Usamos parent poms(chamamos de super poms) para multi-projetos, um pom por projeto. Esse pom cheio de exclusions é produto de um programa chamado “Dependency Manager” que faz a resolução de conflitos e dependencias duplicadas. A solução na documentação do maven usando dependencyMediation e dependencyManagement é extremamente verbosa e complexa.

Vá ler um livro!

Ok, vou ajudar: Leia esse capítulo. A gente imagina que ler é tortuoso, portanto, não se acanhe: o livro é gratuito. Infelizmente, aprender custa (tempo e esforço).

E você não acha que o Maven faz isso?

Correção: Ele é um péssimo gerenciador de dependência. O fato dos fontes estarem nos repositórios M2 é culpa do próprio Maven. O Ivy não tem suporte nenhum a isso.

Torço que você nunca precise achar um defeito em algum framework que você usa. Usando Ivy nos seus projetos.

Basicamente, o Ivy ignora aspectos que são necessários em grandes projetos, como código fonte, a idéia que um artefato não é necessariamente um Jar, e que existem outros ecossistemas além do Ant.

Eu posso fazer artefatos serem construídos através do ant e publicá-los em um repositório Maven 2. É fácil até (exceto aquele probleminha de ler o manual, você sabe). Posso publicar um jar através da linha de comando, inclusive. Posso executar um build, fazer tagging e publicá-lo no meu repositório para deixar disponível a todos.

Um último detalhe: Enquanto o Maven original era sobre o ant, o Maven 2 começou do zero. O princípio que norteou isto foi o fato de que a sua filosofia excedia o ant. E eu concordo.

No final, o Gradle vai acabar tentando ser uma cópia do Maven, usando idéias que até o Maven descartou. E aí vem aquela máxima: Aqueles que não compreendem estão condenados a repetir o que outros já fizeram.

X

Li somente 3 páginas, das 13 desse capítulo e infelizmente ainda não descobri como usar os plugins maven-dependecy-plugin maven-plugin-plugin. Concordo com você, e eu não quero gastar o meu lendo um livro de 16 capítulos para fazer algo que consegui lendo 3 páginas no wiki do gradle que em 5min já conseguia simplesmente compilar, importar para o eclipse e empacotar um war(o básico necessário para me atender). Tenho certeza que a abrangência do Maven é culpa dessa complexidade e até a pouco achava que conhecia alguma coisa de Maven mas depois de ler um pouco desse livro eu cheguei a conclusão que Graeme Rocher está certíssimo e mais pessoa deve ser masoquita para usar ou achar maven bom.

Uma pena pois o Maven sempre teve um forte apelo por convenções(muito antes de convetion over configuration entrar na moda). Acho que é heresia demais achar que uma pessoa iria querer que por padrão o sistema de build resolvesse conflitos entre as dependências sozinho. Não é como se isso fosse fundamental nem nada…

Não sei mais como posso explicar, não é pretensão do Ivy realizar releases de binários ou fontes. Ele gerencia dependências, resolve e baixa binários e fontes de repositórios mais diversos. A funcionalidade de deploy do Maven é sensacional, por isso o Ivy é compativel com repositórios Maven. O correspondente ao maven-release do gradle nem chega perto.

Eu uso diáriamente Spring, Hibernate, Struts2 e Maven, nunca usei Ivy ou Gradle(além do teste que mencionei acima). O que mais vejo são defeitos em todos esses frameworks e ferramentas. Se fosse perfeito eu não estaria aqui discutindo.

Ant e Maven não são nem da mesma espécie. Ant é uma bicleta e o Maven é um avião. Comparar os dois é injusto. Maven é muito mais que um builder.

Tenho certeza que ele vai copiar as coisas que o Maven tem de melhor(que são muitas na minha opinião), mas nesse meio tempo, você poderia usar seus poderes de predição do futuro pra me dizer quais ações vão se sair bem semana que vem? Se não for pedir muito :wink:

A

Como fazer um projeto desses em M2 em 2 mins:

mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-spring -DremoteRepositories=http://static.appfuse.org/releases -DarchetypeVersion=2.0.2 -DgroupId=com.mycompany.app -DartifactId=myproject

Sim, você é masoquista.

X

Por favor AppFuse não. Compara o pom.xml que esse archtype do maven gerou com aqueles naquele livro que tu passou ou com o meu pom. Tem muito mais lixo que coisas aproveitáveis. O projeto ja esta pronto e rodando, com todas as configurações nos seus devidos xml e properties. Tudo que eu queria é um descritor de build para baixar as dependências, compilar e importar o projeto no eclipse.

Também interessante, esse achetype não gerou uma hieraquia de dependências com super poms nem mesmo usou o depencencyManagement. Vai ver nem os caras do AppFuse sabem usar isso Ou vai ver eles não tem anos para ficar lendo bibliotecas de livros e documentação do Maven…

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mycompany.app</groupId>
    <artifactId>myproject</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>AppFuse Spring MVC Application</name>
    <url>http://www.mycompany.com</url>

    <prerequisites>
        <maven>2.0.6</maven>
    </prerequisites>

    <licenses>
        <license>
            <name></name>
            <url></url>
        </license>
    </licenses>

    <scm>
        <connection></connection>
        <developerConnection></developerConnection>
        <url></url>
    </scm>

    <issueManagement>
        <system></system>
        <url></url>
    </issueManagement>

    <developers>
        <developer>
            <id></id>
            <name></name>
            <email></email>
            <timezone></timezone>
        </developer>
    </developers>
    
    <build>
        <defaultGoal>install</defaultGoal>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>appfuse-maven-plugin</artifactId>
                <version>${appfuse.version}</version>
                <configuration>
                    <genericCore>${amp.genericCore}</genericCore>
                    <fullSource>${amp.fullSource}</fullSource>
                </configuration>
                <!-- Dependency needed by appfuse:gen-model to connect to database. -->
                <!-- See http://issues.appfuse.org/browse/APF-868 to learn more.    -->
                <dependencies>
                    <dependency>
                        <groupId>${jdbc.groupId}</groupId>
                        <artifactId>${jdbc.artifactId}</artifactId>
                        <version>${jdbc.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>aspectj-maven-plugin</artifactId>
                <version>1.0</version>
                <configuration>
                    <source>1.5</source>
                    <verbose>true</verbose>
                    <complianceLevel>1.5</complianceLevel>
                    <showWeaveInfo>true</showWeaveInfo>
                    <aspectLibraries>
                        <aspectLibrary>
                            <groupId>org.springframework</groupId>
                            <artifactId>spring-aspects</artifactId>
                        </aspectLibrary>
                    </aspectLibraries>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>org.aspectj</groupId>
                        <artifactId>aspectjrt</artifactId>
                        <version>1.6.0</version>
                    </dependency>
                    <dependency>
                        <groupId>org.aspectj</groupId>
                        <artifactId>aspectjtools</artifactId>
                        <version>1.6.0</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.0.2</version>
                <configuration>
                    <source>1.5</source>
                    <target>1.5</target>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-eclipse-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <additionalProjectnatures>
                        <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
                    </additionalProjectnatures>
                    <additionalBuildcommands>
                        <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
                    </additionalBuildcommands>
                    <downloadSources>true</downloadSources>
                    <downloadJavadocs>true</downloadJavadocs>
                    <wtpversion>1.5</wtpversion>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-idea-plugin</artifactId>
                <version>2.1</version>
                <configuration>
                    <downloadSources>true</downloadSources>
                    <downloadJavadocs>true</downloadJavadocs>
                    <dependenciesAsLibraries>true</dependenciesAsLibraries>
                    <useFullNames>false</useFullNames>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>hibernate3-maven-plugin</artifactId>
                <version>2.1</version>
                <configuration>
                    <components>
                        <component>
                            <name>hbm2ddl</name>
                            <implementation>annotationconfiguration</implementation>
                            <!-- Use 'jpaconfiguration' if you're using JPA. -->
                            <!--<implementation>jpaconfiguration</implementation>-->
                        </component>
                    </components>
                    <componentProperties>
                        <drop>true</drop>
                        <jdk5>true</jdk5>
                        <propertyfile>target/classes/jdbc.properties</propertyfile>
                        <skip>${maven.test.skip}</skip>
                    </componentProperties>
                </configuration>
                <executions>
                    <execution>
                        <phase>process-test-resources</phase>
                        <goals>
                            <goal>hbm2ddl</goal>
                        </goals>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>${jdbc.groupId}</groupId>
                        <artifactId>${jdbc.artifactId}</artifactId>
                        <version>${jdbc.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>dbunit-maven-plugin</artifactId>
                <version>1.0-beta-1</version>
                <configuration>
                    <dataTypeFactoryName>${dbunit.dataTypeFactoryName}</dataTypeFactoryName>
                    <driver>${jdbc.driverClassName}</driver>
                    <username>${jdbc.username}</username>
                    <password>${jdbc.password}</password>
                    <url>${jdbc.url}</url>
                    <src>src/test/resources/sample-data.xml</src>
                    <type>${dbunit.operation.type}</type>
                    <schema>${dbunit.schema}</schema>
                    <skip>${maven.test.skip}</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>test-compile</id>
                        <phase>test-compile</phase>
                        <goals>
                            <goal>operation</goal>
                        </goals>
                    </execution>
                    <execution>
                        <!-- Runs before integration tests and jetty:run-war -->
                        <id>test</id>
                        <phase>test</phase>
                        <goals>
                            <goal>operation</goal>
                        </goals>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>${jdbc.groupId}</groupId>
                        <artifactId>${jdbc.artifactId}</artifactId>
                        <version>${jdbc.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <groupId>org.mortbay.jetty</groupId>
                <artifactId>maven-jetty-plugin</artifactId>
                <version>6.1.9</version>
                <configuration>
                    <contextPath>/</contextPath>
                    <scanIntervalSeconds>3</scanIntervalSeconds>
                    <scanTargetPatterns>
                        <scanTargetPattern>
                            <directory>src/main/webapp/WEB-INF</directory>
                            <excludes>
                                <exclude>**/*.jsp</exclude>
                            </excludes>
                            <includes>
                                <include>**/*.properties</include>
                                <include>**/*.xml</include>
                            </includes>
                        </scanTargetPattern>
                    </scanTargetPatterns>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.0.2</version>
                <configuration>
                    <dependentWarExcludes>
                        **/jdbc.properties,**/hibernate.cfg.xml,**/sql-map-config.xml,**/web.xml,WEB-INF/classes/META-INF/**
                    </dependentWarExcludes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.appfuse</groupId>
                <artifactId>maven-warpath-plugin</artifactId>
                <version>${appfuse.version}</version>
                <extensions>true</extensions>
                <executions>
                    <execution>
                        <goals>
                            <goal>add-classes</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <warpathExcludes>
                        applicationContext-resources.xml,ApplicationResources*.properties,ehcache.xml,
                        hibernate.cfg.xml,jdbc.properties,log4j.xml,mail.properties,**/persistence.xml,
                        sql-map-config.xml
                    </warpathExcludes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>native2ascii-maven-plugin</artifactId>
                <version>1.0-alpha-1</version>
                <configuration>
                    <dest>target/classes</dest>
                    <src>src/main/resources</src>
                </configuration>
                <executions>
                    <execution>
                        <id>native2ascii-utf8</id>
                        <goals>
                            <goal>native2ascii</goal>
                        </goals>
                        <configuration>
                            <encoding>UTF8</encoding>
                            <includes>
                                ApplicationResources_ko.properties,
                                ApplicationResources_no.properties,
                                ApplicationResources_tr.properties,
                                ApplicationResources_zh*.properties
                            </includes>
                        </configuration>
                    </execution>
                    <execution>
                        <id>native2ascii-8859_1</id>
                        <goals>
                            <goal>native2ascii</goal>
                        </goals>
                        <configuration>
                            <encoding>8859_1</encoding>
                            <includes>
                                ApplicationResources_de.properties,
                                ApplicationResources_fr.properties,
                                ApplicationResources_nl.properties,
                                ApplicationResources_pt*.properties
                            </includes>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <excludes>
                    <exclude>ApplicationResources_de.properties</exclude>
                    <exclude>ApplicationResources_fr.properties</exclude>
                    <exclude>ApplicationResources_ko.properties</exclude>
                    <exclude>ApplicationResources_nl.properties</exclude>
                    <exclude>ApplicationResources_no.properties</exclude>
                    <exclude>ApplicationResources_pt*.properties</exclude>
                    <exclude>ApplicationResources_tr.properties</exclude>
                    <exclude>ApplicationResources_zh*.properties</exclude>
                    <exclude>applicationContext-resources.xml</exclude>
                </excludes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>applicationContext-resources.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
        <testResources>
            <testResource>
                <directory>src/test/resources</directory>
                <filtering>true</filtering>
            </testResource>
            <testResource>
                <directory>src/main/webapp</directory>
                <filtering>true</filtering>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </testResource>
        </testResources>
    </build>

    <repositories>
        <repository>
            <id>central</id>
            <url>http://repo1.maven.org/maven2</url>
        </repository>
        <repository>
            <id>appfuse</id>
            <url>http://static.appfuse.org/repository</url>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>appfuse</id>
            <url>http://static.appfuse.org/repository</url>
        </pluginRepository>
    </pluginRepositories>

    <dependencies>
        <dependency>
            <groupId>org.appfuse</groupId>
            <artifactId>appfuse-${web.framework}</artifactId>
            <version>${appfuse.version}</version>
            <type>war</type>
        </dependency>
        <dependency>
            <groupId>org.appfuse</groupId>
            <artifactId>appfuse-${web.framework}</artifactId>
            <version>${appfuse.version}</version>
            <type>warpath</type>
            <!-- This exclusion and the dependency following this one allow DAO framework switching. -->
            <!-- You only need these if you want to use JPA or iBATIS. See APF-565 for more information. -->
            <!-- It does no harm to leave it in for Hibernate, but it's not needed. -->
            <exclusions>
                <exclusion>
                    <groupId>org.appfuse</groupId>
                    <artifactId>appfuse-hibernate</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.appfuse</groupId>
            <artifactId>appfuse-${dao.framework}</artifactId>
            <version>${appfuse.version}</version>
        </dependency>
        <dependency>
            <groupId>${jdbc.groupId}</groupId>
            <artifactId>${jdbc.artifactId}</artifactId>
            <version>${jdbc.version}</version>
        </dependency>
        <!-- Dependencies with scope=provided aren't picked up from dependent JARs -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jsp-api</artifactId>
            <version>${jsp.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>${servlet.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.jmock</groupId>
            <artifactId>jmock</artifactId>
            <version>${jmock.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jmock</groupId>
            <artifactId>jmock-junit4</artifactId>
            <version>${jmock.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.subethamail</groupId>
            <artifactId>subethasmtp-wiser</artifactId>
            <version>${wiser.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <reporting>
        <plugins>
            <plugin>
                <artifactId>maven-changes-plugin</artifactId>
            </plugin>
            <plugin>
                <artifactId>maven-checkstyle-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>cobertura-maven-plugin</artifactId>
                <version>2.0</version>
            </plugin>
            <plugin>
                <artifactId>maven-javadoc-plugin</artifactId>
            </plugin>
            <plugin>
                <artifactId>maven-jxr-plugin</artifactId>
            </plugin>
            <plugin>
                <artifactId>maven-pmd-plugin</artifactId>
                <configuration>
                    <linkXref>true</linkXref>
                    <targetJdk>1.5</targetJdk>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-surefire-report-plugin</artifactId>
            </plugin>
        </plugins>
    </reporting>

    <profiles>
        <profile>
            <id>integration-test</id>
            <activation>
                <property>
                    <name>!maven.test.skip</name>
                </property>
            </activation>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.codehaus.cargo</groupId>
                        <artifactId>cargo-maven2-plugin</artifactId>
                        <version>0.3</version>
                        <configuration>
                            <wait>${cargo.wait}</wait>
                            <container>
                                <containerId>${cargo.container}</containerId>
                                <!--home>${cargo.container.home}</home-->
                                <zipUrlInstaller>
                                    <url>${cargo.container.url}</url>
                                    <installDir>${installDir}</installDir>
                                </zipUrlInstaller>
                            </container>
                            <configuration>
                                <home>${project.build.directory}/${cargo.container}/container</home>
                                <properties>
                                    <cargo.hostname>${cargo.host}</cargo.hostname>
                                    <cargo.servlet.port>${cargo.port}</cargo.servlet.port>
                                </properties>
                            </configuration>
                        </configuration>
                        <executions>
                            <execution>
                                <id>start-container</id>
                                <phase>pre-integration-test</phase>
                                <goals>
                                    <goal>start</goal>
                                </goals>
                            </execution>
                            <execution>
                                <id>stop-container</id>
                                <phase>post-integration-test</phase>
                                <goals>
                                    <goal>stop</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                    <plugin>
                        <artifactId>maven-antrun-plugin</artifactId>
                        <version>1.1</version>
                        <configuration>
                            <tasks>
                                <taskdef resource="webtest_base_relaxed.taskdef">
                                    <classpath refid="maven.test.classpath"/>
                                </taskdef>
                                <mkdir dir="target/webtest-data"/>
                                <!-- Delete old results file if it exists -->
                                <delete file="target/webtest-data/web-tests-result.xml"/>
                                <!-- This is so the default will be used if no test case is specified -->
                                <property name="test" value="run-all-tests"/>
                                <echo level="info">Testing '${project.build.finalName}' with locale '${user.language}'</echo>
                                <ant antfile="src/test/resources/web-tests.xml" target="${test}">
                                    <property name="user.language" value="${user.language}"/>
                                    <property name="webapp.name" value="${project.build.finalName}"/>
                                    <property name="host" value="${cargo.host}"/>
                                    <property name="port" value="${cargo.port}"/>
                                </ant>
                            </tasks>
                        </configuration>
                        <executions>
                            <execution>
                                <phase>integration-test</phase>
                                <goals>
                                    <goal>run</goal>
                                </goals>
                            </execution>
                        </executions>
                        <dependencies>
                            <dependency>
                                <groupId>com.canoo.webtest</groupId>
                                <artifactId>webtest</artifactId>
                                <version>${webtest.version}</version>
                                <!-- groovy-all doesn't have a pom in central repo -->
                                <!-- exclude groovy to prevent trying to fetch pom -->
                                <exclusions>
                                    <exclusion>
                                        <groupId>groovy</groupId>
                                        <artifactId>groovy-all</artifactId>
                                    </exclusion>
                                </exclusions>
                            </dependency>
                        </dependencies>
                    </plugin>
                </plugins>
            </build>
        </profile>

        <!-- ================= Production Settings Profile ================= -->
        <!-- Use "-P prod" when you want to use the settings in this profile -->
        <!-- =============================================================== -->
        <profile>
            <id>prod</id>
            <build>
                <plugins>
                    <!-- Override location of data file for DbUnit to load (doesn't have negative keys) -->
                    <plugin>
                        <groupId>org.codehaus.mojo</groupId>
                        <artifactId>dbunit-maven-plugin</artifactId>
                        <configuration>
                            <src>src/main/resources/default-data.xml</src>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
        
        <!-- ================= Database Profiles ================= -->
        <profile>
            <id>derby</id>
            <properties>
                <hibernate.dialect>org.hibernate.dialect.DerbyDialect</hibernate.dialect>
                <jdbc.groupId>org.apache.derby</jdbc.groupId>
                <jdbc.artifactId>derbyclient</jdbc.artifactId>
                <jdbc.version>10.2.2.0</jdbc.version>
                <jdbc.driverClassName>org.apache.derby.jdbc.ClientDriver</jdbc.driverClassName>
                <jdbc.url><![CDATA[jdbc:derby://localhost/myproject;create=true]]></jdbc.url>
                <jdbc.username>any</jdbc.username>
                <jdbc.password>value</jdbc.password>
            </properties>
        </profile>
        <profile>
            <id>h2</id>
            <properties>
                <dbunit.dataTypeFactoryName>org.dbunit.ext.hsqldb.HsqldbDataTypeFactory</dbunit.dataTypeFactoryName>
                <hibernate.dialect>org.hibernate.dialect.H2Dialect</hibernate.dialect>
                <jdbc.groupId>com.h2database</jdbc.groupId>
                <jdbc.artifactId>h2</jdbc.artifactId>
                <jdbc.version>1.0.20061217</jdbc.version>
                <jdbc.driverClassName>org.h2.Driver</jdbc.driverClassName>
                <jdbc.url><![CDATA[jdbc:h2:${java.io.tmpdir}/myproject]]></jdbc.url>
                <jdbc.username>sa</jdbc.username>
                <jdbc.password></jdbc.password>
            </properties>
        </profile>
        <profile>
            <id>hsqldb</id>
            <properties>
                <dbunit.dataTypeFactoryName>org.dbunit.ext.hsqldb.HsqldbDataTypeFactory</dbunit.dataTypeFactoryName>
                <hibernate.dialect>org.hibernate.dialect.HSQLDialect</hibernate.dialect>
                <jdbc.groupId>hsqldb</jdbc.groupId>
                <jdbc.artifactId>hsqldb</jdbc.artifactId>
                <jdbc.version>1.8.0.7</jdbc.version>
                <jdbc.driverClassName>org.hsqldb.jdbcDriver</jdbc.driverClassName>
                <jdbc.url><![CDATA[jdbc:hsqldb:${java.io.tmpdir}/myproject;shutdown=true]]></jdbc.url>
                <jdbc.username>sa</jdbc.username>
                <jdbc.password></jdbc.password>
            </properties>
        </profile>
        <profile>
            <id>oracle</id>
            <properties>
                <dbunit.dataTypeFactoryName>org.dbunit.ext.oracle.OracleDataTypeFactory</dbunit.dataTypeFactoryName>
                <dbunit.schema>SYSTEM</dbunit.schema> <!-- Make sure to capitalize the schema name -->
                <hibernate.dialect>org.hibernate.dialect.Oracle9Dialect</hibernate.dialect>
                <jdbc.groupId>com.oracle</jdbc.groupId>
                <jdbc.artifactId>ojdbc14</jdbc.artifactId>
                <jdbc.version>10.2.0.2.0</jdbc.version>
                <jdbc.driverClassName>oracle.jdbc.OracleDriver</jdbc.driverClassName>
                <jdbc.url><![CDATA[jdbc:oracle:thin:@localhost:1521:XE]]></jdbc.url>
                <jdbc.username>system</jdbc.username>
                <jdbc.password>system</jdbc.password>
            </properties>
        </profile>
        <profile>
            <id>postgresql</id>
            <properties>
                <hibernate.dialect>org.hibernate.dialect.PostgreSQLDialect</hibernate.dialect>
                <jdbc.groupId>postgresql</jdbc.groupId>
                <jdbc.artifactId>postgresql</jdbc.artifactId>
                <jdbc.version>8.1-407.jdbc3</jdbc.version>
                <jdbc.driverClassName>org.postgresql.Driver</jdbc.driverClassName>
                <jdbc.url><![CDATA[jdbc:postgresql://localhost/myproject]]></jdbc.url>
                <jdbc.username>postgres</jdbc.username>
                <jdbc.password>postgres</jdbc.password>
            </properties>
        </profile>
        <profile>
            <!-- You need to enable TCP/IP Connections for SQL Server 2005 after installing. -->
            <!-- http://www.mattwoodward.com/blog/index.cfm?commentID=211 -->
            <id>sqlserver</id>
            <properties>
                <dbunit.dataTypeFactoryName>org.dbunit.ext.mssql.MsSqlDataTypeFactory</dbunit.dataTypeFactoryName>
                <dbunit.operation.type>MSSQL_CLEAN_INSERT</dbunit.operation.type>
                <hibernate.dialect>org.hibernate.dialect.SQLServerDialect</hibernate.dialect>
                <jdbc.groupId>net.sourceforge.jtds</jdbc.groupId>
                <jdbc.artifactId>jtds</jdbc.artifactId>
                <jdbc.version>1.2</jdbc.version>
                <jdbc.driverClassName>net.sourceforge.jtds.jdbc.Driver</jdbc.driverClassName>
                <jdbc.url><![CDATA[jdbc:jtds:sqlserver://localhost:3683/myproject]]></jdbc.url>
                <jdbc.username>sa</jdbc.username>
                <jdbc.password>appfuse</jdbc.password>
            </properties>
        </profile>

        <!-- ================= Container Profiles ================= -->
        <profile>
            <id>jboss</id>
            <properties>
                <cargo.container>jboss4x</cargo.container>
                <cargo.container.home>${env.JBOSS_HOME}</cargo.container.home>
                <cargo.container.url>http://easynews.dl.sourceforge.net/sourceforge/jboss/jboss-4.0.5.GA.zip</cargo.container.url>
            </properties>
        </profile>
    </profiles>

    <properties>
        <!-- Application settings -->
        <copyright.year>2008</copyright.year>
        <dao.framework>hibernate</dao.framework>
        <web.framework>spring</web.framework>
        <amp.genericCore>true</amp.genericCore>
        <amp.fullSource>false</amp.fullSource>
        
        <!-- Framework dependency versions -->
        <appfuse.version>2.0.2</appfuse.version>
        <spring.version>2.5.4</spring.version>

        <!-- Testing dependency versions -->
        <jmock.version>2.4.0</jmock.version>
        <jsp.version>2.0</jsp.version>
        <junit.version>4.4</junit.version>
        <servlet.version>2.4</servlet.version>
        <wiser.version>1.2</wiser.version>

        <!-- WebTest dependency versions  -->
        <webtest.version>R_1702</webtest.version>

        <!-- Cargo settings -->
        <cargo.container>tomcat5x</cargo.container>
        <cargo.container.home>${env.CATALINA_HOME}</cargo.container.home>
        <cargo.container.url>http://archive.apache.org/dist/tomcat/tomcat-6/v6.0.14/bin/apache-tomcat-6.0.14.zip</cargo.container.url>
        <cargo.host>localhost</cargo.host>
        <cargo.port>8081</cargo.port>
        <cargo.wait>false</cargo.wait>
                
        <!-- Database settings -->
        <dbunit.dataTypeFactoryName>org.dbunit.dataset.datatype.DefaultDataTypeFactory</dbunit.dataTypeFactoryName>
        <dbunit.operation.type>CLEAN_INSERT</dbunit.operation.type>
        <hibernate.dialect>org.hibernate.dialect.MySQL5InnoDBDialect</hibernate.dialect>
        <jdbc.groupId>mysql</jdbc.groupId>
        <jdbc.artifactId>mysql-connector-java</jdbc.artifactId>
        <jdbc.version>5.0.5</jdbc.version>
        <jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName>
        <jdbc.url><![CDATA[jdbc:mysql://localhost/myproject?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=utf-8]]></jdbc.url>
        <jdbc.username>root</jdbc.username>
        <jdbc.password></jdbc.password>
    </properties>
</project>
F

Eu uso o ivy, não sou fã, acho que tem problemas, mas acho mais simples que o maven. Na verdade migramos
do maven pois nunca vi um software tão cheio de bugs como o plugin do maven para o eclipse. Hoje não sei
se melhorou…

O ivy resolve muito bem os meus problemas com dependencias de projeto. Inclusive essa idéia de publicar coisas
além de jars, eu publico zips de instaladores, wars, tudo através da ant.

A

O M2Eclipse surgiu em parte pra resolver o problema que era o plugin do maven pra eclipse (no caso, o Mojo).

Aliás, eu analisei o “lixo” do AppFuse. Aparentemente, essas coisas de deixar campo pré-preenchido irrita pessoas, assim como ler e ter que entender matemática. :slight_smile:

Alias, peguei e fiz um screencast sobre isso:

http://screencast.com/t/7qfBlOab

Este problema de dependência cíclica é recorrente em outros ambientes (Jar Hell, DLL Hell, Assembly Hell) e não existe solução universal pra tal. O maven possui boas soluções (envolvendo o assembly-plugin e também o shade), como também existe a proposta do Mercury, que irá surgir com a versão 3.0. Mas por hora, e isto é necessário lembrar, ele ainda é campeão pra gerenciar adequadamente dependências.

Criado 7 de novembro de 2008
Ultima resposta 11 de nov. de 2008
Respostas 10
Participantes 4