web-dev-qa-db-fra.com

Chargement des fichiers de contexte d'application Spring qui se trouvent dans un bocal dans classpath

J'essaie d'utiliser ClassPathXmlApplicationContext dans mon Java code autonome pour charger applicationContext.xml qui se trouve dans un fichier jar qui se trouve dans mon chemin de classe.

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

entrée applicationContext.xml comme suit,

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

Et, lorsque j'essaie de charger un bean de cette façon, j'obtiens NoSuchBeanException. Un bean ne peut-il pas être chargé de cette manière?

Le fichier jar est ajouté à mon chemin de classe en tant que dépendance maven. Quand je vois le Java Build Path dans Eclipse pour ce projet, je vois ce pot lié comme M2_REPO /.../ ..

Je supposais que je pouvais charger le bean dans le fichier jar car le jar est dans classpath de cette façon. Suis-je en train de manquer quelque chose?

Merci, Abi

28
Abhishek

Cela devrait fonctionner, j'ai juste créé les 2 projets et vérifié.

Le projet A (projet Maven standard créé avec STS) a applicationContext.xml dans 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>

Projet B:

pom.xml: identique à A, sauf que A est ajouté en tant que dépendance:

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

Start.Java dans le projet 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 install A d'abord, puis exécutez Start dans le projet B.

35
abalogh

Avez-vous vraiment besoin du classpath*: préfixe sur cet emplacement? (Est-ce * légal?) Je m'attendais à quelque chose de plus:

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