当app打包为单个jar时,找不到Mongo NamespaceHandler

时间:2013-06-03 02:24:52

标签: spring mongodb

我有一个简单的弹簧控制台应用程序,取决于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但这不起作用

如何解决此问题/我还可以做些什么来调试它

1 个答案:

答案 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

当然,我必须在部署到生产服务器时删除并重新复制整个依赖关系文件夹,以避免运行时依赖性不匹配