场景:使用Idea 把依赖spring、alidruid连接池 jar的java 工程,打成一个可运行的jar (形如 java -jar xxx.jar)。
方法:参考了一些帖子,Maven生成可以直接运行的jar包的多种方式 和 使用Idea打jar包 大概有几种方法:1、使用Idea工具本身打jar 2、使用maven插件。
问题:使用以上几种方法,打出一个xx.jar包,已经把依赖的spring jar、ali jar打进xx.jar去了。在使用java -jar xx.jar运行的时候,spring报错:spring加载配置文件applicationContext.xml出错,抛出nested exception is og.xml.sax.SAXParseException; lineNumber: 12; columnNumber: 47; cvc-elt.1: 找不到元素 'beans' 的声明r的异常信息
查了很多帖子,大多说此问题是因为spring xml 头信息与spring版本不同引起的。其实不然。 解压缩xx.jar 发现,spring.handlers 和 spring.schemas 两个文件中只有ali druid的配置,spring本身的配置信息没有了,由此断定上面的报错是因为在打包时,连接池的配置覆盖了spring的导致spring xsd无法解析。
那如何解决呢? 使用maven-assembly-plugin来打包或者idea,包含所依赖的所有jar的内容(这些jar包会被解开)。 换了spring-boot插件,包含所依赖的所有的jar包(这些jar包不会被解开)。问题解决!!!
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.5.6.RELEASE</version>
<configuration>
<mainClass>xxx.Main</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
参考SpringBoot入门之spring-boot-maven-plugin 和 maven打包可运行的fat-jar的简单方法