2010-05-12 26 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不會擴展它。

這應該加載應用程序。