Search code examples
javamavenjsoupmanifestprogram-entry-point

Maven won't create runnable jars


My pom.xml looks like this

...
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.5.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
          <archive>
            <manifest>
              <mainClass>application.Main</mainClass>
            </manifest>
          </archive>
        </configuration>
      </plugin>
    </plugins>
  ...

but although I specified the main class, on clean package install maven only creates jars that aren't runnable.

How can I fix that? The manifest then looks like this:

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: Matthias
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_121

Solution

  • Instead of maven compiler plugin, you should configure the maven jar plugin to create an executable jar :

    <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>              
          <archive>
            <manifest>          
                <mainClass>application.Main</mainClass>
            </manifest>
          </archive>
        </configuration>
    </plugin>
    

    To declare the source/target java version you could use :

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    

    instead of declaring the compiler plugin.
    This is less verbose and it produces exactly the same result.

    Besides, if you want to include dependency jars of your application inside your executable jar, you should favor the maven assembly plugin over the maven jar plugin :

    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <archive>
            <manifest>
              <mainClass>application.Main</mainClass>
            </manifest>
          </archive>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id> <!-- this is used for inheritance merges -->
            <phase>package</phase> <!-- bind to the packaging phase -->
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>