简体   繁体   中英

How to configure maven:assembly root path in the jar

Here is the pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.springframework.webflow</groupId>
    <artifactId>spring-js-resources-thin</artifactId>
    <version>2.2.1.RELEASE</version>
    <name>Spring js lib</name>
    <description>Spring javascript library without dojo</description>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.2.1</version>
                <configuration>
                    <descriptors>
                        <descriptor>src/main/assembly/assembly.xml</descriptor>
                    </descriptors>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

and here is the assembly.xml

<assembly>
    <id>js-jar</id>
    <formats>
        <format>jar</format>
    </formats>
    <fileSets>
        <fileSet>
            <directory>src/main/resources/</directory>  
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>META-INF/**/*</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>

The problem is, everytime I open the generated jar file(spring-js-resources-thin-2.2.1.RELEASE-js-jar.jar), the root folder is always named as artifactid-version (spring-js-resources-thin-2.2.1.RELEASE), then the META-INF.

I wonder there is anyway that I can build the jar file with the file name artifactid-version.jar , but WITHOUT the artifactid-version in the class path, just like every jar in the maven repository. I think there should be an option or a way to name the <outputDirectory> .

You have to tell maven-assembly-plugin not to include the base directory within the archive which can be achieved by using the following:

<assembly>
    <id>js-jar</id>
    <formats>
        <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <fileSets>
        <fileSet>
            <directory>src/main/resources/</directory>  
            <outputDirectory>.</outputDirectory>
            <includes>
                <include>META-INF/**/*</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>

And the suggestion about using maven-jar-plugin is very good, cause it looks a little bit that you are misusing the maven-assembly-plugin.

In the most recent versions of maven-assembly-plugin you should . as the root folder. If you use / you will get a warning.

Add the element to the assembly like so.

<assembly>
    <id>js-jar</id>
    <formats>
        <format>jar</format>
    </formats>

    <baseDirectory>myBaseDir</baseDirectory>

    <fileSets>
        <fileSet>
            <directory>src/main/resources/</directory>  
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>META-INF/**/*</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>

If you turn the <includeBaseDirectory> off then your archive won't have any root. So it depends on what you want. I prefer my zip files, for instance, to have a base directory so that it doesn't accidentally pollute a directory your in if you forget to create the dir and cd into it before unzipping. Much more convenient too.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM