Introduction
In this post we will discuss about replacing the multiple tokens in XML file using maven-resources-plugin
. Situation may occur where you need to replace some place holders in the XML file during build of your application and need to create a zip file under the target directory, then you may use this example as a reference. Such XML files or zip file may be required for configuring the application or project. We will use here maven-assembly-plugin
to build the zip file under target directory.
Prerequisites
Eclipse 4.12, Maven 3.6.1, Java 12(or 8)
Creating Project
Create a maven based standalone project with the following details:
Group Id: com.roytuts
Artifact Id: maven-replace-token-xml
Sample XML File
Let’s say we have the below sample XML file – test.xml under xml folder under the project directory.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<config sharedLib="library">
<cores adminPath="/admin" hostPort="${jetty.port}"
hostContext="${hostContext}">
<core name="activeCustomers" instanceDir="activeCustomers"
dataDir="[[search.home]]/activeCustomers" />
<core name="carriers" instanceDir="carriers"
dataDir="[[search.home]]/carriers" />
<core name="cities" instanceDir="cities"
dataDir="[[search.home]]/cities" />
<core name="customerAddresses" instanceDir="customerAddresses"
dataDir="[[search.home]]/customerAddresses" />
<core config="config.xml" name="servicerequest_questions_en"
instanceDir="servicerequest_questions_en" schema="schema.xml"
dataDir="[[search.home]]/servicerequest_questions" />
</cores>
</config>
In the above file we see there are two types of place holders – ${..}
and [[...]]
.
In your XML file you can have only one or more place holders like these.
So we will replace those place holders with required values during maven build.
At the same time we will also copy the XML file after replacement into a new file under target/config directory.
Finally we will build the zip directory using maven-assembly-plugin
.
Creating Assembly Config
We will create an assembly.xml file under the project root directory with the below content.
You may find more on assembly configuration here.
<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>zip</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>target/config</directory>
<useDefaultExcludes>true</useDefaultExcludes>
<outputDirectory>./</outputDirectory>
</fileSet>
</fileSets>
</assembly>
Updating Build File – pom.xml
Update the default generated pom.xml file to include the required plugins.
In the below pom.xml file we have defined properties to be replaced for the place holders in XML file.
This project does not have any other resources so it does not include any dependency.
<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>com.roytuts</groupId>
<artifactId>maven-replace-token-xml</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<jetty.port>9988</jetty.port>
<hostContext>localhost</hostContext>
<search.home>/web/SearchIndex</search.home>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>12</source>
<target>12</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>target/config</outputDirectory>
<resources>
<resource>
<directory>xml</directory>
<filtering>true</filtering>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
<delimiters>
<delimiter>${*}</delimiter>
<delimiter>[[*]]</delimiter>
</delimiters>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<finalName>configuration</finalName>
<descriptors>
<descriptor>${basedir}/assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>create-archive</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
In the above file we included maven-compiler-plugin
for our Java resources, though it is not required for this project as there is no Java resource file.
The important plugin is maven-resources-plugin
here that does the required job for filtering or replacements and copy the resource into new file under target/config folder.
We specify the goal
as copy-resources
because we will copy the XML file after replacement into the output directory target/config.
We specify the resource directory xml from where filtering will be applied to the XML file.
Notice we have added two delimiters as the place holders are specified by those two delimiters in the XML file.
Finally we have added maven-assembly-plugin
to create zip file for the new XML file.
You may find more on assembly configuration and creating zip file using maven-assembly-plugin
here.
Building the Project
If you execute mvn install
in command line tool or from Eclipse Run As -> Maven install
, then you will see the following changes on the original file under target/config directory.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<config sharedLib="library">
<cores adminPath="/admin" hostPort="9988"
hostContext="localhost">
<core name="activeCustomers" instanceDir="activeCustomers"
dataDir="/web/SearchIndex/activeCustomers" />
<core name="carriers" instanceDir="carriers"
dataDir="/web/SearchIndex/carriers" />
<core name="cities" instanceDir="cities"
dataDir="/web/SearchIndex/cities" />
<core name="customerAddresses" instanceDir="customerAddresses"
dataDir="/web/SearchIndex/customerAddresses" />
<core config="config.xml" name="servicerequest_questions_en"
instanceDir="servicerequest_questions_en" schema="schema.xml"
dataDir="/web/SearchIndex/servicerequest_questions" />
</cores>
</config>
You will also see a zip file configuration.zip has been created under target folder. If you open the zip file you will see that test.xml file is there inside this zip file.
Source Code
Thanks for reading.