Tudo
Criei um arquivo jar com o seguinte MANIFEST.MF dentro:
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
Em sua raiz, há um arquivo chamado my.config que é referenciado em my spring-context.xml como este:
<bean id="..." class="...">
<property name="resource" value="classpath:my.config" />
</bean>
Se eu executar o jar, tudo parecerá bem, exceto o carregamento daquele arquivo específico:
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
- as classes são carregadas de dentro do jar
- spring e outras dependências são carregadas de jars separados
- o contexto do spring é carregado (new ClassPathXmlApplicationContext ("spring-context / applicationContext.xml"))
- my.properties é carregado em PropertyPlaceholderConfigurer ("classpath: my.properties")
- se eu colocar meu arquivo .config fora do sistema de arquivos e alterar o url do recurso para 'arquivo:', tudo parece estar bem ...
Alguma dica?
Eu sei que esta pergunta já foi respondida. No entanto, para aqueles que usam o spring boot, este link me ajudou - https://smarterco.de/java-load-file-classpath-spring-boot/
No entanto, o
resourceLoader.getResource("classpath:file.txt").getFile();
estava causando esse problema e o comentário do sbk:me ajudou a entender por que usar em seu
getInputStream()
lugar. Trabalha para mim agora!Obrigado!
fonte
No pacote do pote de primavera, uso new
ClassPathResource(filename).getFile()
, que lança a exceção:Mas usar novo
ClassPathResource(filename).getInputStream()
resolverá esse problema. A razão é que o arquivo de configuração no jar não existe na árvore de arquivos do sistema operacional, então deve ser usadogetInputStream()
.fonte
Tive um problema semelhante ao usar o Tomcat6.x e nenhum dos conselhos que encontrei estava ajudando. No final apaguei a
work
pasta (do Tomcat) e o problema foi embora.Eu sei que é ilógico, mas para fins de documentação ...
fonte
A resposta de @sbk é a forma como devemos fazer isso no ambiente de boot do spring (além de @Value ("$ {classpath *:})), na minha opinião. Mas no meu cenário não estava funcionando se executarmos de forma autônoma jar ... pode ser que eu fiz algo errado.
Mas esta pode ser outra maneira de fazer isso,
fonte
Eu estava tendo um problema mais complexo porque tenho mais de um arquivo com o mesmo nome, um está no jar principal do Spring Boot e os outros estão nos jarros dentro do jar principal de gordura. Minha solução foi conseguir todos os recursos com o mesmo nome e depois pegar aquele que eu precisava filtrar por nome de pacote. Para obter todos os arquivos:
fonte
Eu estava tendo um problema ao carregar recursos recursivamente em meu aplicativo Spring e descobri que o problema era que eu deveria estar usando
resource.getInputStream
. Aqui está um exemplo mostrando como ler de forma recursiva em todos os arquivos emconfig/myfiles
que sãojson
arquivos.Example.java
ResourceLoader.java
fonte
Eu tive o mesmo problema, acabei usando os Recursos Guava muito mais convenientes :
fonte