下图是我项目的结构。
我正在使用此方法初始化Spring上下文。
static ApplicationContext context
= new ClassPathXmlApplicationContext("classpath*:context-*.xml");
当我在Intellij IDEA运行main方法时。工作正常。
但是如果我使用Maven将项目打包到jar,并按java -jar wireless-service.jar
我得到了这个输出。
看起来Spring没有找到context-datasource.xml
,context-mybatis.xml
等......
Resolved location pattern [classpath*:context-*.xml] to resources []
Loaded 0 bean definitions from location pattern [classpath*:context-*.xml]
那么,Spring与Maven的正确配置是什么?
修改
这张照片是wireless-server.jar
编辑2
我只是将配置路径更改为classpath*:context.xml
并将context.xml
创建为
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx" default-autowire="byName"
default-lazy-init="false" xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<import resource="context-datasource.xml"></import>
<import resource="context-mybatis.xml"></import>
<import resource="context-resource.xml"></import>
<import resource="context-service.xml"></import>
</beans>
然后我再次运行wireless-server.jar
。
我收到了不同的错误信息:
guration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/context]
Offending resource: URL [jar:file:/root/wireless-server-1.0.0-jar-with-dependencies.jar!/context-mybatis.xml]
通过运行main方法,它在Intellij IDEA中运行良好。
最后
我修改了<build>
中的pom.xml
部分:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>*.xml</include>
<include>*.properties</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.2</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>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Main-Class>${app.main.class}</Main-Class>
<X-Compile-Source-JDK>${maven.compile.source}</X-Compile-Source-JDK>
<X-Compile-Target-JDK>${maven.compile.target}</X-Compile-Target-JDK>
</manifestEntries>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
现在一切正常!
答案 0 :(得分:2)
5.7.2.3与通配符有关的其他说明
请注意&#34; classpath *:&#34;与Ant风格模式结合使用时才有效 除非实际目标文件驻留在文件系统中,否则在模式启动之前至少有一个根目录可靠。这意味着像&#34;类路径*:*。xml&#34;不会从jar文件的根目录中检索文件,而只能从扩展目录的根目录中检索文件。这源于JDK的ClassLoader.getResources()方法的限制,该方法仅返回传入的空字符串的文件系统位置(指示搜索的潜在根)。