web-dev-qa-db-ja.com

jar内のファイルは春には表示されません

すべて

次の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
  • クラスはjar内からロードされます
  • springおよびその他の依存関係は、別々のjarからロードされます
  • 春のコンテキストがロードされます(新しいClassPathXmlApplicationContext( "spring-context/applicationContext.xml"))
  • my.propertiesがPropertyPlaceholderConfigurerにロードされます( "classpath:my.properties")
  • .configファイルをファイルシステムの外部に配置し、リソースURLを「file:」に変更すると、すべてがうまくいくようです...

任意のヒント?

73
BTakacs

Spring-context.xmlとmy.configファイルが異なるjarにある場合、classpath*:my.config?を使用する必要があります。

詳細 こちら

また、jarファイル内からロードするときは、resource.getInputStream()ではなくresource.getFile()を使用していることを確認してください。

148
sbk

この質問には既に回答済みです。ただし、スプリングブートを使用している場合は、このリンクが役立ちました- 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()を使用する理由を理解するのに役立ちました。それは今私のために働いています!

ありがとう!

34
Jobin Thomas

Spring jarパッケージでは、新しいClassPathResource(filename).getFile(), which throws theexceptionを使用します。

ファイルシステムに存在しないため、絶対ファイルパスに解決できません:jar

ただし、新しいClassPathResource(filename).getInputStream()を使用すると、この問題を解決できます。理由は、jar内の構成ファイルがオペレーティングシステムのファイルツリーに存在しないため、getInputStream()を使用する必要があるためです。

17
tao zeng

Tomcat6.xを使用したときに同様の問題が発生しましたが、役立つアドバイスは見つかりませんでした。最後に(Tomcatの)workフォルダーを削除すると、問題はなくなりました。

私はそれが非論理的であることを知っていますが、文書化の目的で...

2
takacsot