Create a .gz file using maven - maven

Maven assembly doesn't seem to support gz format. http://maven.apache.org/plugins/maven-assembly-plugin/
I can't change to use tar.gz or something else as .gz has been hard coded in some scripts that I don't have permissions to update.
Any idea would be much appreciated?

Are you sure it doesn't support tar.gz?
I think if you do this:
<assembly>
<id>bundle</id>
<formats>
<format>tar.gz</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>src/main/output</directory>
<outputDirectory>output</outputDirectory>
</fileSet>
</fileSets>
</assembly>
Then if you do this: mvn clean assembly:assembly then Maven should create a tar.gz file.
What is the result you got?

Related

Can Maven package a WAR as .tar.gz?

I'm building a WAR application in Maven and I need to deploy it to Docker. The issue is that docker doesn't support the zip format (but can use a .tar.gz or .tar.xz).
So, how can I package my mywebapp-1.0.0.war as mywebapp-1.0.0.tar.gz?
We have this requirement so it would become easier to perform the hardening steps for the docker image.
I tried using the Assembly plugin and it produces a target/mywebapp-1.0.0.tar.gz. However, it ends up placing the whole WAR file inside a .tar.gz file, and NOT its contents. Here's my assembly.xml file:
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0
http://maven.apache.org/xsd/assembly-2.0.0.xsd">
<id>distribution</id>
<formats>
<format>tar.gz</format>
</formats>
<fileSets>
<fileSet>
<outputDirectory>/</outputDirectory>
<includes>
<include>target/mywebapp-1.0.0.war</include>
</includes>
</fileSet>
</fileSets>
</assembly>
Although I find the requirement strange (the application server should unpack your war, not you), I guess it is possible by tarring the directory in target that is used to build the war.
Before the package step, all the files for the war are gathered in a directory just below target (I forgot the name, but it should be easy to reverse engineer) - just pack that directory by using the assembly plugin.
Edit by the OP:
I wanted to accept this answer but I also wanted it to be useful to someone else so I added the working solution (assembly.xml file). Here it is:
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0
http://maven.apache.org/xsd/assembly-2.0.0.xsd">
<id>docker</id>
<formats>
<format>tar.gz</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>target/${project.build.finalName}</directory>
<outputDirectory>.</outputDirectory>
</fileSet>
</fileSets>
</assembly>
This solution generates the file target/mywebapp-1.0.0-docker.tar.gz in addition to the typical war file.
Notice it added the docker classifier.

Maven assembly plugin: include file without taking its path folders

I'm using maven-assembly-plugin to include files from a dependency ZIP (also generated with assembly plugin) into a final release ZIP file.
The issue is that I want to select which files from the dependency to get, but not copying the folder path where those files are. Just the files.
For example:
<assembly>
<formats>
<format>zip</format>
<format>dir</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<includes>
<include>package:artifactId:zip:*</include>
</includes>
<outputDirectory>sql/update/01.00.00_to_01.01.00</outputDirectory>
<unpack>true</unpack>
<unpackOptions>
<includes>
<include>oracle/update/1_alter_schema.sql</include>
<include>oracle/update/2_insert_data.sql</include>
</includes>
</unpackOptions>
<useProjectArtifact>false</useProjectArtifact>
<useTransitiveDependencies>false</useTransitiveDependencies>
</dependencySet>
</dependencySet>
</assembly>
This copies the required files like this:
sql/update/01.00.00_to_01.01.00/oracle/update/1_alter_schema.sql
sql/update/01.00.00_to_01.01.00/oracle/update/2_insert_data.sql
I would like to copy just the files without the original oracle/update/ folder, resulting in this folder structure:
sql/update/01.00.00_to_01.01.00/1_alter_schema.sql
sql/update/01.00.00_to_01.01.00/2_insert_data.sql
The dependency ZIP contains many files used by different projects, therefore the structure to differentiate oracle from sql-server files makes sense there, but for this distribution I don't need those folders, just the files.
Does somebody knows if this is possible with maven-assembly-plugin?
Many thanks in advance!
From the documentation of maven-assembly-plugin (maven-assembly-plugin) I can see that the <fileSets> tag does not provide us with the option of changing the path of an included resource. Instead we can use the <file> tag which gives us this flexibility.
For example, the below configuration will include file1.jar and run.bat in the root folder of the extracted zip file, skipping their original paths.
<assembly>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<files>
<file>
<source>target/file1.jar</source>
<destName>file1.jar</destName>
</file>
<file>
<source>src/main/resources/run.bat</source>
<destName>run.bat</destName>
</file>
</files>
</assembly>
It should work by splitting the dependency unzipping and the file assembly.
Configure the dependency-plugin to unpack the desired dependency before performing the assembly work:
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<configuration>
<includeArtifactIds>project-sql</includeArtifactIds>
<outputDirectory>${project.build.directory}/extract</outputDirectory>
<includes>oracle/update/1_alter_schema.sql,oracle/update/2_insert_data.sql</includes>
</configuration>
<executions>
<execution>
<id>unpack-sql</id>
<phase>prepare-package</phase>
<goals><goal>unpack-dependencies</goal></goals>
</execution>
</executions>
</plugin>
Then, in your assembly-distribution.xml, just assemble from the sub-directory:
<?xml version="1.0" encoding="UTF-8"?>
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>distribution-${project.version}</id>
<formats>
<format>zip</format>
<format>dir</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${project.build.directory}/extract/oracle/update</directory>
<outputDirectory>sql/update/01.00.00_to_01.01.00</outputDirectory>
</fileSet>
</fileSets>
</assembly>
I had the same problem, using dependencies plugin dumped a lot of other files, which I am sure it can be improved. But I think I found a simpler and better solution.
All you need to do is add another <fileSet>. The fileSet has the relative source path and an output directory. The value of your outputDirectory determines the path in the resulting zip. It is as simple as that. Hope this helps someone out there, fighting with producing lambda zips for AWS (rolling my eyes)
Here is my assembly.xml BEFORE(HAS PROBLEM) that I was struggling with:
<assembly>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory></directory>
<outputDirectory/>
<includes>
<include>lib/**.*</include>
<include>${basedir}/target/classes/com/abc/test.LambdaTest.*</include>
</includes>
</fileSet>
</fileSets>
</assembly>
The above produces zip with directory target, but here is an improved and FIXED (CORRECT) which does not have the path "target" in zip.
<assembly>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory></directory>
<outputDirectory/>
<includes>
<include>lib/**.*</include>
</includes>
</fileSet>
<fileSet>
<directory>${basedir}/target/classes</directory>
<outputDirectory/>
<includes>
<include>com/abc/test.LambdaTest.*</include>
</includes>
</fileSet>
</fileSets>
</assembly>
Pay attention to the value of <directory> in both fileSets, which provides a relative path which is not used to when files are added to the zip

Maven: add non-JAR dependency

I'am using the maven-assembly-plugin to create a tar.gz archive. Now I need to include files in that archive. These are just a bunch of plain old text files and are a dependency at runtime, not at compile or (unit) test time.
I thought about adding a maven dependency on that but these files are not stored in a maven repository but in a simple remove folder. To make it even worse, this folder is password protected. I could, in a pre-build-step, download these password-protected files into a local folder. But then there is still the problem of using those files in the assembly. Also, this is extra work I want to avoid.
Is there any way to do that?
If you can download those files, workaround password. Maybe this will help.
Create mod assembly project where you put something like that:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
<id>${artifact.version}</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<useProjectArtifact>false</useProjectArtifact>
<useTransitiveDependencies>true</useTransitiveDependencies>
<unpack>false</unpack>
<excludes>
<exclude>${project.groupId}:*:*</exclude>
</excludes>
<outputFileNameMapping>project${timestamp}_code-${artifact.name}.${artifact.extension}</outputFileNameMapping>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<includes>
<include>readme.txt</include> <!-- here's that plain file -->
</includes>
</fileSet>
</fileSets>
You can include those files in fileSets.
http://maven.apache.org/plugins/maven-assembly-plugin/examples/single/filtering-some-distribution-files.html for more info

Create maven uberjar without including an internal pom file

I have a maven build setup but it has been requested that I make one change to the uberjar and that is to not include the pom file, because it messes up my clients subsequent build that uses my uberjar as a dependancy. I know this is not the way to do this but my client cannot access my central repo because of security issues. So the uberjar was settled on as a deployment method. Now the question is this: Is there a way to not include the pom file in the creation of a jar via maven?
Thanks,
Blair
I assume you are using the maven-assembly-plugin to build your uberjar and using an assembly descriptor. What you want to do is instruct the assembly plugin (via the assembly descriptor) to exclude any files named "pom.xml". For example:
<assembly>
<id>bin</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>target/classes</directory>
<outputDirectory>/</outputDirectory>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
<unpack>true</unpack>
<unpackOptions>
<excludes>
<exclude>**/pom.xml</exclude>
</excludes>
</unpackOptions>
<scope>runtime</scope>
<useProjectArtifact>false</useProjectArtifact>
</dependencySet>
</dependencySets>
</assembly>
The key here is the "unpackOptions" section and the exclusion contained therein.
Hope that helps, if so please remember to mark my answer as correct so I get the reputation points.

Deploy Akka java microkernel with maven

I am trying my hands on JCranky's tutorials about distributing akka microkernel with maven and tbt start scripts click. from the descriptor.xml file I suppose there are four directories to be created by the assembly pluggin.
below is the descriptor.xml file
<id>akka</id>
<formats>
<format>zip</format>
</formats>
<fileSets>
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory>/deploy</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<outputDirectory>/lib</outputDirectory>
</dependencySet>
</dependencySets>
<files>
<file>
<source>src/main/start</source>
<outputDirectory>/bin</outputDirectory>
</file>
<file>
<source>src/main/resources/application.conf</source>
<outputDirectory>/config</outputDirectory>
</file>
</files>
</assembly>
The following directories are created in the zip folder. that is the lib, config and bin directories. Reading from the descriptor.xml file , looks like the deploy directory has to be created. don't know if I am missing something. Will be very happy for a clarification.
You have the wrong directory in the fileset.
Change to:
<directory>${project.build.directory}</directory>
It cannot find any files in the place you stated. Thus no files were copied and the deploy directory didn't have to be created.

Resources