2013-02-14 9 views
37

Allwewnątrz pliku jar nie jest widoczny na wiosnę

stworzyłem plik jar z następującym 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 nasady istnieje plik o nazwie my.config którą cytowano w moim wiosna-context.xml tak:

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

Jeśli uruchomię słoik, wszystko wygląda dobrze escept ładowanie 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 
  • zajęcia załadowany od wewnątrz słoja
  • sprężyny i inne zależności ładowane są z oddzielnych słoików
  • kontekst
  • sprężysty jest włożony (New ClassPathXmlApplicationContext („sprężyny kontekst/applicationContext.xml”))
  • my.properties jest ładowany do PropertyPlaceholderConfigurer ("classpath: my.properties")
  • jeśli ustawię plik .config poza systemem plików i zmienię URL zasobu na "file:", wszystko wydaje się być w porządku. ..

Jakieś wskazówki?

Odpowiedz

77

Jeśli twoje pliki spring-context.xml i my.config znajdują się w różnych słoikach, musisz użyć classpath*:my.config?

Więcej informacji here

Ponadto, upewnij się, że używasz resource.getInputStream() nie resource.getFile() podczas ładowania od wewnątrz pliku jar.

+1

Są w tym samym słoiku, ale wypróbowałem Twoje rozwiązanie z tym samym wynikiem: java.io.FileNotFoundException: zasób ścieżki klasy [classpath *: my.config] nie może zostać przetłumaczony na URL, ponieważ nie istnieje – BTakacs

+0

Próbowałem przenieść plik do katalogu 'conf', ale to nie pomogło. (Dokumentacja mówi: "Oznacza to, że wzorzec taki jak" classpath *: *. Xml "nie pobierze plików z katalogu głównego plików jar, a raczej tylko z katalogu głównego rozszerzonych katalogów, co wynika z ograniczenia klasy ClassLoader pakietu JDK. Metoda getResources(), która zwraca tylko lokalizacje systemu plików dla przekazanego pustego łańcucha (wskazującego potencjalne źródła wyszukiwania). ") – BTakacs

+0

Dziwne jest to: my.properties jest ładowany przez PropertyPlaceholderConfigurer, a log4j.properties został znaleziony przez sl4j .. i są w tej samej lokalizacji ... Tylko ten plik ... – BTakacs

1

Miałem podobny problem podczas korzystania z Tomcat6.x i żadna z porad, które znalazłem nie pomagała. Na końcu usunąłem folder work (Tomcat) i problem zniknął.

wiem, że to nielogiczne, ale dla celów dokumentacyjnych ...

6

Wiem, że to pytanie już odpowiedziałem. Jednak dla tych, za pomocą sprężyny buta, ten link mi pomógł - https://smarterco.de/java-load-file-classpath-spring-boot/

Jednak resourceLoader.getResource("classpath:file.txt").getFile(); było przyczyną tego problemu i komentarz SBK za:

to wszystko. Plik java.io.file reprezentuje plik w systemie plików w strukturze katalogów . The Jar to plik java.io.file. Ale wszystko, co znajduje się w obrębie , jest poza zasięgiem pliku java.io.File. Jeśli chodzi o java, to do czasu nieskompresowania klasa w pliku jar nie jest inna niż słowo w dokumencie tekstowym.

pomógł mi zrozumieć, dlaczego zamiast tego użyj getInputStream(). Działa teraz dla mnie!

Dzięki!

Powiązane problemy