我创建了一个项目,它在eclipse上作为一个spring mvn项目开发,但后来不得不添加更多的jar,虽然没有添加mvn,所以我收集了一个文件夹中的所有jar并通过eclipse创建了一个runnable jar并尝试从命令提示符运行,它显示以下错误,它在eclipse中运行:
log4j:WARN No appenders could be found for logger (org.springframework.core.env.
StandardEnvironment).`enter code here`
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" org.springframework.beans.factory.parsing.BeanDefinit
ionParsingException: Configuration problem: Unable to locate Spring NamespaceHan
dler for XML schema namespace [http://www.springframework.org/schema/context]
Offending resource: class path resource
at org.springframework.beans.factory.parsing.FailFastProblemReporter.err
or(FailFastProblemReporter.java:68)
答案 0 :(得分:1)
我建议使用Spring Boot来避免这个问题。使用Spring创建一个可运行的jar是一个令人头疼的问题,主要是因为重叠的spring.schemas
和spring.handler
文件(负责查找NamespaceHandlers
)。当您构建到一个jar时,Maven将覆盖这些文件。
但就目前而言,您可以查看Shade Plugin并使用ResourceTransformers
只要没有重叠,就可以将多个工件中的类/资源聚合成一个超级JAR。否则,需要某种逻辑来合并来自多个JAR的资源。这就是资源变压器的用武之地。
Shade插件网站的代码(后跟评论)
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<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>
</plugins>
</build>
某些jar包含具有相同文件名的其他资源(例如属性文件)。为避免覆盖,您可以选择通过将其内容附加到一个文件来合并它们。一个很好的例子就是聚合弹簧环和丛弹簧罐。它们都有
将所有文件的内容与该特定名称合并META-INF/spring.handlers
文件,Spring用它来处理XML模式命名空间。您可以使用AppendingTransformer
答案 1 :(得分:0)