Все
Я создал файл 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>
Если я запустил банку, все будет хорошо, за исключением загрузки этого конкретного файла:
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
- классы загружаются изнутри банки
- Spring и другие зависимости загружаются из отдельных jar-файлов
- контекст Spring загружен (новый ClassPathXmlApplicationContext ("spring-context / applicationContext.xml"))
- my.properties загружается в PropertyPlaceholderConfigurer ("classpath: my.properties")
- если я помещу свой файл .config за пределы файловой системы и изменю URL-адрес ресурса на 'file:', все будет в порядке ...
Какие-нибудь советы?
Я знаю, что на этот вопрос уже дан ответ. Однако для тех, кто использует весеннюю загрузку, эта ссылка помогла мне - https://smarterco.de/java-load-file-classpath-spring-boot/
Однако это
resourceLoader.getResource("classpath:file.txt").getFile();
вызывало эту проблему и комментарий sbk:помогли мне понять, почему использовать
getInputStream()
вместо этого. У меня теперь работает!Спасибо!
источник
В пакете spring jar я использую new
ClassPathResource(filename).getFile()
, который вызывает исключение:Но использование нового
ClassPathResource(filename).getInputStream()
решит эту проблему. Причина в том, что файл конфигурации в банке не существует в дереве файлов операционной системы, поэтому необходимо использоватьgetInputStream()
.источник
У меня была аналогичная проблема при использовании Tomcat6.x, и ни один из найденных мной советов не помог. В конце я удалил
work
папку (Tomcat), и проблема исчезла.Я знаю, что это нелогично, но для документации ...
источник
Ответ @sbk - это то, как мы должны делать это в среде весенней загрузки (кроме @Value ("$ {classpath *:})), на мой взгляд. Но в моем сценарии это не сработало, если выполнение из автономного банка .. может я что то не так сделал.
Но это может быть другой способ сделать это,
источник
У меня возникла более сложная проблема, потому что у меня есть несколько файлов с одинаковым именем, один находится в основной банке Spring Boot, а другие - в банках внутри основной толстой банки. Мое решение заключалось в получении всех ресурсов с одинаковыми именами, а после этого получить тот, который мне нужен, с фильтрацией по имени пакета. Чтобы получить все файлы:
источник
У меня возникла проблема с рекурсивной загрузкой ресурсов в моем приложении Spring, и я обнаружил, что проблема в том, что я должен использовать
resource.getInputStream
. Вот пример , показывающий , как рекурсивно прочитать во всех файлах вconfig/myfiles
которыеjson
файлы.Example.java
ResourceLoader.java
источник
У меня была такая же проблема, но в итоге я использовал гораздо более удобный ресурсы Guava :
источник