Mostrando entradas con la etiqueta MAVEN. Mostrar todas las entradas
Mostrando entradas con la etiqueta MAVEN. Mostrar todas las entradas

lunes, 8 de abril de 2013

Maven & Aplicaciones Standalone (JARs)

Ver este link:

http://maven.apache.org/plugins/maven-jar-plugin/examples/manifest-customization.html

If you want to make a standalone jar (ie one with no dependencies) executable, here’s how you do it:

<plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
        <configuration>
          <archive>
            <manifest>
              <addClasspath>true</addClasspath>
              <mainClass>com.yourcompany.YourClass</mainClass>
            </manifest>
         </archive>
       </configuration>
    </plugin>
  </plugins>

If however you have dependencies, you will probably want to bundle them into a single jar, otherwise making it executable is not very helpful. You can use the assembly plugin to do it like this:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-assembly-plugin</artifactId>
    <executions>
      <execution>
         <goals>
           <goal>attached</goal>
         </goals>
         <phase>package</phase>
         <configuration>
           <descriptorRefs>
             <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <archive>
            <manifest>
              <mainClass>com.yourcompany.YourClass</mainClass>
            </manifest>
          </archive>
        </configuration>
     </execution>
  </executions>
</plugin>

De esta menera, ademas de crear el JAR sin dependencias vamos a ver que nos crea un JAR con dependencias donde todas las dependencias las agrega como clases (prueba-tools-1.0-SNAPSHOT-jar-with-dependencies.jar). 

martes, 13 de marzo de 2012

Maven - Build Lifecycle

Phases, goals and plugins

1. A Build Lifecycle consists of Phases

Clean Lifecycle - ALL phases:
  • pre-clean
  • clean
  • post-clean

Default Lifecycle (Build phases) - ALL phases:
  • validate
  • initialize
  • generate-sources
  • process-sources
  • generate-resources
  • process-resources
  • compile
  • process-classes
  • generate-test-sources
  • process-test-sources
  • generate-test-resources
  • process-test-resources
  • test-compile
  • process-test-classes
  • test
  • prepare-package
  • package
  • pre-integration-test
  • integration-test
  • post-integration-test
  • verify
  • install
  • deploy


Running mvn deploy will execute all preceding phases such as validate, compile, package, etc


2. A Build Phase consists of Goals

A goal represents a specific task

Ej. mvn clean dependency:copy-dependencies package

The clean phase will be executed first and then the dependency:copy-dependencies goal, before finally executing the package phase (and all its preceeding build phases of the default lifecycle)

Some phases have goals binded to them by default and for the default lifecycle, these bindings depend on the packaging value:

Clean Lifecycle Bindings (only the most used):

clean => clean:clean

Default Lifecycle Bindings (only the most used):

process-resources => resources:resources
compile => compiler:compile
process-test-resources => resources:testResources
test-compile => compiler:testCompile
test => surefire:test
package => ejb:ejb or ejb3:ejb3 or jar:jar or par:par or rar:rar or war:war
install => install:install
deploy => deploy:deploy


3. Setting Up Your Project to Use the Build Lifecycle

3.1 The first, and most common way, is to set the packaging for your project via the equally named POM element <packaging> (jar, war, ear and pom)

Each packaging contains a list of goals to bind to a particular phase


3.2 The second way to add goals to phases is to configure plugins in your project

Plugins are artifacts that provide goals to Maven. A plugin may have one or more goals.
There are Maven plugins for building, testing, source control management, running a web server, generating Eclipse project files, etc. 
Plugins are introduced and configured in a <plugins>-section of a pom.xml

For example, the Modello plugin binds by default its goal modello:java to the generate-sources phase 
(Note: The modello:java goal generates Java source codes). 
So to use the Modello plugin and have it generate sources from a model and incorporate that into the build, you would add the following to your POM in the <plugins> section of <build>:

...
<plugin>
  <groupId>org.codehaus.modello</groupId>
  <artifactId>modello-maven-plugin</artifactId>
  <version>1.4</version>
  <executions>
<execution>
  <configuration>
<models>
  <model>src/main/mdo/maven.mdo</model>
</models>
<version>4.0.0</version>
  </configuration>
  <goals>
<goal>java</goal>
  </goals>
</execution>
  </executions>
</plugin>
...

Now, in the case of modello:java, it only makes sense in the generate-sources phase. But some goals can be used in more than one phase, and there may not be a sensible default

For example, let's say you have a goal display:time that echos the current time to the commandline, and you want it to run in the process-test-resources phase to indicate when the tests were started. This would be configured like so:

...
<plugin>
  <groupId>com.mycompany.example</groupId>
  <artifactId>display-maven-plugin</artifactId>
  <version>1.0</version>
  <executions>
<execution>
  <phase>process-test-resources</phase>
  <goals>
<goal>time</goal>
  </goals>
</execution>
  </executions>
</plugin>
...

A plugin provides a set of goals that can be executed using the following syntax:

Los Goals de Maven son las unidades mínimas de ejecución de las que disponemos durante su uso.. Un grupo de goals conforman un plugin. La ejecución de un goal se dispara desde línea de comandos invocando Maven con el nombre del plugin que lo contiene:

mvn [plugin-name]:[goal-name]


Otra forma de invocar un goal es indirectamente. Maven lo invocará dependiendo de la fase del ciclo de vida cuando por ejemplo se ejecute

mvn compile

Ver: http://www.dosideas.com/wiki/Maven

Summary:

Goals provided by plugins can be associated with different phases of the lifecycle. For example, by default, the goal "compiler:compile" is associated with the compile-phase, while the goal "surefire:test" is associated with the test-phase. 
When the command "mvn test" is executed, Maven will run all the goals associated with each of the phases up to the test-phase. So it will run the "resources:resources"-goal associated with the process-resources-phase, then "compiler:compile", and so on until it finally runs the "surefire:test"-goal.
When we executed mvn install, Maven executes all phases up to the install phase, and in the process of stepping through the lifecycle phases it executes all goals bound to each phase. 
Instead of executing a Maven lifecycle goal you could achieve the same results by specifying a sequence of plugin goals as follows:

mvn resources:resources \
compiler:compile \
resources:testResources \
compiler:testCompile \
surefire:test \
jar:jar \
install:install

Is much easier to execute lifecycle phases than it is to specify explicit goals on the command line
The Archetype plugin created a project with a file named pom.xml. 
This is the Project Object Model (POM), a declarative description of a project. 
When Maven executes a goal, each goal has access to the information defined in a project’s POM. When the jar:jar goal needs to create a JAR file, it looks to the POM to find out what the JAR file’s name is. When the compiler:compile goal compiles Java source code into bytecode, it looks to the POM to see if there are any parameters for the compile goal. Goals execute in the context of a POM

Dependencies:

When you run Maven for the first time, you will notice that Maven downloads a number of files from a remote Maven repository. 
If the simple project was the first time you ran Maven, the first thing it will do is download the latest release of the Resources plugin when it triggers the resources:resource goal. 
In Maven, artifacts and plugins are retrieved from a remote repository when they are needed. 
One of the reasons the initial Maven download is so small (1.5 MiB) is due to the fact that Maven doesn’t ship with much in the way of plugins. 
Maven ships with the bare minimum and fetches from a remote repository when it needs to. Maven ships with a default remote repository location (http://repo1.maven.org/maven2) which it uses to download the core Maven plugins and dependencies.

The example section hinted at Maven's dependency-handling mechanism. A project that needs the Hibernate-library simply has to declare Hibernate's project coordinates in its POM. Maven will automatically download the dependency and the dependencies that Hibernate itself needs (called transitive dependencies) and store them in the user's local repository. Maven 2 Central Repository[3] is used by default to search for libraries, but one can configure the repositories used (e.g. company-private repositories) in POM.
There are search engines such as Maven Central, which can be used to find out coordinates for different open-source libraries and frameworks.
Links: 

http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference
http://en.wikipedia.org/wiki/Apache_Maven
http://www.sonatype.com/books/mvnex-book/reference/simple-project-sect-simple-core.html

jueves, 25 de agosto de 2011

MAVEN - Conceptos Básicos

Instalación de Maven

http://maven.apache.org/download.html#Installation



Crear un proyecto con Maven

El primer paso que podemos hacer con maven es crear un proyecto desde cero. El comando de maven que tenemos que ejecutar es

mvn archetype:create -DgroupId=chuidiang.ejemplos -DartifactId=EjemploMaven



Veamos los parámetros

1. archetype:create Es el comando/plugin, de maven para crear un proyecto. Por defecto crea un proyecto de java simple (nada de aplicación web, aunque también se puede)

2. -DgroupId=chuidiang.ejemplos Es el conjunto de proyectos al que pertenece nuestro proyecto. Por ejemplo, yo puedo meter todos mis programas de ejemplo en un grupo que llamaré "chuidiang.ejemplos". Este nombre que pongamos aquí va a servir de paquete inicial para todas las clases del proyecto. Todos los proyectos maven deben pertenecer a un grupo, aunque sea único para él, que se denominará groupId.

3. -DartifactId=EjemploMaven Es el nombre que queramos dar al proyecto. Maven creará un directorio con este nombre y el jar que genere para el proyecto tendrá también este nombre. Todos los proyectos maven tienen un nombre para identificarlos, que se denomirá artifactId



Maven crea el paquete inicial chuidiang.ejemplos (como lo indicamos en el comando anterior), según indicamos en el groupId y en él mete un par de ficheros java de muestra, App.java y AppTest.java. Normalmente estos ficheros los borraremos, salvo que queramos aprovechar el nombre.

Una vez ejecutado este comando, Maven empezará a bajarse cosas de internet cuando lo ejecutemos por primera vez (en los próximos proyectos ya no necesita bajarse nada).


Al crear el proyecto, maven automáticamente va a empezar a descargar ciertas libreras y las va a colocar en nuestro repositorio local.




Vemos un poquito mas en detalle este archivo tan importante - POM.XML

<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>chuidiang.ejemplos</groupId>
  <artifactId>EjemploMaven</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>EjemploMaven</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

</project>

Aqui vemos como esta armado el POM (que se creo con el comando anterior) que sera el archivo que usara maven para compilar, ejecutar los test, etc, nuestro proyecto. Observamos que el proyecto creado solo necesita una libreria (JUnit) y no para se usada a la hora de compilar el proyecto sino a la hora de ejecutar los test.
Repositorios (como para tener una idea)

Por defecto, maven descargara los artefactos (librerías) del repositorio central, sin embargo no todas las librerias están allí. Existen otros repositorios publicos donde encontraremos mas librerías. Para poder utilizar otras librerías que no están en los repositorios centrales de maven tenemos dos opciones. 

  • O bien la descargamos de internet, y la instalamos de forma manual a nuestro repositorio local (mas adelante mostraremos esto mismo con las librerías del driver de oracle)
  • O bien, agregando otras locaciones de repositorios en el POM

Ejemplo

<repositories>

    <repository>
      <id>java.net</id>
      <url>http://download.java.net/maven/2</url>
    </repository>

    <repository>
      <id>central</id>
      <name>Maven Repository Switchboard</name>
      <layout>default</layout>
      <url>http://repo1.maven.org/maven2</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>

  </repositories>

Una de las grandes ventajas de maven son los repositorios (almacenes) de ficheros jar que se crea.

Algunos repositorios oficiales
  • http://www.ibiblio.org/maven2/ 
  • http://repo1.maven.org/maven2/log4j/ (este no se puede browsear mas, y para eso hicieron esto: http://search.maven.org/#browse)
Ahí están los groupId de casi todos los jar de libre distribución que puedas encontrar en internet. 
Tienes el log4j, commons-logging, JFreeChart, mysql-connector, etc, etc. 
Maven es capaz de bajarse cualquiera de estos jar si tu proyecto lo necesita.

Todo lo que se baje maven de internet lo mete en un repositorio (almacen) local en tu pc, de forma que si lo necesita una segunda vez, no necesita descargárselo nuevamente de internet. Este directorio, habitualmente está en
  • $HOME/.m2 en unix/linux
  • C:\Documents and Settings\usuario\.m2 en windows
Es más, los deja con una estructura similar a la del respositorio, creando subdirectorios por groupId, por artifactId y por version. Cuando compilamos con mvn compile o mvn package, maven mira primero si los jar que necesitan ya están en el respositorio local en $HOME/.m2/repository. Si ya están los usa sin más. Si no están, los busca en internet, los pone en nuestro $HOME/.m2/repository y los usa.

Si dependemos de un jar en versión SNAPSHOT (el SNAPSHOT es para indicar que una versión está en construcción, que no es definitiva), maven mirará de qué fecha es el jar que tenemos en nuestro repositorio $HOME/.m2/repository y aunque ya lo tengamos, si es anterior al día de hoy, ira de todas formas a internet a ver si hay una versión más moderna. Si la hay, se la bajará y será la que utilice. Esto no sucede con las versiones normales no SNAPSHOT (por ejemplo, log4j-1.2.13.jar). 
Maven considera que esa versión es estable y no se va a modificar más, por lo que si la tenemos en nuestro $HOME/.m2/repository, no irá a internet a ver si hay una más moderna.

Finalmente, si dentro de nuestro ordenador tenemos varios proyectos maven y queremos usar los jar que hemos generado en uno de ellos en otro de los proyectos, podemos subir esos jar al repositorio local. El comando es mvn install. Este comando compila, pasa los test de JUnit, genera el jar y lo sube a nuestro $HOME/.m2/repository con el groupId, artifactId y versión que hayamos decidido cuando creamos el proyecto. En el momento que este jar está en nuestro $HOME/.m2/repository, ya está accesible para cualquier otro proyecto maven en el mismo ordenador.


Compilar el proyecto creado

Una vez que tenemos todo, podemos compiliar de forma sencilla. Basta ponerse en el directorio donde está el fichero pom.xml y escribir.

mvn compile

Compila las clases y genera los .class. Al hacerlo, creará un directorio target debajo del proyecto, debajo de él un directorio classes y ahí irá metiendo los .class que genere.




Generar el JAR del proyecto compilado anteriormente

Para generar el jar, es igual de sencillo

mvn package

Compila las clases si no están ya compiladas y genera en el directorio target el fichero .jar de nuestro proyecto. Es decir, primero compilará si es necesario, pasará las clases de test de JUnit y si no hay fallos, meterá en el directorio target nuestro jar, que por defecto tendrá un nombre como este



EjemploMaven-1.0-SNAPSHOT.jar

Maven añade un 1.0 para indicar que es la versión 1.0 de nuestro proyecto. Este número aparece y podemos cambiarlo en el fichero pom.xml. Lo de -SNAPSHOT es para indicar que esta versión está en construcción, que no es definitiva. Maven irá guardando todas las versiones del jar que generemos e irá sustituyendo -SNAPSHOT por la fecha y hora de la construcción.

La parte SNAPSHOT para maven significa que es un proyecto todavía en desarrollo y que esta versión no es definitiva.

Más adelante veremos que maven trata de forma especial los jar cuyas versiones terminen en SNAPSHOT.

Esto de -SNAPSHOT también aparece en el pom.xml y podemos quitarlo cuando creamos que tenemos la versión definitiva.


<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>chuidiang.ejemplos</groupId>
  <artifactId>EjemploMaven</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>



....
....
....
</project>

No es necesario ejecutarlos en orden (primero el mvn compile y despues el mvn package), si ejecutamos directamente mvn package, veremos como se van compilando las clases y se genera el jar, que quedará en el directorio target.

Vemos como nos queda el directorio target después de ejecutar el comando mvn package (todos los subdirectorios que se crearon como el classes, test-classes, etc)





Borramos lo compilado

Hasta ahora vimos que se ha generado un directorio target en el que se han metido los .class, los resultados de los test de JUnit debajo del subdirectorio surefire-reposts y el jar de nuestro proyecto.

Finalmente, el siguiente comando eliminará el directorio target con todo su contenido. Se suele ejecutar si queremos compilar todo desde cero.

mvn clean

Si no lo ejecutamos, maven mirará si los .java son más modernos que los .class existentes para compilar sólo los que han sufrido modificaciones.

Vemos como nos quedo el proyecto cuando ejecutamos este comando (vemos que no tenemos mas el directorio target)



Instalar nuestro JAR al repositorio local

Esto significa que vamos a copiar el JAR generado anteriormente en el repositorio local. Es decir, este comando compila, pasa los test de JUnit, genera el jar y lo sube a nuestro $HOME/.m2/repository con el groupId, artifactId y versión que hayamos decidido cuando creamos el proyecto.

mvn install

Esto instalara el JAR en:

C:\Documents and Settings\Damian Ciocca\.m2\repository\chuidiang\ejemplos\EjemploMaven\1.0-SNAPSHOT

Esta operación hace que el JAR esté disponible para otros proyectos maven que tengamos en nuestro ordenador. Es útil, por tanto, para proyectos maven que sean librerías nuestras que queramos usar en varios proyectos.



Lo de -SNAPSHOT en la versión tiene aquí su gracia. Si dependemos de un jar que tenga -SNAPSHOT, cada vez que compilemos, aunque ese jar esté en nuestro repositorio local, maven ira a buscarlos a los repositorios comunes o de internet, para ver si hay una versión de fecha más moderna. Si la hay, se la bajará. Por tanto, suele ser útil en un equipo de trabajo mantener la "coletilla" -SNAPSHOT en los jar que todavía están en desarrollo y sufren cambios frecuentes.


Crear otro tipo de proyectos (solo para tenerlo en cuenta)

El comando mvn archetype:create es un comando obsoleto.

Maven aconseja ahora ejecutar mvn archetype:generate. Si lo ejecutamos sin parámetros, nos ira preguntado un montón de cosas:

Primero el tipo de proyecto a generar, entre 41 posibles: proyectos appfuse, hibernate, spring, cocoon, groovy, etc, etc, (por defecto, un jar simple)
groupId
artifactId
version (por defecto 1.0-SNAPSHOT)
paquete inicial de las clases (por defecto lo que hemos puesto en groupId)
Confirmación de los datos introducidos para crear el proyecto.

Según qué tipo de proyecto, maven creará la estructura de una forma u otra, generará determinados ficheros de ejemplo en determinados directorios (como en el caso del App.java con un "Hola Mundo" como acabamos de ver) y lo más importante de todo, nos bajará de internet todos los jar de los que dependemos y los colocará en un sitio en que él pueda encontrarlos cuando compile.


Agregamos una nueva dependencias de nuestro proyecto (desde el repositorio publico de maven)

Una vez que sabemos que hay un montón de JARs por el mundo a nuestra disposición, sólo tenemos que saber cómo hacer que maven se los baje cuando nosotros queramos.

Supongamos que querramos incluir la libreria de log4j... Browseamos por el repositorioa publico de Maven y buscamos la libreria hasta llegar al POM

http://mirrors.ibiblio.org/pub/mirrors/maven2/log4j/log4j/1.2.14/




Ahí vemos el groupId, artifactId y versión del log4j que queremos (ver URL siguiente).

http://mirrors.ibiblio.org/pub/mirrors/maven2/log4j/log4j/1.2.14/log4j-1.2.14.pom


NOTA: En http://mvnrepository.com/ poniendo en la caja de búsqueda el nombre de la librería (por ejemplo, mysql) nos irá mostrando opciones y navegando por ellas, pulsando al final en "details", tendremos el <dependency> completo que tenemos que poner en maven

Ahora editamos nuestro pom.xml y le añadimos la dependencia donde nos quedaria asi:


<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>chuidiang.ejemplos</groupId>
  <artifactId>EjemploMaven</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>EjemploMaven</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.14</version>
      <scope>compile</scope>
    </dependency>
    
  </dependencies>
</project>


Esta vez hemos puesto "compile" en vez de "test" para indicar que lo necesitamos a la hora de compilar nuestro proyecto.

Cuando compilemos la primera vez, maven mirará si ya tenemos log4j en nuestro repositorio local y si no lo tenemos, se irá a buscarlo a internet y lo bajará. El log4j quedará en nuestro repositorio local.

Luego volvemos a ejecutar mvn compile sobre el directorio raiz (EjemploMaven). Vemos como por consola vemos como maven descargar la libreria que agregamos como dependencia en el POM.




Agregamos una nueva dependencias de nuestro proyecto (de forma manual)


1. Descargar el JAR desde Internet manualmente
2. Nos situamos donde esta el JAR (ej. E:\APIs\oracle\ojdbc14.jar)
3. Procedemos a instalar dicho JAR en el repositorio local (M2) mediante el siguiente comando

mvn install:install-file -Dfile=ojdbc14.jar -DgroupId=com.oracle -DartifactId=oracle -Dversion=10.2.0.3.0 -Dpackaging=jar -DgeneratePom=true

Esta libreria quedo instalada en:
C:\Documents and Settings\Damian Ciocca\.m2\repository\com\oracle\oracle\10.2.0.3.0

Y ahora procedemos a modificar el POM agregando la siguiente dependencia:

   <dependency>
      <groupId>com.oracle</groupId>
      <artifactId>oracle</artifactId>
      <version>10.2.0.3.0</version>
      <scope>compile</scope>
  </dependency>


Integración con los IDE (en este caso, vamos a integrarnos con Eclipse)

Antes que nada vamos a instalar el plugin para el eclipse para poder integrar maven:
http://www.eclipse.org/m2e/


Ingresamos la URL http://download.eclipse.org/technology/m2e/releases/

En primer lugar, vamos a verificar que nuestro eclipse tenga correctamente instalado maven
El settings.xml que viene dentro del maven/conf tenemos que copiarlo en .m2/



Luego verificamos que el plugin de maven este correctamente apuntando al repositorio


Una vez que tengamos correctamente apuntando al repositorio local el eclipse, procedemos con los siguiente pasos.

Para crear nuestro proyecto eclipse, nos basta con ejecutar el comando mvn eclipse:eclipse en el directorio raíz de nuestro proyecto.
Esto creará los ficheros .project y .classpath que definen un proyecto de eclipse.

mvn eclipse:eclipse




Una vez creados los ficheros, nos vamos a eclipse e importamos el proyecto. 

En eclipse seleccionamos  "File" -> "Import" -> "General" -> "Existing projects into workspace". (en este ejemplo se opta por copiar el proyecto EjemploMaven dentro del worskpace del eclipse)

NOTA: Otra forma de importar el proyecto es directamente como proyecto Maven, mediante File -> Import -> Maven -> Existing Maven project. De esta manera, nos evitamos todos los pasos que se detallaran  a continuación. 

Nos aparecerá una ventana en la que podemos seleccionar el directorio raíz de nuestro proyecto y al aceptar, aparecerá nuestro proyecto listo para importar. Lo seleccionamos y aceptamos.

Una vez importado el proyecto, hay una cosa que debemos hacer una sola vez en nuestro workspace de eclipse, que es definir una variable que apunte al sitio donde maven guarda los jars que se descarga de internet. Esto se hace en "Window" -> "Preferences" -> "java" -> "Build path" -> "Classpath variables". 

Pulsamos el botón "new" para crear una nueva variable de nombre M2_REPO y que apunte al sitio donde maven tiene los jars. La ubicación por defecto en $HOME/.m2/repository. Verificar que ya exista esta variable.


Luego nos paramos sobre el proyecto, clic derecho, Maven, Enabled Dependency Managment.
Vemos que el proyecto nos queda con una M muy chiquita. Esto significa que el proyecto esta asociado a Maven y cualquier cambio que se haga en el POM, sera reflejado automáticamente en el proyecto.


Luego verificamos los JARs en el java build path y vemos lo siguiente



Ahora vamos a cambiar la version del log4j a 1.2.4 (modificamos el pom cambiando solamente la version del log4j) grabamos el cambio

Vamos a ver por consola esto:

8/25/11 9:18:36 AM GMT-03:00: Refreshing [/EjemploMaven/pom.xml]
8/25/11 9:18:36 AM GMT-03:00: Downloading http://repo1.maven.org/maven2/log4j/log4j/1.2.4/log4j-1.2.4.pom
8/25/11 9:18:36 AM GMT-03:00: Downloaded http://repo1.maven.org/maven2/log4j/log4j/1.2.4/log4j-1.2.4.pom
8/25/11 9:18:37 AM GMT-03:00: Downloading http://repo1.maven.org/maven2/log4j/log4j/1.2.4/log4j-1.2.4.jar
8/25/11 9:18:43 AM GMT-03:00: Downloaded http://repo1.maven.org/maven2/log4j/log4j/1.2.4/log4j-1.2.4.jar
8/25/11 9:18:43 AM GMT-03:00: Maven Builder: AUTO_BUILD 
8/25/11 9:18:45 AM GMT-03:00: Maven Builder: AUTO_BUILD requireFullBuild
8/25/11 9:18:45 AM GMT-03:00: [INFO] Using 'UTF-8' encoding to copy filtered resources.
8/25/11 9:18:45 AM GMT-03:00: [INFO] skip non existing resourceDirectory E:\wc_maven\EjemploMaven\src\main\resources
8/25/11 9:18:45 AM GMT-03:00: [INFO] Nothing to compile - all classes are up to date
8/25/11 9:18:45 AM GMT-03:00: [INFO] Using 'UTF-8' encoding to copy filtered resources.
8/25/11 9:18:45 AM GMT-03:00: [INFO] skip non existing resourceDirectory E:\wc_maven\EjemploMaven\src\test\resources

Automáticamente se descargo la nueva libreria de log4j y se actualizo en nuestro java build path del proyecto.

Luego, volvemos a la version anterior del log4j (1.2.14) (modificamos el pom cambiando solamente la version del log4j)

Y ahora vemos que por consola salio esto:

8/25/11 9:21:15 AM GMT-03:00: Refreshing [/EjemploMaven/pom.xml]
8/25/11 9:21:15 AM GMT-03:00: Maven Builder: AUTO_BUILD 
8/25/11 9:21:16 AM GMT-03:00: Maven Builder: AUTO_BUILD requireFullBuild
8/25/11 9:21:16 AM GMT-03:00: [INFO] Using 'UTF-8' encoding to copy filtered resources.
8/25/11 9:21:16 AM GMT-03:00: [INFO] skip non existing resourceDirectory E:\wc_maven\EjemploMaven\src\main\resources
8/25/11 9:21:16 AM GMT-03:00: [INFO] Nothing to compile - all classes are up to date
8/25/11 9:21:16 AM GMT-03:00: [INFO] Using 'UTF-8' encoding to copy filtered resources.
8/25/11 9:21:16 AM GMT-03:00: [INFO] skip non existing resourceDirectory E:\wc_maven\EjemploMaven\src\test\resources

Aqui vemos como Maven no descargo nada ya que esa version del log4j la tenemos en el repositorio local.

Asi es como nos queda un proyecto integrado con maven en eclipse y con las 3 dependencias segun el POM.



Creacion de releases - IMPORTANTE

http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=Release_Maven

Utilización de una aplicación para browsear los artefactos (releases y snapshots) - Artifactory

http://www.queres.es/weblog/?p=11

JDKs, MAVEN y los TESTs

Maven utilizara el compilador que indique en su POM para compilar los fuentes


<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>2.0.2</version>
      <configuration>
       <executable>${jdk6_javac}</executable> <!--  Esto sale del setting.xml -->
<source>1.6</source>
<target>1.6</target>
      </configuration>
    </plugin>
  </plugins>
</build>

En el setting.xml que iría en el repositorio local


<properties>
<jdk_java>c:\Progra~2\Java\jdk1.5.0_22\bin\java.exe</jdk_java>
<jdk_javac>c:\Progra~2\Java\jdk1.5.0_22\bin\javac.exe</jdk_javac>
<artifactory.dav.url>dav:http://10.105.80.40:8081/artifactory </artifactory.dav.url>
<jdk5_java>c:\Progra~2\Java\jdk1.5.0_22\bin\java.exe</jdk5_java>
<jdk5_javac>c:\Progra~2\Java\jdk1.5.0_22\bin\javac.exe</jdk5_javac>
<jdk6_java>c:\Progra~2\Java\jdk1.6.0_35\bin\java.exe</jdk6_java>
<jdk6_javac>c:\Progra~2\Java\jdk1.6.0_35\bin\javac.exe</jdk6_javac>
<downloadSources>true</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
</properties>



Un tema importante es que a la hora de correr los tests se tiene que tener en cuenta que los test pueden correr con otra JVM por lo tanto se puede explicitar (para evitar problemas) con que JVM que se deben correr los test. De esta manera se logra tener una uniformidad con las JVMs que se utilizan tanto para la compilacion como para la ejecucion de test

http://fraguadigital.blogspot.com.ar/2009/06/maven-surefire-plugin.html
http://www.sonatype.com/books/mvnex-book/reference/customizing-sect-executing-tests.html.


<build>
  <plugins>
    <plugin>
      <artifactId>maven-surefire-plugin</artifactId>
      <configuration>
        <jvm>${jdk6_java}</jvm> <!--  Esto sale del setting.xml -->
      </configuration>
    </plugin>
  </plugins>
</build>

En caso que necesitemos configurar varias JDK y correr maven con distintas JDKs

http://wiki.fluxit.com.ar/display/PUBLIC/Maven+y+Diferentes+JDK

Maven Assembly

1. Empaquetado de aplicaciones standalone:

http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=maven_standalone_app

2. Empaquetado de aplicaciones standaolone de un modulo que requiere tener montado todo el entorno de la capa de servicios de nuestra aplicacion:

Estamos hablando de aplicaciones JEE, lo suficientemente bien modularizadas y la necesidad consiste en ejecutar una aplicación standalone, que tenga accesibles los mismos servicios que tendría el módulo web

http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=Maven-assembly-plugin-batchProcess
http://chuwiki.chuidiang.org/index.php?title=Hacer_un_zip_para_distribuir

Ejemplo del assembly.xml

Aquí encontramos los tags con su explicación detallada: http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html

<?xml version="1.0" encoding="UTF-8"?>  
<assembly>  
    <!-- Yo le doy este identificador para mis aplicaciones -->  
    <id>standaloneapp-dist-format</id>  
  
    <!-- 
        http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html 
    -->  
    <formats>  
        <!-- La salida será un directorio -->  
        <format>dir</format>  
    </formats>  
  
    <!--  
        Generará la salida a la carpeta dist al mismo nivel del pom.xml..  
        manias, me gusta así  
    -->  
    <baseDirectory>../../dist</baseDirectory>  
  
    <fileSets>  
        <!--  
            Copiamos todos los jar del directorio "target" (donde compila maven)  
            al directorio de salida "baseDirectory" es decir, sólo copiará el jar  
            propio de la aplicación  
        -->  
        <fileSet>  
            <directory>target</directory>  
            <outputDirectory>.</outputDirectory>  
            <includes>  
                <include>*.jar</include>  
            </includes>  
        </fileSet>  
    </fileSets>  
  
    <dependencySets>  
        <dependencySet>  
            <!-- Las dependencias irán al directorio lib -->  
            <outputDirectory>lib</outputDirectory>  
  
            <!--  
                Que genere las dependencias como JAR y no como .class en sus  
                subdirectorios  
            -->  
            <unpack>false</unpack>  
  
            <!-- Que sólo genere las dependencias runtime -->  
            <scope>runtime</scope>  
  
            <!-- 
                El JAR propio de la aplicación no lo incluimos en el directorio lib 
            -->  
            <excludes>  
                <exclude>${groupId}:${artifactId}</exclude>  
            </excludes>  
        </dependencySet>  
    </dependencySets>  
</assembly>  


Otro ejemplo:


<assembly  xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>all</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>/lib</outputDirectory>
<unpack>false</unpack>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<directory>src/main/assembly/resources</directory>
<excludes>
<exclude>*.properties</exclude>
</excludes>
<outputDirectory>/resources</outputDirectory>
</fileSet>
<fileSet>
<directory>src/main/assembly/resources</directory>
<includes>
<include>*.properties</include>
</includes>
<outputDirectory>/conf</outputDirectory>
</fileSet>
<fileSet>
<directory>src/main/assembly/bin</directory>
<outputDirectory>/</outputDirectory>
</fileSet>
<fileSet>
<directory>target</directory>
<outputDirectory>/bin</outputDirectory>
<excludes>
<exclude>*-tests.jar</exclude>
<exclude>*-test-sources.jar</exclude>
<exclude>*-javadoc.jar</exclude>
</excludes>
<includes>
<include>*.jar</include>
</includes>
</fileSet>

<!-- Only way I found to *create* an empty directory -->
<fileSet>
<directory>src/main/assembly/resources</directory>
<outputDirectory>/logs</outputDirectory>
<excludes>
<exclude>*</exclude>
</excludes>
</fileSet>

<fileSet>
<directory>src/main/assembly/db-install-scripts</directory>
<outputDirectory>/db-install-scripts</outputDirectory>
</fileSet>
</fileSets>
</assembly>




Maven Tests

Maven por default mediante el plugin surefire no ejecuta los test de integracion (*IntegrationTest.java), solo ejecutara los test unitarios (*Test.java)

http://stackoverflow.com/questions/1399240/how-do-i-get-my-maven-integration-tests-to-run

Run test

mvn test

Skiping test

mvn install -Dmaven.test.skip=true




Bilbiografia

http://chuidiang.org/content/maven
http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html
http://www.chuidiang.com/java/herramientas/maven.php
http://chuwiki.chuidiang.org/index.php?title=Integraci%C3%B3n_de_Maven_y_Eclipse#Importar_un_proyecto_maven_en_eclipse
http://www.springfuse.com/install-oracle-jdbc-driver-in-maven-repository.html