开发者

Add classpath to manifest with a custom assembly descriptor

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 开发者_JS百科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?


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


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).


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>
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜