我在由maven管理的java项目中使用spring和hibernate。我使用以下命令创建了一个程序集(带有依赖项的 jar mvn install assembly:assembly
现在,当我尝试使用命令运行我的主类时:java -cp xyz-1.0-SNAPSHOT-jar-with-dependencies.jar com.xyz.class
然后我收到以下错误:
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/data/jpa]**
Offending resource: class path resource [xyz-component-scans-config.xml]
at org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:68)
at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:85)
at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:76)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.importBeanDefinitionResource(DefaultBeanDefinitionDocumentReader.java:271)
.
.
我不明白为什么它找不到命名空间处理程序? 因为我已经在 pom 中有了以下依赖项。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>3.1.0.RELEASE</version
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.0.2.RELEASE</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.1.0.RELEASE</version>
<scope>compile</scope>
</dependency>
我确实尝试了以下线程中的建议,但它对我不起作用。无法找到 XML 模式命名空间的 Spring 命名空间处理程序 [http://www.springframework.org/schema/data/jpa]
org.springframework.beans.factory.parsing.BeanDefinitionParsingException 的源代码
你最好使用 maven-shade-plugin 来创建带有依赖项的 jar。以下是如何使用该插件的示例:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals><goal>shade</goal></goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.stackexchange.stackoverflow.ExecutableJar</mainClass>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
根据我的经验,maven-shade-plugin是创建uber罐子的最佳方式。有关更完整的示例,请参阅我的其他 SO 答案。请注意,此示例不需要任何第三方 jar,但 maven-shade-plugin 确实可以很好地处理它们。试一试!:-)
我为此使用了[one-jar]插件(https://code.google.com/p/onejar-maven-plugin/)。
我遇到了同样的问题;即 maven 程序集弄乱了我的 spring.schema 文件。(众所周知,Maven的插件可以做到这一点(来自遇到相同问题的其他人的春季论坛链接))。
如果你真的想知道这里发生了什么,请展开你的.jar文件并查看spring.schema和spring.handlers文件。看看 maven 的汇编插件的产品,阅读这个(需要了解 spring.handlers 和 spring.schemas)堆栈溢出帖子,解释如何使用这些文件。
确保你的WEB-INF/lib文件夹中有Spring jar吗?
并确保仅存在 1 个版本。
如果它仍然不起作用,除了您已经粘贴的正文部分之外,如果您可以附加配置的标题,这将很有帮助。
我不太熟悉 maven 程序集的目标,但您将这些依赖项的范围限定为仅编译时间这一事实可能意味着这些依赖项不包含在程序集中。你能尝试删除:
<scope>compile</scope>
依赖项声明中的部分?