我有一个类加载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 不起作用(即无法在类路径中找到资源文件)?
答案 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不会扩展它。
这应该加载应用程序。