2010-05-12 6 views
2

J'ai une classe qui charge un contexte d'application springframework comme ceci:Comment charger un ApplicationContext de springframework de Jython

package com.offlinesupport; 

import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

public class OfflineScriptSupport { 

    private static ApplicationContext appCtx; 

    public static final void initialize() { 
     appCtx = new ClassPathXmlApplicationContext(new String[] { 
       "mycontext.spring.xml" 
     }); 
    } 

    public static final ApplicationContext getApplicationContext() { 
     return appCtx; 
    } 

    public static final void main(String[] args) { 
     System.out.println("Starting..."); 
     initialize(); 
     System.out.println("loaded"); 
    } 
} 

La classe OfflineScriptSupport, et le fichier mycontext.spring.xml sont chacun déployés dans des bocaux séparés (avec d'autres classes et ressources dans leurs modules respectifs). Disons que les fichiers jar sont OfflineScriptSupport.jar et * MyContext.jar "mycontext.spring.xml est mis à la racine du pot.

Dans un script Jython (* myscript.jy"), Je tente d'appeler la méthode initialize pour créer le contexte d'application:

from com.offlinesupport import OfflineScriptSupport 

OfflineScriptSupport.initialize(); 

J'exécuter le script Jython avec la commande suivante (de Linux):

jython -Dpython.path=spring.jar:OfflineScriptSupport.jar:MyContext.jar myscript.jy 

l'application Springframework suite ext ne trouve pas le fichier mycontext.spring.xml. Il affiche l'erreur suivante:

java.io.FileNotFoundException: class path resource [mycontext.spring.xml] cannot be opened because it does not exist 
    at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:137) 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:167) 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:148) 
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:126) 
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:142) 
    at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:113) 
    at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:81) 
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:89) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:269) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:87) 
    at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:72) 
    at com.offlinesupport.OfflineScriptSupport.initialize(OfflineScriptSupport.java:27) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 

Si je lance le pot directement à partir de Java (en utilisant le principal point d'entrée dans OfflineScriptSupport) il fonctionne et il n'y a pas d'erreur jeté.

Y at-il quelque chose de spécial sur la façon dont Jython poignées classpaths faisant ClassPathXmlApplicationContext fonctionnent pas du Springframework (à savoir ne pas être en mesure de trouver des fichiers de ressources dans le classpath)?

Répondre

0

Vous devrez peut-être utiliser la ressource de chemin de classe "/mycontext.spring.xml" à la place pour indiquer un chemin d'accès complet.

+0

Merci pour la suggestion. Je l'ai essayé mais ça donne quand même l'erreur. La référence de ressource fonctionne telle quelle lorsqu'elle est exécutée directement dans Java (en utilisant le point d'entrée 'principal'). J'ai aussi essayé d'utiliser un script groovy et ça marche. Je pense que je vais aller avec groovy. – staticman

0

Assurez-vous que votre chemin de classe est correctement défini. Supposons que votre fichier de contexte d'application se trouve dans le répertoire WEB-INF d'une application Web, faites:

cd webapps/<application>/WEB-INF 
java -cp 'lib/*:classes:.' org.python.util.jython 
>>> from org.springframework.context.support import ClassPathXmlApplicationContext 
>>> ctx = ClassPathXmlApplicationContext(['mycontext.spring.xml']) 

Notez le '.' dans le classpath, cela inclut explicitement le répertoire courant afin que toutes les ressources puissent être chargées. Notez également que je cite le classpath donc le shell ne l'étend pas.

Ceci devrait charger l'application.