Semua
Saya membuat file jar dengan MANIFEST.MF berikut di dalamnya:
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
Di akarnya ada file bernama my.config yang direferensikan di spring-context.xml saya seperti ini:
<bean id="..." class="...">
<property name="resource" value="classpath:my.config" />
</bean>
Jika saya menjalankan toples, semuanya terlihat baik-baik saja kecuali pemuatan file khusus itu:
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
- kelas dimuat dari dalam toples
- pegas dan dependensi lainnya dimuat dari toples terpisah
- konteks pegas dimuat (ClassPathXmlApplicationContext baru ("spring-context / applicationContext.xml"))
- my.properties dimuat ke PropertyPlaceholderConfigurer ("classpath: my.properties")
- jika saya meletakkan file .config saya di luar sistem file, dan mengubah url sumber daya menjadi 'file:', semuanya tampak baik-baik saja ...
Ada tips?
Saya tahu pertanyaan ini telah terjawab. Namun, bagi mereka yang menggunakan boot musim semi, tautan ini membantu saya - https://smarterco.de/java-load-file-classpath-spring-boot/
Namun,
resourceLoader.getResource("classpath:file.txt").getFile();
penyebabnya adalah masalah ini dan komentar sbk:membantu saya memahami mengapa menggunakan
getInputStream()
sebagai gantinya. Ini berhasil untuk saya sekarang!Terima kasih!
sumber
Dalam paket spring jar, saya menggunakan new
ClassPathResource(filename).getFile()
, yang memunculkan pengecualian:Tetapi menggunakan yang baru
ClassPathResource(filename).getInputStream()
akan menyelesaikan masalah ini. Alasannya adalah bahwa file konfigurasi di jar tidak ada di pohon file sistem operasi, jadi harus digunakangetInputStream()
.sumber
Saya memiliki masalah yang sama saat menggunakan Tomcat6.x dan tidak ada saran yang saya temukan membantu. Pada akhirnya saya menghapus
work
folder (dari Tomcat) dan masalahnya hilang.Saya tahu itu tidak masuk akal tetapi untuk tujuan dokumentasi ...
sumber
Jawaban oleh @sbk adalah cara yang harus kita lakukan di lingkungan spring-boot (selain dari @Value ("$ {classpath *:})), menurut saya. Tapi dalam skenario saya itu tidak berfungsi jika dijalankan dari standalone jar..mungkin aku melakukan sesuatu yang salah.
Tapi ini bisa menjadi cara lain untuk melakukan ini,
sumber
Saya mengalami masalah yang lebih kompleks karena saya memiliki lebih dari satu file dengan nama yang sama, satu ada di toples Spring Boot utama dan yang lainnya ada di toples di dalam toples lemak utama. Solusi saya adalah mendapatkan semua sumber daya dengan nama yang sama dan setelah itu mendapatkan yang saya butuhkan untuk memfilter berdasarkan nama paket. Untuk mendapatkan semua file:
sumber
Saya mengalami masalah saat memuat sumber daya secara rekursif di aplikasi Spring saya, dan menemukan bahwa masalahnya adalah yang seharusnya saya gunakan
resource.getInputStream
. Berikut adalah contoh yang menunjukkan cara membaca secara rekursif di semua file diconfig/myfiles
dalamnyajson
file.Example.java
ResourceLoader.java
sumber
Saya memiliki masalah yang sama, akhirnya menggunakan Sumber Jambu Biji yang jauh lebih nyaman :
sumber