Wszystko
Utworzyłem plik jar z następującym plikiem MANIFEST.MF wewnątrz:
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
W jego katalogu głównym znajduje się plik o nazwie my.config, do którego odwołuje się mój spring-context.xml w następujący sposób:
<bean id="..." class="...">
<property name="resource" value="classpath:my.config" />
</bean>
Jeśli uruchomię jar, wszystko wygląda dobrze, z wyjątkiem załadowania tego konkretnego pliku:
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
- klasy są ładowane z wnętrza jar
- sprężyna i inne zależności są ładowane z oddzielnych słoików
- ładowany jest kontekst sprężynowy (new ClassPathXmlApplicationContext ("spring-context / applicationContext.xml"))
- my.properties są ładowane do PropertyPlaceholderConfigurer („ścieżka klasy: my.properties”)
- jeśli umieszczę plik .config poza systemem plików i zmienię adres URL zasobu na „plik:”, wszystko wydaje się być w porządku ...
Jakieś wskazówki?
Wiem, że na to pytanie już udzielono odpowiedzi. Jednak dla tych, którzy używają rozruchu wiosennego, ten link pomógł mi - https://smarterco.de/java-load-file-classpath-spring-boot/
Jednak
resourceLoader.getResource("classpath:file.txt").getFile();
przyczyną tego problemu i komentarz sbk:pomogło mi zrozumieć, dlaczego
getInputStream()
zamiast tego używać . Teraz działa na mnie!Dzięki!
źródło
W wiosennym opakowaniu słoika używam nowego
ClassPathResource(filename).getFile()
, co rzuca wyjątek:Ale użycie nowego
ClassPathResource(filename).getInputStream()
rozwiąże ten problem. Powodem jest to, że plik konfiguracyjny w jar nie istnieje w drzewie plików systemu operacyjnego, więc należy go użyćgetInputStream()
.źródło
Miałem podobny problem podczas korzystania z Tomcat6.x i żadna ze znalezionych wskazówek nie pomogła. Na koniec skasowałem
work
folder (Tomcat) i problem zniknął.Wiem, że to nielogiczne, ale w celach dokumentacyjnych ...
źródło
Odpowiedzią @sbk jest sposób, w jaki powinniśmy to zrobić w środowisku wiosennego rozruchu (oprócz @Value ("$ {classpath *:})), moim zdaniem. Ale w moim scenariuszu nie działało, jeśli wykonanie z samodzielnego jar… może zrobiłem coś złego.
Ale może to być inny sposób,
źródło
Miałem problem bardziej złożony, ponieważ mam więcej niż jeden plik o tej samej nazwie, jeden znajduje się w głównym słoiku Spring Boot, a inne w słoikach w głównym słoiku tłuszczu. Moim rozwiązaniem było pobranie wszystkich zasobów o tej samej nazwie, a następnie uzyskanie tego, którego potrzebowałem, i przefiltrowanie według nazwy pakietu. Aby pobrać wszystkie pliki:
źródło
Miałem problem z rekurencyjnym ładowaniem zasobów w mojej aplikacji Spring i stwierdziłem, że powinienem go używać
resource.getInputStream
. Oto przykład pokazujący, jak rekurencyjnie czytać wszystkie pliki wconfig/myfiles
tychjson
plikach.Example.java
ResourceLoader.java
źródło
Miałem ten sam problem, w końcu skorzystałem z dużo wygodniejszych zasobów guawy :
źródło