your programing

봄에는 항아리 내부의 파일이 보이지 않습니다.

lovepro 2020. 10. 13. 08:19
반응형

봄에는 항아리 내부의 파일이 보이지 않습니다.


모두

다음 MANIFEST.MF를 사용하여 jar 파일을 만들었습니다.

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

루트에는 다음과 같이 내 spring-context.xml에서 참조되는 my.config라는 파일이 있습니다.

<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
  • 클래스는 항아리 내부에서로드됩니다.
  • 스프링 및 기타 종속성은 분리 된 jar에서로드됩니다.
  • 스프링 컨텍스트가로드 됨 (new ClassPathXmlApplicationContext ( "spring-context / applicationContext.xml"))
  • my.properties는 PropertyPlaceholderConfigurer ( "classpath : my.properties")에로드됩니다.
  • .config 파일을 파일 시스템 외부에 놓고 리소스 URL을 'file :'로 변경하면 모든 것이 정상인 것 같습니다.

팁이 있습니까?


spring-context.xml과 my.config 파일이 서로 다른 jar에 classpath*:my.config있다면?

여기에 더 많은 정보

또한 jar 파일 내부에서로드 할 때 resource.getInputStream()not 을 사용하고 있는지 확인하십시오 resource.getFile().


이 질문에 대한 답변이 이미 있다는 것을 알고 있습니다. 그러나 스프링 부트를 사용하는 사람들에게는이 링크가 도움이되었습니다-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의 범위를 벗어납니다. 자바에 관한 한, 압축이 풀릴 때까지 jar 파일의 클래스는 단어 문서의 단어와 다르지 않습니다.

대신 getInputStream ()을 사용하는 이유를 이해하는 데 도움이되었습니다. 이제 저에게 효과적입니다!

감사!


봄 항아리 패키지에서 새로운 ClassPathResource(filename).getFile(), which throws the예외를 사용합니다 .

파일 시스템에 상주하지 않으므로 절대 파일 경로로 해석 할 수 없습니다. jar

그러나 new ClassPathResource(filename).getInputStream()사용 하면이 문제가 해결됩니다. 그 이유는 jar의 구성 파일이 운영 체제의 파일 트리에 존재하지 않으므로 getInputStream().


Tomcat6.x를 사용할 때 비슷한 문제가 있었고 내가 찾은 조언 중 아무것도 도움이되지 않았습니다. 결국 workTomcat의 폴더를 삭제 하고 문제가 사라졌습니다.

비논리적이지만 문서화 목적으로 ...

참고 URL : https://stackoverflow.com/questions/14876836/file-inside-jar-is-not-visible-for-spring

반응형