Подтвердить что ты не робот

Файл внутри банки не отображается для spring

Все

Я создал файл jar со следующим MANIFEST.MF внутри:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.3
Created-By: 1.6.0_25-b06 (Sun Microsystems Inc.)
Main-Class: my.Main
Class-Path: . lib/spring-core-3.2.0.M2.jar lib/spring-beans-3.2.0.M2.jar

В его корне есть файл с именем my.config, который указан в моем spring -context.xml следующим образом:

<bean id="..." class="...">
    <property name="resource" value="classpath:my.config" />
</bean>

Если я запустил jar, все выглядит нормально, кроме загрузки этого конкретного файла:

Caused by: java.io.FileNotFoundException: class path resource [my.config] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/D:/work/my.jar!/my.config
        at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:205)
    at org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:52)
    at eu.stepman.server.configuration.BeanConfigurationFactoryBean.getObject(BeanConfigurationFactoryBean.java:32)
    at eu.stepman.server.configuration.BeanConfigurationFactoryBean.getObject(BeanConfigurationFactoryBean.java:1)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142)
    ... 22 more
  • классы загружаются изнутри jar
  • spring и другие зависимости загружаются из разделенных банок
  • spring загружен контекст (новый ClassPaспасибоmlApplicationContext ( "spring -context/applicationContext.xml" ))
  • my.properties загружается в PropertyPlaceholderConfigurer ( "classpath: my.properties" )
  • Если я поместил свой файл .config за пределы файловой системы и изменил URL-адрес ресурса на "файл:", все кажется прекрасным...

Любые советы?

4b9b3361

Ответ 1

Если ваши файлы spring -context.xml и my.config находятся в разных банках, вам нужно будет использовать classpath*:my.config?

Подробнее здесь

Кроме того, убедитесь, что вы используете resource.getInputStream() not resource.getFile() при загрузке из файла jar.

Ответ 2

Я знаю, что на этот вопрос уже был дан ответ. Однако для тех, кто использует загрузку spring, эта ссылка помогла мне - https://smarterco.de/java-load-file-classpath-spring-boot/

Однако resourceLoader.getResource("classpath:file.txt").getFile(); вызвал эту проблему и комментарий sbk:

Что это. Файл java.io.File представляет файл в файловой системе, в структура каталогов. Jar - это java.io.File. Но что-то внутри этот файл недоступен для java.io.File. Что касается java, заинтересованный, пока он не будет сжат, класс в файле jar не будет отличается от слова в текстовом документе.

помог мне понять, почему использовать getInputStream() вместо этого. Теперь он работает для меня!

Спасибо!

Ответ 3

У меня была схожая проблема при использовании Tomcat6.x, и ни один из советов, которые я нашел, не помогал. В конце я удалил папку work (Tomcat) и проблема исчезла.

Я знаю, что это нелогично, но для целей документации...