Las interioridades de Maven

Published: (December 12, 2025 at 09:00 AM EST)
3 min read
Source: Dev.to

Source: Dev.to

Introducción

Hoy he perdido dos horas de mi precioso tiempo. Así es. Y todo porque Maven, a mi juicio, es peculiar.

Todo tiene que ver con uno de mis proyectos colaterales, llamado frover (GitHub), un explorador de archivos construido con Java. Una cosa que me gusta de Java es que es muy, muy sencillo distribuirlo: solo tienes que hacerlo mediante un JAR (más info).

¿Por qué usar Maven como sistema de construcción de la app? Bueno, es una opción. Gradle siempre me ha parecido muy engorroso según mi experiencia con Android, pero Ant es un buen sistema de construcción, funciona bien, aunque parece relegado a proyectos antiguos o legacy. Así que Maven parecía la mejor opción.

Maven se utiliza a través de la herramienta de línea de comando mvn y un archivo pom.xml que describe las necesidades del proyecto.

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.devbaltasarq</groupId>
  <artifactId>frover</artifactId>
  <version>1</version>
  <packaging>jar</packaging>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>25</maven.compiler.source>
    <exec.mainClass>com.devbaltasarq.frover.Ppal</exec.mainClass>
  </properties>

  <name>frover</name>
  <description>A simple file manager.</description>
</project>

El problema del manifest

Empiezas a crear la aplicación y la lanzas desde NetBeans (por ejemplo). Todo funciona, así que decides hacer dogfooding. Pero tu JAR no arranca. Desde la línea de comandos:

$ mvn package
$ java -jar target/frover-1.0.jar
no main manifest attribute, in frover-1.0.jar

El JAR necesita un archivo de texto especial llamado MANIFEST.MF dentro del directorio META-INF. Su contenido mínimo debería ser:

Manifest-Version: 1.0
Main-Class: com.devbaltasarq.frover.Ppal

Los JAR son, en esencia, archivos zip. Al inspeccionarlos:

$ unzip -v target/frover-1.0.jar
Archive:  target/frover-1.0.jar
...
$ unzip -v target/frover-1.0.jar | grep -i manifest

No aparece ningún MANIFEST.MF. Aunque el pom.xml ya contiene la información de la clase principal (properties.exec.mainClass), Maven no genera automáticamente el manifest.

Añadiendo el plugin maven-jar-plugin

Para que Maven incluya el manifest hay que añadir el plugin maven-jar-plugin al pom.xml:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>3.4.2</version>
      <configuration>
        <archive>
          <addMavenDescriptor>true</addMavenDescriptor>
          <manifest>
            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
            <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
            <mainClass>${exec.mainClass}</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
</build>

Con esta configuración Maven genera el MANIFEST.MF y el JAR resultante funciona correctamente.

pom.xml completo

A continuación se muestra el pom.xml completo con el plugin configurado:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.devbaltasarq</groupId>
  <artifactId>frover</artifactId>
  <version>1.0</version>
  <packaging>jar</packaging>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>25</maven.compiler.source>
    <exec.mainClass>com.devbaltasarq.frover.Ppal</exec.mainClass>
  </properties>

  <name>frover</name>
  <description>A simple file manager.</description>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.4.2</version>
        <configuration>
          <archive>
            <addMavenDescriptor>true</addMavenDescriptor>
            <manifest>
              <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
              <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
              <mainClass>${exec.mainClass}</mainClass>
            </manifest>
          </archive>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

Conclusión

Con el maven-jar-plugin configurado, el JAR incluye el manifest y arranca sin problemas. Aunque resulta algo engorroso tener que añadir todo ese XML, al menos Maven permite gestionar dependencias (por ejemplo, la librería Gson de Google) de forma sencilla añadiéndolas al mismo pom.xml. El desarrollo continúa, y pronto se añadirá un archivo de configuración JSON para la aplicación.

Back to Blog

Related posts

Read more »