Is it possible to rename a maven jar-with-dependencies?

JavaMaven 2JarMaven Assembly-Plugin

Java Problem Overview


I'm currently using the jar-with-dependencies assembly to create such a jar. However, the name of my jar is a bit long.

Since this jar is being used by RPG programs on an AS400, I'd like to shorten it to make life a bit easier for those developers. But, other than by hand, I've not found a way to rename the jar from the usual project-name-version-classifier-jar-with-dependencies.jar. I'd like something like project-name-version-classifier-full.jar

Is there anyway to do this without basically copying the jar-with-dependencies assembly descriptor and calling it full?

Additionally, I want to continue to have the jar without the classpath assembled stored in the repository.

I need two artifacts. The jar with my classifier holding the region which the build is for. The jar with all dependencies which also includes the region.

project-name-version-region-full.jar and project-name-version-region.jar should be stored in the repository. In the first example the classifier is region-full, in the 2nd it's region. The latter is working.

Java Solutions


Solution 1 - Java

You can specify the finalName property to give the jar the name you want, and specify that appendAssemblyId should be false to avoid the "jar-with-dependencies" suffix.

The configuration below will output a jar called "test.jar"

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>2.2-beta-4</version>
  <executions>
    <execution>
      <id>jar-with-dependencies</id>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
      <configuration>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <finalName>test</finalName>
        <appendAssemblyId>false</appendAssemblyId>
      </configuration>
    </execution>
  </executions>
</plugin>

Update: based on your comments, using the built-in descriptor won't work . I believe this is down to a bug in the recent versions of the assembly-plugin - they've removed support for classifiers, but the id is fixed if you use a built-in descriptor, so you end up with a big daft name.

As a workaround, you can copy the assembly descriptor used by the jar-with-dependencies descriptor and modify the id.

This example would result in the assembly id being appended to the finalName, so if you need to have a name of region-full.jar, you can specify the finalName as region and the assembly id as full. This will result in a file in target called region-full.jar, but note it will still be installed to the Maven repository as an attached artifact with full used as the classifier. As long as this id is different to that for your other assembly there should be no collision though.

The pom configuration would look like this.

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>2.2-beta-4</version>
  <executions>
    <execution>
      <id>jar-with-dependencies</id>
      <phase>prepare-package</phase>
      <goals>
        <goal>single</goal>
      </goals>
      <configuration>
        <descriptors>
          <descriptor>src/main/assembly/jar-assembly.xml</descriptor>
        </descriptors>
        <finalName>region</finalName>
      </configuration>
    </execution>
  </executions>
</plugin>

and the jar-assembly.xml in src/main/assembly like this:

<assembly>
  <id>full</id>
  <formats>
    <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <unpack>true</unpack>
      <scope>runtime</scope>
    </dependencySet>
  </dependencySets>
  <fileSets>
    <fileSet>
      <directory>${project.build.outputDirectory}</directory>
    </fileSet>
  </fileSets>
</assembly>

Solution 2 - Java

I think I've found a way to configure this directly in the pom without needing a separate jar-assembly.xml.

It's basically the same as Rich's answer, except the finalName is specified with the artifactId and version.

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <finalName>${project.artifactId}-${project.version}-full</finalName>
        <appendAssemblyId>false</appendAssemblyId>
        <archive>
            <manifest>
                <mainClass>com.mycompany.MyMainClass</mainClass>
            </manifest>
        </archive>
    </configuration>
    <executions>
        <execution>
            <id>make-my-jar-with-dependenciess</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Solution 3 - Java

Thanks to the posts here and some digging in the maven docs I've come up with the following configuration for a general one-off repacked executable jar assembly with a custom name.

In pom.xml:

<plugin>
	<artifactId>maven-assembly-plugin</artifactId>
	<version>2.2</version>
	<executions>
		<execution>
			<id>exe</id>
			<phase>package</phase>
			<goals><goal>single</goal></goals>
			<configuration>
				<finalName>MyJarName</finalName>
				<attach>false</attach>
				<appendAssemblyId>false</appendAssemblyId>
				<descriptors>
					<descriptor>assembly.xml</descriptor>
				</descriptors>
				<archive>
					<manifest>
						<mainClass>karlthepagain.MyMain</mainClass>
					</manifest>
				</archive>
			</configuration>
		</execution>
	</executions>
</plugin>

In assembly.xml:

<assembly>
	<id>exe</id>
	<formats>
		<format>jar</format>
	</formats>
	<includeBaseDirectory>false</includeBaseDirectory>
	<dependencySets>
		<dependencySet>
			<outputDirectory>/</outputDirectory>
			<unpack>true</unpack>
			<scope>runtime</scope>
		</dependencySet>
	</dependencySets>
</assembly>

This will produce MyJarName.jar with all of its dependencies re-packaged into that same jar and the specified Main-Class: karlthepagain.MyMain.

Solution 4 - Java

It is also possible to overwrite the original jar file by using ${project.build.finalName} as final name:

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
   <executions>
      <execution>
          <phase>package</phase>
          <goals>
             <goal>single</goal>
          </goals>
      </execution>
   </executions>
   <configuration>
     <descriptorRefs>
       <descriptorRef>jar-with-dependencies</descriptorRef>
     </descriptorRefs>
     <finalName>${project.build.finalName}</finalName>
     <appendAssemblyId>false</appendAssemblyId>
   </configuration>
 </plugin>

Solution 5 - Java

I'm going to give Rich the credit for pointing me in the right direction, but wanted to post the solution that worked for me as Rich's was slightly off:

My jar-assembly.xml looked like this which allowed the assembly id to change for the region which was stored as an property in my profile:

<assembly>
  <id>${env}-full</id>
    <formats>
      <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
      <dependencySet>
        <unpack>true</unpack>
        <scope>runtime</scope>
      </dependencySet>
    </dependencySets>
    <fileSets>
      <fileSet>
        <directory>${project.build.outputDirectory}</directory>
      </fileSet>
    </fileSets>
</assembly>

I did not use the finalName parameter in the maven-assembly-plugin settings as this built my project with my project-name-version-env-full.jar name where env-full was the classifier.

Imagine my surprise when I learned the assembly xml could be parameterized by items in the build. This was exactly what I was looking for.

Solution 6 - Java

This worked for me

<build>
	<finalName>anynameyoulike</finalName>
	<plugins>			
		<plugin>
			<artifactId>maven-assembly-plugin</artifactId>
			<version>2.6</version>
			<configuration>
				<descriptorRefs>
					<descriptorRef>jar-with-dependencies</descriptorRef>
				</descriptorRefs>					
				<appendAssemblyId>false</appendAssemblyId>
				<archive>
					<manifest>
						<mainClass>com.mycompany.MyMainClass</mainClass>
					</manifest>
				</archive>
			</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>
	</plugins>
</build>

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMike CornellView Question on Stackoverflow
Solution 1 - JavaRich SellerView Answer on Stackoverflow
Solution 2 - JavavikingsteveView Answer on Stackoverflow
Solution 3 - JavaKarl the PaganView Answer on Stackoverflow
Solution 4 - JavaMark SchäferView Answer on Stackoverflow
Solution 5 - JavaMike CornellView Answer on Stackoverflow
Solution 6 - Javaumesh9883View Answer on Stackoverflow