Diferencia entre revisiones de «Configuración de plugins»

De Wiki de EGC
Saltar a: navegación, buscar
(Página creada con «La configuración de plugins en Maven se realiza siempre a través del fichero pom.xml. En general, la configuración de plugins me va a servir para dos cosas: * Adaptar el...»)
 
Línea 11: Línea 11:
  
 
<source lang="java">
 
<source lang="java">
 +
import java.util.Arrays;
 +
import java.util.List;
 +
[...]
 
List<String> myList =
 
List<String> myList =
 
     Arrays.asList("a1", "a2", "b1", "c2", "c1");
 
     Arrays.asList("a1", "a2", "b1", "c2", "c1");
Línea 39: Línea 42:
 
         <version>3.7.0</version>
 
         <version>3.7.0</version>
 
         <configuration>
 
         <configuration>
           <source>1.8&lt;/source&gt;
+
           <source>1.8< /source>
 
           <target>1.8</target>
 
           <target>1.8</target>
 
         </configuration>
 
         </configuration>
Línea 50: Línea 53:
 
</source>
 
</source>
  
 +
==Compilar de nuevo el código ==
 +
Observar como ahora funciona ya correctamente. Si da errores, comprueba que la versión de JDK que tienes instalada es la 1.8.
  
  
Modificar el manifest con maven-jar-plugin.
+
=Modificar el manifest con maven-jar-plugin=
Establecer el punto de entrada del .jar generado (cf. [https://maven.apache.org/plugins/maven-jar-plugin/ Jar Plugin])
+
El manifest es un fichero que se puede incluir en los JAR y que indica cuál es el punto de entrada del mismo. Este fichero permite que se pueda ejecutar el JAR directamente con <code>java -jar fichero.jar</code> en lugar de tener que indicar la clase donde está el método main. Esto se puede conseguir configurando de forma adecuada el [https://maven.apache.org/plugins/maven-jar-plugin/ maven-jar-plugin] para establecer el punto de entrada del mismo.
  
=Moficar el pom.xml=
+
==Moficar el pom.xml==
 
Añadir lo siguiente:
 
Añadir lo siguiente:
 
<source lang="xml">
 
<source lang="xml">
Línea 81: Línea 86:
  
 
</source>
 
</source>
Se ha configurado el pluging ''jar'' que está asociada a la fase ''package''. Al evaluar el objetivo ''jar:jar'' o la fase ''package'', creará el .jar con la configuración anterior.
+
Esto configura el plugin ''jar'' para que defina el entry point del fichero JAR generado. Esta configuración se aplicará tanto al ejecutar el objetivo "jar:jar" como al ejecutar la fase "package" (a la que está vinculada por defecto el objetivo "jar:jar").
  
=Cree el .jar=
+
==Cree el .jar==
 
<source lang=bash>
 
<source lang=bash>
 
mvn clean package
 
mvn clean package
Línea 91: Línea 96:
 
mvn clean jar:jar
 
mvn clean jar:jar
 
</source>
 
</source>
¿Qué diferencias hay?
 
  
=Ejecute el .jar generado=
+
¿Qué diferencias hay? ¿Es correcta esta segunda invocación? ¿Por qué?
 +
 
 +
==Ejecute el .jar generado==
 
<source lang=bash>
 
<source lang=bash>
java -jar target\....jar
+
java -jar target\proy1-1.0-SNAPSHOT.jar
 
</source>
 
</source>
¿Por qué falla?
 
  
 +
Ups. ¿Por qué falla?
  
Copiar las dependencias con maven-dependecy-pluging.
+
=Copiar las dependencias con maven-dependency-plugin=
Se establecerá una carpeta dentro de target donde estarán todos los jars dependientes (cf. [https://maven.apache.org/plugins/maven-dependency-plugin/ Dependency Plugin])
+
Se establecerá una carpeta dentro de target donde estarán todos los jars dependientes usando el [https://maven.apache.org/plugins/maven-dependency-plugin/ maven-dependency-plugin].
  
=Edite el pom.xml=
+
==Edite el pom.xml==
 
Añada el siguiente código
 
Añada el siguiente código
  
Línea 120: Línea 126:
 
             </goals>
 
             </goals>
 
             <configuration>
 
             <configuration>
               <outputDirectory>${project.build.directory}/dependencias</outputDirectory>
+
               <outputDirectory>${project.build.directory}/dependencies</outputDirectory>
 
               <includeScope> runtime </includeScope>  
 
               <includeScope> runtime </includeScope>  
 
             </configuration>
 
             </configuration>
Línea 128: Línea 134:
 
...
 
...
 
</source>
 
</source>
Se ha configurado el plugin ''dependency''. El objetivo ''copy-dependencies'' se ha asociado a la fase ''package'' y se ha configurado para que las dependencias de runtime se copien en la carpeta ''dependencias''.
 
  
=Cree el .jar y ejecute=
+
Se ha configurado el plugin ''dependency''. El objetivo ''copy-dependencies'' se ha asociado a la fase ''package'' y se ha configurado para que las dependencias de runtime se copien en la carpeta ''dependencies''.
 +
 
 +
==Cree el .jar y ejecute==
 
<source lang="bash">
 
<source lang="bash">
 
mvn package
 
mvn package
java -jar ruta_al.jar
+
java -jar target\proy1-1.0-SNAPSHOT.jar
 
</source>
 
</source>
  
 
¿Sigue fallando?
 
¿Sigue fallando?
  
=Hay que terminar de configurar el pluging Jar=
+
==Hay que terminar de configurar el plugin Jar==
 
Hay que añadir las referencias en el manifest. Añada las siguientes líneas de configuración del plugin ''Jar'' anterior.
 
Hay que añadir las referencias en el manifest. Añada las siguientes líneas de configuración del plugin ''Jar'' anterior.
  
Línea 144: Línea 151:
 
...
 
...
 
<addClasspath>true</addClasspath>
 
<addClasspath>true</addClasspath>
<classpathPrefix> dependencias/</classpathPrefix>
+
<classpathPrefix> dependencies/</classpathPrefix>
 
...
 
...
 
</source>
 
</source>
Línea 150: Línea 157:
 
= ¿Vas rápido? -> Tarea adicional =
 
= ¿Vas rápido? -> Tarea adicional =
  
*El plugin Jar se ha configurado para que, durante su ejecución dentro del ciclo de vida default, se comporte de cierta manera.
+
El plugin Jar se ha configurado para que, durante su ejecución dentro del ciclo de vida default, se comporte de cierta manera. Sin embargo, el plugin dependency, que no se ejecuta normalmente, se ha configurado para que sí se ejecute.
*Sin embargo, el plugin Depencies, que no se ejecuta normalmente, se ha configurado para que sí se ejecute.
 
  
*Haga, ahora, que se creen 2 jars, uno con la configuración que hemos indicado arriba y otro sin que tenga ninguna configuración por nuestra parte.  
+
Haga, ahora, que se creen 2 jars, uno con la configuración que hemos indicado arriba y otro sin que tenga ninguna configuración por nuestra parte. Esto no es habitualmente recomendable ya que lo ideal es que cada proyecto tenga un único resultado, pero sirve a modo de ejemplo para probar las características de Maven.
  
*Además de tocar el atributo <code>manifest</code> tendrá que tocar el <code>finalName</code> para que cada jar tenga un nombre diferente (cf. [https://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html Jar Parameters]).
+
''Indicación:'' Además de tocar el atributo <code>manifest</code> tendrá que tocar el <code>finalName</code> para que cada jar tenga un nombre diferente (cf. [https://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html Jar Parameters]).

Revisión del 14:29 24 nov 2017

La configuración de plugins en Maven se realiza siempre a través del fichero pom.xml. En general, la configuración de plugins me va a servir para dos cosas:

  • Adaptar el funcionamiento de un plugin a la forma que me interese en el proyecto.
  • Vincular objetivos de un plugin a fases del ciclo de vida de maven.

A continuación vamos a ver tres ejemplos de cosas que se pueden conseguir por medio de la configuración de plugins.

Seleccionar la versión de Java para compilación y ejecución con maven-compiler-plugin

Por defecto, el plugin de compilación de maven fija tanto la versión del código (source) como la versión del .class generado (target) con la versión 1.5 de Java. Si queremos cambiarlo, es necesario configurar el plugin que se encarga de compilar el código (maven-compiler-plugin).

Añadir el siguiente código al método main de la clase App

import java.util.Arrays;
import java.util.List;
[...]
List<String> myList =
    Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList
    .stream()
    .filter(s -> s.startsWith("c"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);

Este código utiliza la funcionalidad de Streams de Java 1.8.

Compilar el código modificado

Observar el mensaje de error. ¿Por qué falla?

Configurar pom.xml para que maven-compiler-plugin use la versión 1.8 de java

<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.7.0</version>
        <configuration>
          <source>1.8< /source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
    [...]
  </build>
  [...]
</project>

Compilar de nuevo el código

Observar como ahora funciona ya correctamente. Si da errores, comprueba que la versión de JDK que tienes instalada es la 1.8.


Modificar el manifest con maven-jar-plugin

El manifest es un fichero que se puede incluir en los JAR y que indica cuál es el punto de entrada del mismo. Este fichero permite que se pueda ejecutar el JAR directamente con java -jar fichero.jar en lugar de tener que indicar la clase donde está el método main. Esto se puede conseguir configurando de forma adecuada el maven-jar-plugin para establecer el punto de entrada del mismo.

Moficar el pom.xml

Añadir lo siguiente:

<build>
	<plugins>
  		<!-- Make this jar executable -->
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-jar-plugin</artifactId>
			<version>2.6</version>
			<configuration>
<!--Pluging configuration -->
			 <archive>
				<manifest>
					<!-- Jar file entry point -->
					<mainClass>${project.groupId}.App</mainClass>
				</manifest>
			  </archive>
			</configuration>
		</plugin>
	</plugins>
  </build>

Esto configura el plugin jar para que defina el entry point del fichero JAR generado. Esta configuración se aplicará tanto al ejecutar el objetivo "jar:jar" como al ejecutar la fase "package" (a la que está vinculada por defecto el objetivo "jar:jar").

Cree el .jar

mvn clean package

ó

mvn clean jar:jar

¿Qué diferencias hay? ¿Es correcta esta segunda invocación? ¿Por qué?

Ejecute el .jar generado

java -jar target\proy1-1.0-SNAPSHOT.jar

Ups. ¿Por qué falla?

Copiar las dependencias con maven-dependency-plugin

Se establecerá una carpeta dentro de target donde estarán todos los jars dependientes usando el maven-dependency-plugin.

Edite el pom.xml

Añada el siguiente código

...
<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>2.10</version>
        <executions>
          <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
              <goal>copy-dependencies</goal>
            </goals>
            <configuration>
              <outputDirectory>${project.build.directory}/dependencies</outputDirectory>
              <includeScope> runtime </includeScope> 
            </configuration>
          </execution>
        </executions>
      </plugin>
...

Se ha configurado el plugin dependency. El objetivo copy-dependencies se ha asociado a la fase package y se ha configurado para que las dependencias de runtime se copien en la carpeta dependencies.

Cree el .jar y ejecute

mvn package
java -jar target\proy1-1.0-SNAPSHOT.jar

¿Sigue fallando?

Hay que terminar de configurar el plugin Jar

Hay que añadir las referencias en el manifest. Añada las siguientes líneas de configuración del plugin Jar anterior.

...
<addClasspath>true</addClasspath>
<classpathPrefix> dependencies/</classpathPrefix>
...

¿Vas rápido? -> Tarea adicional

El plugin Jar se ha configurado para que, durante su ejecución dentro del ciclo de vida default, se comporte de cierta manera. Sin embargo, el plugin dependency, que no se ejecuta normalmente, se ha configurado para que sí se ejecute.

Haga, ahora, que se creen 2 jars, uno con la configuración que hemos indicado arriba y otro sin que tenga ninguna configuración por nuestra parte. Esto no es habitualmente recomendable ya que lo ideal es que cada proyecto tenga un único resultado, pero sirve a modo de ejemplo para probar las características de Maven.

Indicación: Además de tocar el atributo manifest tendrá que tocar el finalName para que cada jar tenga un nombre diferente (cf. Jar Parameters).