Весна + война Феликса = FileNotFoundException - PullRequest
3 голосов
/ 09 февраля 2012

Можно ли использовать пружину внутри военного пучка на Феликсе? Я использую весну 3.0.5 с Феликсом на Glassfish 3.1

Я попытался ввести тег component-scan в военный комплект OSGI в Феликсе, и я получаю следующее исключение.

Я видел, что похожая ошибка была решена для Equinox, а как насчет Феликса? Есть ли обходной путь или решение этой проблемы?

P.S: то же исключение выдается, если я определяю путь с * в web.xml contextConfigLocation, например:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:META-INF/spring/*.xml</param-value>
</context-param>

Исключение:

2012-02-08 18:30:23,194 [pool-28-thread-1] (PathMatchingResourcePatternResolver.java:532) WARN - Cannot search for matching files underneath URL [bundle://275.0:2/examples/services/] because it does not correspond to a directory in the file system 
java.io.FileNotFoundException: URL [bundle://275.0:2/examples/services/] cannot be resolved to absolute file path because it does not reside in the file system: bundle://275.0:2/examples/services/ 
at org.springframework.util.ResourceUtils.getFile(Res ourceUtils.java:204) 
at org.springframework.core.io.AbstractFileResolvingR esource.getFile(AbstractFileResolvingResource.java :52) 
at org.springframework.core.io.UrlResource.getFile(Ur lResource.java:168) 
at org.springframework.core.io.support.PathMatchingRe sourcePatternResolver.doFindPathMatchingFileResour ces(PathMatchingResourcePatternResolver.java:528) 
... 
2012-02-08 18:30:23,194 [pool-28-thread-1] (PathMatchingResourcePatternResolver.java:353) DEBUG - Resolved location pattern [classpath*:examples/services/**/*.class] to resources [] 

applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx">

    <context:annotation-config/>

    <tx:annotation-driven />

    <context:component-scan base-package="examples.services" />

</beans>

спасибо за любой совет

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

Я нашел 2 обходных пути для решения этой проблемы.Тем не менее, я буду рад услышать реальное решение для Феликса.

Обходные пути:

  1. Используйте равноденствие вместо Феликса:)
  2. (уродливый) Создайте временную папку и извлеките в нее все классы.Создайте класс org.eclipse.core.runtime.FileLocator с функцией

Публичное статическое разрешение URL-адреса (URL-адрес URL), создает IOException

и возвращает URLсодержимого из этой папки, например:

    String path = url.getPath(); 
    String str;
    if(path.contains("com")){
        str = path.substring(path.indexOf("com"));
    }
    return new URL("file:\\c:\\temp_classes\\"+str);
0 голосов
/ 04 сентября 2015

Немного более элегантное решение, если вы не против связать себя с Феликсом.

package org.eclipse.core.runtime;

import java.net.URL;

import org.apache.felix.framework.BundleRevisionImpl;
import org.osgi.framework.Bundle;
import org.osgi.framework.FrameworkUtil;

public class FileLocator {
    private FileLocator() {}

    public static URL resolve(URL url) {
        if(url == null) {
            return null;
        }
        Bundle bundle = FrameworkUtil.getBundle(FileLocator.class).getBundleContext().getBundle();
        BundleRevisionImpl bundleRevision = bundle.adapt(BundleRevisionImpl.class);
        return bundleRevision.getLocalURL(url.getPort(), url.getPath());
    }
}

Для этого необходимо экспортировать среду при запуске Felix со следующим параметром:

-Dorg.osgi.framework.system.packages.extra=org.apache.felix.framework
...