Al tener este problema tanto en Spring Boot 1.1.5 como en 1.1.6: estoy cargando un recurso classpath usando una anotación @Value, que funciona bien cuando ejecuto la aplicación desde STS (3.6.0, Windows). Sin embargo, cuando ejecuto un paquete mvn y luego intento ejecutar el jar, obtengo excepciones FileNotFound.
El recurso, message.txt, está en src / main / resources. Inspeccioné el jar y verifiqué que contiene el archivo "message.txt" en el nivel superior (el mismo nivel que application.properties).
Aquí está la aplicación:
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application implements CommandLineRunner {
private static final Logger logger = Logger.getLogger(Application.class);
@Value("${message.file}")
private Resource messageResource;
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
public void run(String... arg0) throws Exception {
// both of these work when running as Spring boot app from STS, but
// fail after mvn package, and then running as java -jar
testResource(new ClassPathResource("message.txt"));
testResource(this.messageResource);
}
private void testResource(Resource resource) {
try {
resource.getFile();
logger.debug("Found the resource " + resource.getFilename());
} catch (IOException ex) {
logger.error(ex.toString());
}
}
}
La excepción:
c:\Users\glyoder\Documents\workspace-sts-3.5.1.RELEASE\classpath-resource-proble
m\target>java -jar demo-0.0.1-SNAPSHOT.jar
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.1.5.RELEASE)
2014-09-16 08:46:34.635 INFO 5976 --- [ main] demo.Application
: Starting Application on 8W59XV1 with PID 5976 (C:\Users\glyo
der\Documents\workspace-sts-3.5.1.RELEASE\classpath-resource-problem\target\demo
-0.0.1-SNAPSHOT.jar started by glyoder in c:\Users\glyoder\Documents\workspace-s
ts-3.5.1.RELEASE\classpath-resource-problem\target)
2014-09-16 08:46:34.640 DEBUG 5976 --- [ main] demo.Application
: Running with Spring Boot v1.1.5.RELEASE, Spring v4.0.6.RELEA
SE
2014-09-16 08:46:34.681 INFO 5976 --- [ main] s.c.a.AnnotationConfigA
pplicationContext : Refreshing org.springframework.context.annotation.Annotation
ConfigApplicationContext@1c77b086: startup date [Tue Sep 16 08:46:34 EDT 2014];
root of context hierarchy
2014-09-16 08:46:35.196 INFO 5976 --- [ main] o.s.j.e.a.AnnotationMBe
anExporter : Registering beans for JMX exposure on startup
2014-09-16 08:46:35.210 ERROR 5976 --- [ main] demo.Application
: java.io.FileNotFoundException: class path resource [message.
txt] cannot be resolved to absolute file path because it does not reside in the
file system: jar:file:/C:/Users/glyoder/Documents/workspace-sts-3.5.1.RELEASE/cl
asspath-resource-problem/target/demo-0.0.1-SNAPSHOT.jar!/message.txt
2014-09-16 08:46:35.211 ERROR 5976 --- [ main] demo.Application
: java.io.FileNotFoundException: class path resource [message.
txt] cannot be resolved to absolute file path because it does not reside in the
file system: jar:file:/C:/Users/glyoder/Documents/workspace-sts-3.5.1.RELEASE/cl
asspath-resource-problem/target/demo-0.0.1-SNAPSHOT.jar!/message.txt
2014-09-16 08:46:35.215 INFO 5976 --- [ main] demo.Application
: Started Application in 0.965 seconds (JVM running for 1.435)
2014-09-16 08:46:35.217 INFO 5976 --- [ Thread-2] s.c.a.AnnotationConfigA
pplicationContext : Closing org.springframework.context.annotation.AnnotationCon
figApplicationContext@1c77b086: startup date [Tue Sep 16 08:46:34 EDT 2014]; roo
t of context hierarchy
2014-09-16 08:46:35.218 INFO 5976 --- [ Thread-2] o.s.j.e.a.AnnotationMBe
anExporter : Unregistering JMX-exposed beans on shutdown
fuente
classpath:filename
para que el archivo del almacén de claves se pueda leer desde el jar.Si está usando Spring Framework, leer
ClassPathResource
en unString
es bastante simple usando Spring FrameworkFileCopyUtils
:fuente
Si quieres usar un archivo:
fuente
cuando el proyecto de arranque de primavera se ejecuta como un jar y necesita leer algún archivo en classpath, lo implemento por debajo del código
fuente
He creado una clase ClassPathResourceReader de una manera java 8 para hacer que los archivos de classpath sean fáciles de leer
Utilización:
fuente
También encontré esta limitación y creé esta biblioteca para superar el problema: spring-boot-jar-resources Básicamente, le permite registrar un ResourceLoader personalizado con Spring Boot que extrae los recursos de classpath del JAR según sea necesario, de forma transparente.
fuente
fuente
Jersey necesita ser frascos desempaquetados.
fuente
fuente
Según la respuesta de Andy, utilicé lo siguiente para obtener una secuencia de entrada de todos los YAML en un directorio y subdirectorios en recursos (tenga en cuenta que la ruta pasada no comienza
/
):fuente
También me encontré con una situación similar pero no exactamente similar, quería leer un archivo JSON de la carpeta de recursos.src / main / resources Por lo tanto, escribí un código como este a continuación.
Hay varias formas enumeradas aquí para leer un archivo f classpath de rom en Spring Boot Application.
@Value ("classpath: test.json") recurso de recurso privado;
recurso de recursos privados;
Ahora, este código funciona completamente bien una vez que lo ejecuto usando, mvn: spring-boot: run, pero tan pronto como estoy compilando y empaquetando la aplicación usando maven y ejecutándola como un simple jar ejecutable, obtengo una excepción. Avancemos y descubramos la solución ahora.
Usar InputStream es lo que encontré la respuesta en mi caso: -
Spring trabaja en el concepto de Fat Jar, por lo tanto, es realmente difícil ya que se comporta de manera diferente en Eclipse y mientras corres como un frasco.
fuente
En cuanto al mensaje de error original
El siguiente código podría ser útil para encontrar la solución al problema de ruta:
Con esto puede determinar dónde espera la aplicación el archivo que falta. Puede ejecutar esto en el método principal de su aplicación.
fuente