Todas
Creé un archivo jar con el siguiente MANIFEST.MF dentro:
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
En su raíz hay un archivo llamado my.config al que se hace referencia en mi spring-context.xml así:
<bean id="..." class="...">
<property name="resource" value="classpath:my.config" />
</bean>
Si ejecuto el jar, todo se ve bien, excepto la carga de ese archivo específico:
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
- las clases se cargan desde el interior del tarro
- primavera y otras dependencias se cargan desde frascos separados
- se carga el contexto de primavera (nuevo ClassPathXmlApplicationContext ("contexto de primavera / applicationContext.xml"))
- my.properties se carga en PropertyPlaceholderConfigurer ("classpath: my.properties")
- si pongo mi archivo .config fuera del sistema de archivos y cambio la URL del recurso a 'archivo:', todo parece estar bien ...
¿Algun consejo?
Sé que esta pregunta ya ha sido respondida. Sin embargo, para aquellos que usan Spring Boot, este enlace me ayudó: https://smarterco.de/java-load-file-classpath-spring-boot/
Sin embargo,
resourceLoader.getResource("classpath:file.txt").getFile();
estaba causando este problema y el comentario de sbk:me ayudó a entender por qué usarlo
getInputStream()
en su lugar. ¡Funciona para mi ahora!¡Gracias!
fuente
En el paquete spring jar, uso new
ClassPathResource(filename).getFile()
, que lanza la excepción:Pero usar new
ClassPathResource(filename).getInputStream()
resolverá este problema. La razón es que el archivo de configuración en el jar no existe en el árbol de archivos del sistema operativo, por lo que debe usargetInputStream()
.fuente
Tuve un problema similar al usar Tomcat6.xy ninguno de los consejos que encontré me ayudó. Al final eliminé la
work
carpeta (de Tomcat) y el problema desapareció.Sé que es ilógico, pero para fines de documentación ...
fuente
La respuesta de @sbk es la forma en que deberíamos hacerlo en el entorno de arranque de primavera (aparte de @Value ("$ {classpath *:})), en mi opinión. Pero en mi escenario no funcionaba si se ejecutaba de forma independiente jar .. tal vez hice algo mal.
Pero esta puede ser otra forma de hacerlo,
fuente
Tenía un problema más complejo porque tengo más de un archivo con el mismo nombre, uno está en el frasco principal de Spring Boot y otros están en frascos dentro del frasco principal principal. Mi solución fue obtener todos los recursos con el mismo nombre y luego obtener el que necesitaba filtrar por nombre de paquete. Para obtener todos los archivos:
fuente
Tenía un problema al cargar recursos de forma recursiva en mi aplicación Spring y descubrí que el problema era que debería usar
resource.getInputStream
. A continuación, se muestra un ejemplo que muestra cómo leer de forma recursiva todos los archivosconfig/myfiles
que sonjson
archivos.Example.java
ResourceLoader.java
fuente
Tuve el mismo problema, terminé usando los recursos de guayaba mucho más convenientes :
fuente