2010-05-12 73 views
2

加载一个springframework的ApplicationContext的我已经加载一个springframework的应用程序上下文,像这样一类:如何从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"); 
    } 
} 

OfflineScriptSupport,文件mycontext.spring.xml分别部署分成独立的罐子(以及各自模块中的其他类别和资源)。比方说,在jar文件OfflineScriptSupport.jar和* MyContext.jar “mycontext.spring.xml在罐子里的根放。

在Jython脚本(* myscript.jy”),我尝试调用初始化方法来创建应用程序上下文:

from com.offlinesupport import OfflineScriptSupport 

OfflineScriptSupport.initialize(); 

我用下面的命令(Linux)的执行Jython脚本:

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

的springframework的应用续ext找不到mycontext.spring.xml文件。它显示了以下错误:

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) 

如果我直接运行从Java的jar(使用OfflineScriptSupport的主入口点),它的工作原理,也没有抛出错误。

Jython处理类路径的方式有什么特别的地方让Springframework的ClassPathXmlApplicationContext不起作用(即无法在类路径中找到资源文件)?

回答

0

您可能需要使用“/mycontext.spring.xml”类路径资源来指示完整路径。

+0

感谢您的建议。我试了一下,但它仍然给出了错误。资源引用在java中直接运行时使用(使用'main'入口点)。我也尝试使用Groovy脚本,它的工作原理。我想我会随着时髦而去。 – staticman 2010-05-22 22:22:35

0

确保您的类路径设置正确。假设你的应用程序上下文文件是一个Web应用程序的WEB-INF目录,这样做:

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']) 

注意“”在类路径中,这包括明确的当前目录,因此可以加载任何资源。还要注意,我引用了classpath,因此shell不会扩展它。

这应该加载应用程序。