加载类路径中 jar 内的 spring 应用程序上下文文件

Posted

技术标签:

【中文标题】加载类路径中 jar 内的 spring 应用程序上下文文件【英文标题】:Loading spring application context files that are inside a jar in classpath 【发布时间】:2011-06-10 07:27:47 【问题描述】:

我正在尝试在我的 java 独立代码中使用 ClassPathXmlApplicationContext 来加载我的类路径中的 jar 文件中的 applicationContext.xml。

ApplicationContext context = new ClassPathXmlApplicationContext("classpath*:**/applicationContext*.xml");

applicationContext.xml条目如下,

 <bean id="myAdder" class="com.foo.bar.MyAdder">
        <property name="floatAdder" ref="floatAdder"/>        
    </bean>

而且,当我尝试以这种方式加载 bean 时,我得到了 NoSuchBeanException。不能用这种方式加载一个bean吗?

jar 文件作为 maven 依赖项添加到我的类路径中。当我在 Eclipse 中看到此项目的 Java 构建路径时,我看到此 jar 链接为 M2_REPO/.../..

我假设我可以将 bean 加载到 jar 文件中,因为 jar 以这种方式位于类路径中。我错过了什么吗?

谢谢,阿比

【问题讨论】:

你能把你的代码贴在你尝试实例化 appContext 的地方吗? @abalogh:我已经用我正在使用的代码行编辑了帖子 这似乎没问题,而且您得到的异常似乎表明问题不在于创建 appContext,而是从中获取 bean。你是怎么得到这个bean的,也请把它的定义贴在applicationContext.xml中 @abalogh:添加了它..这实际上让我想知道 Eclipse“Java 构建路径”是否与 CLASSPATH 相同:-( @abalogh:我在已构建为 JAR 的项目中的测试类中添加了相同的 bean 加载方式。它就像魅力一样。 IE。例如 A.jar 在项目 B 的 Java 构建路径中设置为 Maven 依赖项 -> 从 A.jar 中的 applicationContext.xml 在项目 B 内的代码中加载的 bean 不起作用。我尝试在同一个项目中加载 bean A 工作正常。我相信这不是映射的问题,也不是配置的问题..如果我没记错的话.. 【参考方案1】:

这应该可行,我刚刚创建了 2 个项目并进行了检查。

项目 A(使用 STS 创建的标准 Maven 项目)在 src/main/resources 中有 applicationContext.xml

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.D</groupId>
<artifactId>A</artifactId>
<version>0.0.1-SNAPSHOT</version>

<properties>        
    <spring.version>3.0.5.RELEASE</spring.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>$spring.version</version>
    </dependency>
</dependencies>
</project>

applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="myAdder" class="com.foo.bar.MyAdder">
    <property name="foo" value="bar" />
</bean>

</beans>

项目 B:

pom.xml:与A相同,除了A被添加为依赖项:

<dependency>
   <groupId>org.D</groupId>
   <artifactId>A</artifactId>
   <version>0.0.1-SNAPSHOT</version>
</dependency>

项目B中的Start.java:

public static void main(String[] args) 
    ApplicationContext context = new ClassPathXmlApplicationContext(
            "classpath*:**/applicationContext*.xml");

    MyAdder myAdder = (MyAdder) context.getBean("myAdder");
    System.out.println(myAdder.getFoo());

先mvn install A,然后在项目B中运行Start。

【讨论】:

非常感谢。我无法弄清楚问题是什么。我刚刚清理了所有转储项目并从头开始重新创建的东西,它可以工作。您的回复澄清了我的问题,我对此投了赞成票。【参考方案2】:

您真的需要该位置的classpath*: 前缀吗? (这 * 合法吗?)我本来期望的更像是:

ApplicationContext context = new ClassPathXmlApplicationContext("**/applicationContext*.xml);

【讨论】:

试过了,还是不行。我得到相同的 NoSuchBeanDefinitionException 遇到了类似的问题,遇到了这篇文章。 classpath*: 的解释可以在这里找到:static.springsource.org/spring/docs/current/… 非常感谢,我编写了一个模块化应用程序,它对我有用

以上是关于加载类路径中 jar 内的 spring 应用程序上下文文件的主要内容,如果未能解决你的问题,请参考以下文章

spring classpath:和classpath*:区别和实际应用

Spring 应用程序无法加载 JDBC 驱动程序类 [oracle.jdbc.driver.OracleDriver]

Spring Boot在部署到Tomcat期间无法加载外部jar

Jar 中的 @PropertySource 用于类路径上的外部文件

Java_Java中动态加载jar文件和class文件

从类路径加载 jar 的 context.xml