Загрузка файлов контекста приложения Spring, которые находятся внутри jar в classpath - PullRequest
28 голосов
/ 10 июня 2011

Я пытаюсь использовать ClassPathXmlApplicationContext в моем автономном коде java для загрузки applicationContext.xml, который находится внутри файла jar, который находится в моем пути к классам.

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

запись applicationContext.xml следующим образом,

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

И, когда я пытаюсь загрузить бин таким способом, я получаю NoSuchBeanException.Не может ли bean-компонент загружаться таким образом?

Файл jar добавляется в мой путь к классам как зависимость maven.Когда я вижу Java Build Path в Eclipse для этого проекта, я вижу этот jar-файл, связанный как M2_REPO /.../..

Я предполагал, что могу загрузить bean-компонент внутри файла jar, так как jar находится впуть к классам таким образом.Я что-то упустил?

Спасибо, Аби

Ответы [ 2 ]

35 голосов
/ 10 июня 2011

Это должно работать, я только что создал 2 проекта и проверил.

Проект A (стандартный проект Maven, созданный с помощью STS) имеет applicationContext.xml в src / main / resources.

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>

Start.java в проекте B:

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, затем запустите Start в проекте B.

1 голос
/ 10 июня 2011

Вам действительно нужен префикс classpath*: в этом месте? (Это * законно?) Я бы ожидал что-то вроде:

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