我有一个简单的弹簧控制台应用程序,取决于spring-data-mongodb。当我通过Eclipse(Run As - > Java Application)执行main方法时,app运行正常,但是当我打包为单个jar时,我得到了
Exception in thread "main" org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/data/mongo]
要创建我使用maven程序集插件的单个jar
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>au.com.myapp.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
和maven命令
mvn clean package assembly:single
我已经检查了spring-data-mongodb jar里面的所有maven依赖项类都被复制了,包括spring-mongo.xsd。我也尝试过使用-cp .
并在我的单个jar中添加spring-data-mongodb.jar但这不起作用
如何解决此问题/我还可以做些什么来调试它
答案 0 :(得分:0)
发生此问题是因为使用程序集插件创建“uber jar”时,每个依赖关系jar的META-INF文件夹的内容会相互重叠。
例如spring-data-mongodb有META-INF / spring.handlers文件声明了命名空间处理程序,在我的例子中它被另一个spring jar覆盖
从这个事实我已经总结使用程序集插件来创建超级jar并不是一个好方法。因此,我使用原始应用程序jar并将其所有依赖项放在单独的文件夹
上这可以通过使用maven-dependency-plugin来实现,如下所示。所有依赖项将被复制到目标/依赖项(默认情况下绑定到进程资源阶段)
<!-- Copy all dependencies (including transitive) into target/dependency folder -->
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>copy-dependencies</goal>
</goals>
</execution>
</executions>
</plugin>
然后在命令行上,我使用-cp
参数(Windows)
java -cp "myapp.jar;dependency/*" com.mycompany.MainClass
当然,我必须在部署到生产服务器时删除并重新复制整个依赖关系文件夹,以避免运行时依赖性不匹配