Maven manifestentries

De ChuWiki
(Redirigido desde «Anadir cosas al jar»)


Viene de Tutorial de Maven

Qué es el fichero de manifiesto[editar]

Dentro del fichero jar compilado por nuestro proyecto, suele ser habitual que haya un fichero META-INF/MANIFEST.MF. Este fichero se conoce como fichero de manifiesto. En él suele meterse información que pueda ser de interés. Contiene varias líneas con el formato

nombre: texto

Algunas de esas líneas no tiene mayor interés, es sólo información que queramos poner. Pero otras sí tienen un sentido. Entre otras, se puede poner cual es la clase main de nuestro poryecto y el classpath (o dependencias necesarias) para ejecutarlo. Con esas dos líneas, nuestro jar es "ejecutable" y bastaría hacerlo con este comando simple

java -jar miProyecto.jar

Veamos como configurar todo esto.

maven-jar-plugin[editar]

maven-jar-plugin es el que nos permite configurar el contenido de nuestro fichero de manifiesto, usando el plugin maven-archive-plugin.

maven-jar-plugin viene por defecto con Maven, pero necesitamos ponerlo en nuestro fichero pom.xml si queremos configurarlo. Para ello tendríamos que poner

<project>
    ...
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.3.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            ...
                        </manifest>
                        <manifestEntries>
                            ...
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
        ...
    </build>
    ...
</project>

La configuración la pondríamos dentro de <archive>. Hay dos bloques. En manifest ponemos indicaciones para que maven-archive-plugin genere entradas de forma más o menos automática, como la clase main o el classpath. En <manifestentries> ponemos nuestras manifestentries personalizadas.

En el resto de ejemplos, para no repetir, pondremos sólo la configuración que va dentro de <archive>.

Añadir la clase main[editar]

Para añadir la clase main de nuestro proyecto, basta añadir <mainClass> dentro de <manifest>

<archive>
   <manifest>
      <mainClass>com.chuidiang.examples.HelloWorld</mainClass>
   </manifest>
</archive>

Añadir el classpath[editar]

Añadimos adicionalemente el classpath con nuestras dependencias. Maven lo hace automáticamente

<archive>
   <manifest>
      <mainClass>com.chuidiang.examples.HelloWorld</mainClass>
      <addClasspath>true</addClasspath>
      <classpathPrefix>lib/</classpathPrefix>
   </manifest>
</archive>

Simplemente hemos puesto <addClasspath> a true. Pero hay un detalle si queremos que nuestro jar sea ejecutable. Si solo añadimos <addClasspath> y no ponemos <classpathPrefix>, al ejecutar el jar se van a busca los jar de los que dependemos en el mismo directorio donde esté nuestro jar. Es decir, para poder ejecutar, debemos tener todos los jar en el mismo directorio, tanto el de nuestro proyecto como las dependencias. Si es eso lo que quieres, no hace falta que pongas <classpathPrefix>

Pero si queremos organizarlo de otra manera, por ejemplo, que haya un directorio lib donde meter todas las dependencias, <classpathPrefix> nos permite indicar el path relativo desde el directorio donde esté nuestro jar hasta el directorio de las dependencias. La siguiente imagen muestra donde nuestro jar executable-project.jar al lado de un subdirectorio lib con todas las depedencias dentro.

Estructura de directorios con nuestro jar ejecutable y directorio lib para las dependencias
Estructura de directorios con nuestro jar ejecutable y directorio lib para las dependencias

Con esto ya podemos ejecutar simplemente con

java -jar executable-project.jar

manifestentries personalizas[editar]

Si queremos añadir información adicional en el fichero de manifiesto, por ejemplo, el autor, nuestra empresa, la fecha/hora en que se ha generado el jar, etc, podemos hacerlo en <manifestEntries>. Simplemente nos basta poner las entradas que queramos en el formato

<nombre>valor</nombre>

Veamos un ejemplo

<archive>
    <manifest>
        ...
    </manifest>
    <manifestEntries>
        <author>Chuidiang</author>
        <date>${maven.build.timestamp}</date>
        <url>${project.url}</url>
    </manifestEntries>
</archive>

Hemos añadido

  • Un autor, Chuidiang.
  • La fecha/hora de construcción del jar. Aquí podemos usar variables propiedades del proyecto maven, en concreto, hemos usado ${maven.build.timestamp} que nos da la fecha/hora.
  • La url de nuestro proyecto, en mi caso la de esta wiki. <url> es una de los campos que puede rellenarse en el pom.xml y está disponible en la variable ${project.url}.

Fichero de manifiesto final[editar]

Con todo lo que hemos añadido, el fichero de manifiesto final, dentro de nuestro jar, sería similar al siguiente

Manifest-Version: 1.0
Created-By: Maven JAR Plugin 3.3.0
Build-Jdk-Spec: 17
Class-Path: lib/logback-classic-1.4.11.jar lib/logback-cor
 e-1.4.11.jar dependency/slf4j-api-2.0.7.jar
Main-Class: com.chuidiang.examples.HelloWorld
author: Chuidiang
date: 2023-11-11T09:04:44Z
url: https://chuidiang.org

Vemos algunas entradas que añade maven de cosecha propia. Vemos el Class-path en el que cada dependencia tiene delante lib/. Vemos la Main-Class. Y vemos las tres entradas personales que hemos puesto: autor, fecha y url.