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

About ChandanPandey

Try to come up with a good design as by product of good coding practices

Posted on June 6, 2012, in Spring and tagged , . Bookmark the permalink. 4 Comments.

  1. nice post ….

  2. thanks Chandan. I am working on decoupling configurations from spring implementation and this post is helping me. what I didn’t understand is what is the mainClass?

    com.usat.digitalportal.service.impl.BootStrap

    In my app, the configs are loaded using below code snippet in dao-service.xml

    How to set this in classpath? An alternative I found is to use “file:” for the value field of location property.

  3. @anistech, I do not see the code snippet, but I provided main class because my application was a independent java jar which needed to be run from command prompt (Not inside any container) .. it has nothing to do with segregation of libs. If you deploy ur program in container then similar can be achieved using @postconstruct .. and no need to add main class in manifest..

  4. can you see it now?
    dao-service.xml:
    <bean class=”org.springframework.beans.factory.config.PropertyPlaceholderConfigurer”/>
    <property name=”location” value=”classpath:db-configuration.properties”/>
    <property name=”placeholderPrefix” value=”$dao{“>
    </bean>

    can you please give some examples for postconstruct if possible? I am a newbie to spring.
    Thanks

Leave a comment