Blog Archives

Moving property files outside jar in spring standalone application


In one of Spring standalone project, we needed to move the property files out of the jar for easy configurability.
I followed following steps:
1. Move property files out of JAR and put in a directory say “target/lib”

		<plugin>
	           <artifactId>maven-antrun-plugin</artifactId>
	           <executions>
	             <execution>
	               <phase>validate</phase>
	               <goals>
	                 <goal>run</goal>
	               </goals>
	               <configuration>
	                 <tasks>
				<copy todir="target/lib" overwrite="true">
					<fileset dir="src/main/resources/">
						<include name="*.properties"/>
						<include name="*.xml"/>
					</fileset>
				</copy>
	                 </tasks>
	               </configuration>
	             </execution>
	           </executions>
        	 </plugin>

2. Exclude inclusion of files from the JAR. This will include only .hbm files in resource and any XML file in META-INF (I wanted to keep application-context.xml used by spring inside JAR)

			<resource>
				<directory>${basedir}/src/main/resources</directory>
				<filtering>true</filtering>	
				<includes>
					<include>**/*.hbm.xml</include>
					<include>META-INF/*.xml</include>
				</includes>
			</resource>

3. Use maven-jar plugin to include class path information in MANIFEST.MF. This one is MOST important

	        <plugin>
	            <groupId>org.apache.maven.plugins</groupId>
	            <artifactId>maven-jar-plugin</artifactId>
	            <configuration>
	                <archive>
	                    <manifest>
	                        <addClasspath>true</addClasspath>
	                        <classpathPrefix>lib/</classpathPrefix>
                                       <mainClass>
                                             com.usat.digitalportal.service.impl.BootStrap
                                        </mainClass>
	                    </manifest>
	                    <manifestEntries>
           					 <Class-Path>. lib</Class-Path>
        			</manifestEntries>
	                </archive>
	            </configuration>
	        </plugin> 

a. Use “classpathPrefix” to specify folder name in which all properties will be placed.
b. Use “Class-Path” to specify the folder. “.” Indicate current folder, while “lib” specifies “lib” folder in same directory as JAR (I have used lib).
4. Changes in spring application-context.xml
a. Add line to look for property file in declared class path

<context:property-placeholder location="classpath*:**/settings.properties, classpath*:**/usat.properties” />	   

b. Add line to import resources from class path

		<import resource="classpath*:**/dao-config.xml"/>	 

This is all which is needed. Run maven target as –X clean install and it should Generate a lib folder