web-dev-qa-db-de.com

Datei im Glas ist für den Frühling nicht sichtbar

Alle

Ich habe eine JAR-Datei mit der folgenden MANIFEST.MF erstellt:

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

Im Stammverzeichnis befindet sich eine Datei namens my.config, auf die in meiner Datei spring-context.xml wie folgt verwiesen wird:

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

Wenn ich das Glas laufen lasse, sieht alles gut aus, außer das Laden dieser spezifischen Datei:

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
  • klassen werden aus dem jar geladen
  • spring und andere Abhängigkeiten werden aus getrennten Gläsern geladen
  • spring context wird geladen (neuer ClassPathXmlApplicationContext ("spring-context/applicationContext.xml")
  • my.properties wird in PropertyPlaceholderConfigurer geladen ("Klassenpfad: my.properties")
  • wenn ich meine .config-Datei außerhalb des Dateisystems platziere und die Ressourcen-URL in 'file:' ändere, scheint alles in Ordnung zu sein ...

Irgendwelche Tipps?

73
BTakacs

Befinden sich Ihre Dateien spring-context.xml und my.config in unterschiedlichen Jars, müssen Sie classpath*:my.config Verwenden?

Weitere Infos hier

Stellen Sie außerdem sicher, dass Sie resource.getInputStream() not resource.getFile() verwenden, wenn Sie aus einer JAR-Datei laden.

148
sbk

Ich weiß, dass diese Frage bereits beantwortet wurde. Für diejenigen, die Spring Boot verwenden, hat mir dieser Link geholfen - https://smarterco.de/Java-load-file-classpath-spring-boot/

Die resourceLoader.getResource("classpath:file.txt").getFile(); verursachte jedoch dieses Problem und den Kommentar von sbk:

Das ist es. Eine Java.io.File repräsentiert eine Datei im Dateisystem in einer Verzeichnisstruktur. Das Jar ist eine Java.io.File. Aber alles in dieser Datei ist außerhalb der Reichweite von Java.io.File. Soweit es Java betrifft, unterscheidet sich eine Klasse in einer JAR-Datei bis zur Dekomprimierung nicht von einem Word in einem Word-Dokument.

hat mir geholfen zu verstehen, warum stattdessen getInputStream () verwendet wird. Es funktioniert jetzt für mich!

Vielen Dank!

34
Jobin Thomas

Im Paket spring jar verwende ich die neue Ausnahme ClassPathResource(filename).getFile(), which throws the:

kann nicht in einen absoluten Dateipfad aufgelöst werden, da er sich nicht im Dateisystem befindet: jar

Die Verwendung von new ClassPathResource(filename).getInputStream() löst dieses Problem. Der Grund dafür ist, dass die Konfigurationsdatei in der JAR-Datei nicht im Dateibaum des Betriebssystems vorhanden ist. Daher muss getInputStream() verwendet werden.

17
tao zeng

Ich hatte ein ähnliches Problem bei der Verwendung von Tomcat6.x, und keiner der Ratschläge, die ich fand, half. Am Ende habe ich den Ordner work (von Tomcat) gelöscht und das Problem ist behoben.

Ich weiß, dass es unlogisch ist, aber zu Dokumentationszwecken ...

2
takacsot