すべて
次の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
そのルートにはmy.configというファイルがあり、これは次のようにspring-context.xmlで参照されます。
<bean id="..." class="...">
<property name="resource" value="classpath:my.config" />
</bean>
Jarを実行すると、その特定のファイルのロードを除いてすべてが正常に見えます。
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-context.xmlとmy.configファイルが異なるjarにある場合、classpath*:my.config
?を使用する必要があります。
詳細 こちら
また、jarファイル内からロードするときは、resource.getInputStream()
ではなく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の手の届かないところにあります。 Javaに関する限り、非圧縮になるまで、jarファイルのクラスはWord文書のWordと変わりません。
代わりにgetInputStream()を使用する理由を理解するのに役立ちました。それは今私のために働いています!
ありがとう!
Spring jarパッケージでは、新しいClassPathResource(filename).getFile(), which throws the
exceptionを使用します。
ファイルシステムに存在しないため、絶対ファイルパスに解決できません:jar
ただし、新しいClassPathResource(filename).getInputStream()
を使用すると、この問題を解決できます。理由は、jar内の構成ファイルがオペレーティングシステムのファイルツリーに存在しないため、getInputStream()
を使用する必要があるためです。
Tomcat6.xを使用したときに同様の問題が発生しましたが、役立つアドバイスは見つかりませんでした。最後に(Tomcatの)work
フォルダーを削除すると、問題はなくなりました。
私はそれが非論理的であることを知っていますが、文書化の目的で...