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
Irgendwelche Tipps?
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.
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!
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.
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 ...