Add classpath to manifest with a custom assembly descriptor

21,834

Solution 1

This is not a good use of the assembly plugin. Java doesn't do jars-in-jars. You can use the maven-jar-plugin's configuration options to add a classpath to the manifest of your main jar, and then use the assembly plugin to collect your dependencies and drop then next to your main jar in a zip or tarball.

http://maven.apache.org/shared/maven-archiver/examples/classpath.html

Solution 2

Try updating the maven-assembly-plugin to version 2.5 or newer.

The unexpected absence of the entry Class-Path in the manifest file seems to have been caused by the bug MASSEMBLY-576. The bug was fixed in version 2.5 of the plugin (released 26 October 2014).

Solution 3

You should use the maven jar plugin:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <mainClass>main class</mainClass>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
            </manifest>
        </archive>
    </configuration>
</plugin>
Share:
21,834
davija
Author by

davija

Updated on July 09, 2022

Comments

  • davija
    davija almost 2 years

    I have the following custom assembly:

    <assembly>
        <id>full</id>
        <formats>
            <format>jar</format>
        </formats>
        <includeBaseDirectory>false</includeBaseDirectory>
        <fileSets>
            <fileSet>
                <directory>${project.build.outputDirectory}</directory>
                <outputDirectory>/</outputDirectory>
            </fileSet>
        </fileSets>
    </assembly>
    

    And the following configuration section:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
            <descriptors>
                <descriptor>src/main/assembly/assembly.xml</descriptor>
            </descriptors>
            <archive>
                <manifest>
                    <mainClass>com.example.MyExample</mainClass>
                    <addClasspath>true</addClasspath>
                    <classpathPrefix>./lib/</classpathPrefix>
                </manifest>
            </archive>
        </configuration>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    

    According to the documentation on the maven assembly plugin, this should add a classpath item to the manifest file, however it does not work. If I use the deprecated assembly goal instead of single, it does work.

    I noticed somewhere someone mentioned that the archive section is only available with the jar format, but that is what I'm using.

    When they deprecated assembly:assembly, did they define a new way of doing this correctly? I really don't like using deprecated functionality, but if they break the way things worked and don't properly document it, I really don't know how to avoid this.

    Does anyone have any examples of how to do this properly?

  • davija
    davija over 12 years
    I have since removed the dependencies from the jar and am placing them in a lib folder alongside the jar. However, the problem still remains. The assembly plugin does not add the classpath as specified.
  • Artem
    Artem over 12 years
    It's not supposed to. The jar plugin has that job.
  • davija
    davija over 12 years
    According to the documentation on the assembly plugin, if you tell it to add the classpath it does. It works in other goals that are now deprecated. Check the docs
  • jpaugh
    jpaugh about 8 years
    @bmargulies What about fat jars, which package all dependencies together? Isn't that the whole point of it?
  • jpaugh
    jpaugh about 8 years
    Ok, so this answer clears it up. I had heard about One Jar, but didn't realize this was impossible without One Jar.
  • niken
    niken almost 7 years
    didn't help, upgraded to 2.5 Class-Path still missing :(