0

我有一个简单的 spring 控制台应用程序,取决于 spring-data-mongodb。当我通过 Eclipse(运行方式-> Java 应用程序)执行主要方法时,应用程序运行良好,但是当我打包为单个 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]

要创建单个 jar,我使用了 maven 程序集插件

<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 但这不起作用

我该如何解决这个问题/我还能做些什么来调试它

4

1 回答 1

0

发生此问题是因为当使用程序集插件创建“uber jar”时,每个依赖项 jar 的 META-INF 文件夹的内容相互重叠。

例如 spring-data-mongodb 有 META-INF/spring.handlers 文件,它声明了命名空间处理程序,在我的例子中,它被另一个 spring jar 覆盖了

从这个事实我得出结论,使用程序集插件来创建一个 uber 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

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

于 2013-06-03T05:33:45.130 回答