Skip to main content

Añadir cosas al jar

Suele ser habitual que en nuestro jar haya cosas como un fichero de manifiesto, en el que se indique la clase principal y los jar de los que dependemos, o incluso añadir ficheros que no sean .class, como imágenes, iconos, propiedades, etc. Maven nos permite meter ficheros en el jar, sin más que colocarlos en determinado directorio dentro de la estructura del proyecto. Vamos a verlo.

Añadir resources al jar

Para meter ficheros en el jar con maven, nos basta con crear dentro de nuestro proyecto un directorio src/main/resources, así

proyecto1
proyecto1/pom.xml
proyecto1/pom.xml~
proyecto1/src
proyecto1/src/main
proyecto1/src/main/java
proyecto1/src/main/java/com
proyecto1/src/main/java/com/chuidiang
proyecto1/src/main/java/com/chuidiang/App.java
proyecto1/src/main/resources
proyecto1/src/test
proyecto1/src/test/java
proyecto1/src/test/java/com
proyecto1/src/test/java/com/chuidiang
proyecto1/src/test/java/com/chuidiang/AppTest.java

A partir de aquí, cualquier cosa que coloquemos debajo de resources se incluirá automáticamente en el jar cada vez que ejecutemos el comando mvn package. Debajo de resources podemos a su vez crear subdirectorios para organizar los ficheros, por ejemplo, un subdirectorio images, o icons. Esta estructura que creemos se meterá tal cual en el jar.

El fichero de manifiesto

Aunque podríamos crear un subdirectorio META-INF y dentro un fichero MANIFEST.MF para que se incluyera nuestro fichero de manifiesto dentro del jar, maven nos permite hacerlo de otra forma mejor. Una de las cosas que va en el fichero de manifiesto son los otros jar de los que dependemos (por ejemplo, log4j o el conector de MySQL. Si lo hicieramos creando a mano el fichero de manifiesto, tendríamos que poner esas dependencias a mano, y tendríamos que buscar y añadir a mano las posibles dependencias de las dependencias. Y cada vez que añadamos o quitemos alguna dependencia en el fichero pom.xml, debemos acordarnos de tocar a mano el fichero de manifiesto.

Por ello, maven nos permite indicar en el pom.xml cual sería la clase principal de nuestro proyecto, para ponerlo en el fichero de manifiesto, e indicar que queremos que ponga automáticamente las dependencias en ese fichero de manfiesto. Igualmente, podemos en el pom.xml añadir cualquier otra etiqueta/valor que queramos en el fichero de manifiesto. 

Dentro del fichero pom.xml debemos poner esto

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
          <archive>
            <manifest>
              <addClasspath>true</addClasspath>
              <mainClass>fully.qualified.MainClass</mainClass>
            </manifest>
          </archive>
        </configuration>
      </plugin>
      ...
    </plugins>
    ...
  </build>
  ...

Es decir, dentro del tag <project> ponemos un tag <build>, dentro un tag <plugins> y dentro el tag <plugin>. El plugin que queremos que es el que crea el fichero de manifiesto para el jar viene identificado, como siempre por un <groupId> org.apache.maven.plugins, un <artifactId> maven-jar-plugin y un número de versión, que al no ponerlo, será el más moderno que maven encuentre.

Una vez indicado el plugin, debemos indicarle bajo el tag <configuration>, <archive>, <manifest> qué queremos que haga. En concreto hemos puesto a true el <addClasspath> para que añada al fichero de manifiesto la etiqueta Class-Path: con todas las dependencias y le hemos indicado cual es el nombre de la clase principal <mainClass>.

Si ahora ejecutamos mvn package, maven meterá en nuestro jar un fichero de manifiesto con Class-Path y Main-Class y podremos ejecutarlo con java -jar proyecto1-1.0-SNAPSHOT.jar (es el nombre de nuestro jar en el ejemplo que estamos siguiendo).

Otros atributos en el fichero de manifiesto

Este plugin de maven que nos permite añadirle cosas a nuestro jar y fichero de manifiesto, permite añadir más etiquetas al mismo. Para ello, debajo del tag <archive> debemos poner un tag <manifestEntries> y todas las entradas que queramos

          <archive>
            <manifest>
              <addClasspath>true</addClasspath>
              <mainClass>fully.qualified.MainClass</mainClass>
	   </manifest>
           <manifestEntries>
              <etiqueta1>valor1</etiqueta1>
	      <etiqueta2>valor2</etiqueta2>
           </manifestEntries>
          </archive>

El plugin permite muchísimas configuraciones y posibilidades, como firmar jars, indicar el directorio de nuestras dependencias, etc, etc. Puedes ver la documentación del plugin en http://maven.apache.org/shared/maven-archiver/