如何从Jython加载springframework ApplicationContext

时间:2010-05-12 19:10:50

标签: java spring jython

我有一个类加载springframework应用程序上下文,如下所示:

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中(以及各自模块中的其他类和资源)。让我们说jar文件是 OfflineScriptSupport.jar 和* MyContext.jar“。 mycontext.spring.xml 放在jar的根目录。

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

from com.offlinesupport import OfflineScriptSupport

OfflineScriptSupport.initialize();

我使用以下命令(来自Linux)执行Jython脚本:

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

Springframework应用程序上下文找不到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 不起作用(即无法在类路径中找到资源文件)?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

尝试使用FileSystemXmlApplicationContext(“mycontext.spring.xml”)。

“普通路径将始终被解释为相对于当前VM工作目录”。 http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/context/support/FileSystemXmlApplicationContext.html

答案 2 :(得分:0)

确保正确设置了类路径。假设您的应用程序上下文文件位于webapp的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'])

注意'。'在类路径中,这包括显式当前目录,因此可以加载任何资源。另请注意,我引用了类路径,因此shell不会扩展它。

这应该加载应用程序。