Как загрузить SpringFramework ApplicationContext из Jython - PullRequest
2 голосов
/ 12 мая 2010

У меня есть класс, который загружает контекст приложения 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();

Я выполняю сценарий Jython с помощью следующей команды (из Linux):

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 (используя основную точку входа в OfflineScriptSupport), она работает, и ошибки не выдается.

Есть ли что-то особенное в том, как Jython обрабатывает пути к классам, из-за чего ClassPathXmlApplicationContext в Springframework не работает (т.е. не может найти файлы ресурсов в пути к классам)?

Ответы [ 3 ]

0 голосов
/ 08 июня 2010

Попробуйте вместо этого использовать FileSystemXmlApplicationContext ("mycontext.spring.xml").

«Простые пути всегда будут интерпретироваться относительно текущего рабочего каталога ВМ». http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/context/support/FileSystemXmlApplicationContext.html

0 голосов
/ 18 июня 2012

Убедитесь, что ваш classpath правильно установлен. Предположим, что файл контекста вашего приложения находится в каталоге 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, чтобы оболочка его не раскрывала.

Это должно загрузить приложение.

0 голосов
/ 13 мая 2010

Возможно, вам придется использовать ресурс classpath "/mycontext.spring.xml", чтобы указать полный путь.

...