Friday evening I tried in vain to package up my deployable Spring JAR file using the standard maven assembly plugin using the given configuration as seen below with no luck. I kept getting hit by spring throwing exceptions when trying to run the JAR file as the spring.shemas and spring.handler files where incorrect. It seems that when maven builds the package, it keeps overwritting the shemas and handlers files and by the end of the build they are both missing elements.
Exception in thread "main" org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 8 in XML document from class path resource [spring/spring-dataCleansing.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'beans'.
maven-assembly-plugin jar-with-dependencies com.some.package.Main true META-INF/spring.handlers META-INF/spring.schemas make-assembly package attached
It turns out this is a known bug and quite well documented. See: http://jira.codehaus.org/browse/MASSEMBLY-360.
So I turned my attention to maven shade plugin to build and package my JAR file, this only worked straight away.
My final maven shade plugin configuration is as follows:
org.apache.maven.plugins maven-shade-plugin 1.4 package shade com.some.package.Main META-INF/spring.handlers META-INF/spring.schemas *:* META-INF/*.SF META-INF/*.DSA META-INF/*.RSA
Using org.apache.maven.plugins.shade.resource.AppendingTransformer allows for the shade plugin to merge all spring.schemas and spring.handlers files into a single entry for each. I use the filters section to exclude particular files which would cause and Security exception to be thrown. The files are from javax.mail package.
It produces three jar files once built:
- original-ProjectName.jar - The package application without dependencies.
- ProjectName-shade.jar - The none shaded application with dependencies.
- ProjectName.jar - The shaded application with dependencies. (i.e. a renamed package)
thanks dude...you are a life saver :)
ReplyDelete