I have a Java project that is compiled using Maven and at the end maven-assembly-plugin is used to pack compiled JAR files, DLLs etc into 10 different ZIP files. Every ZIP file is for different environment (has different DLLs), but their content is generally identical.
Now I use 10 different assembly.xml files that are used to create those 10 ZIP files.
Problem is that those XMLs are almost identical, the only difference is 1 word in path of DLLs. Example of such a file: (In reality it is much longer)
<assembly>
<id>{someVariable}</id>
<formats>
<format>zip</format>
</formats>
<fileSets>
<!-- Copying DLLs: -->
<fileSet>
<directory>target/dll/{someVariable}</directory>
<outputDirectory>dll</outputDirectory>
<includes>
<include>*.dll</include>
</includes>
</fileSet>
</fileSets>
</assembly>
As you can see, I would like to use {someVariable}
on more places which is the desired functionality but I cannot make it work. Hopefully it is possible and this is the core of my question. I want to use the same assembly.xml
file and execute it 10x always with different value of {someVariable}
like this:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>make-the-zip</id>
<goals>
<goal>single</goal>
</goals>
<phase>package</phase>
<configuration>
<descriptors>
<descriptor>src/assembly/myCommonAssembly.xml</descriptor>
</descriptors>
<properties>
<someVariable>my-value</someVariable>
</properties>
</configuration>
</execution>
</executions>
</plugin>
Is it possible? FYI: Section <properties>
does not work, I am just trying to show what I would like to do.
I know that I can create the properties in poml.xml
and use them in assembly.xml
but it does not solve my problem, because I still would have to create 10 different assembly.xml files.
This is the best advice I have found, but it is not the answer.
You can use the iterator-maven-plugin
, in order to iterate over all your different property values. This Mojo has an iterator
goal which enables to iterate over a set of given properties, and adds them as as Maven property:
The iterator-maven-plugin will inject the current value as a property which means you can use this property to parameterize your build.
In your case, you could have:
<plugin>
<groupId>com.soebes.maven.plugins</groupId>
<artifactId>iterator-maven-plugin</artifactId>
<version>0.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>iterator</goal>
</goals>
<configuration>
<items>
<item>my-value-1</item>
<item>my-value-2</item>
<item>my-value-3</item>
</items>
<pluginExecutors>
<pluginExecutor>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.6</version>
</plugin>
<goal>single</goal>
<configuration>
<descriptors>
<descriptor>${project.basedir}/src/assembly/myCommonAssembly.xml</descriptor>
</descriptors>
</configuration>
</pluginExecutor>
</pluginExecutors>
</configuration>
</execution>
</executions>
</plugin>
At the package
phase, this configuration will iterate over the 3 given values, my-value-1
to my-value-3
, and execute each time the Maven Assembly Plugin. For a given execution, it is possible to retrieve the current iterated value with ${item}
. As such, your common assembly descriptor would become:
<assembly>
<id>${item}</id>
<formats>
<format>zip</format>
</formats>
<fileSets>
<!-- Copying DLLs: -->
<fileSet>
<directory>target/dll/${item}</directory>
<outputDirectory>dll</outputDirectory>
<includes>
<include>*.dll</include>
</includes>
</fileSet>
</fileSets>
</assembly>