Tendo esse problema no Spring Boot 1.1.5 e 1.1.6 - estou carregando um recurso de caminho de classe usando uma anotação @Value, que funciona perfeitamente quando executo o aplicativo no STS (3.6.0, Windows). No entanto, quando executo um pacote mvn e tento executar o jar, recebo exceções FileNotFound.
O recurso, message.txt, está em src / main / resources. Inspecionei o jar e verifiquei que ele contém o arquivo "message.txt" no nível superior (mesmo nível de application.properties).
Aqui está o aplicativo:
@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());
}
}
}
A exceção:
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
fonte
classpath:filename
para que o arquivo keystore possa ser lido de dentro do jar.Se você estiver usando o Spring framework, então a leitura de
ClassPathResource
umString
é bastante simples usando o Spring frameworkFileCopyUtils
:fonte
Se você deseja usar um arquivo:
fonte
quando o projeto de inicialização do Spring é executado como um jar e precisa ler algum arquivo no caminho de classe, eu o implemento abaixo do código
fonte
Criei uma classe ClassPathResourceReader em uma maneira java 8 para facilitar a leitura de arquivos do classpath
Utilização:
fonte
Também encontrei essa limitação e criei esta biblioteca para solucionar o problema: spring-boot-jar-resources Basicamente, você pode registrar um ResourceLoader personalizado com o Spring Boot que extrai os recursos do caminho de classe do JAR conforme necessário, de forma transparente.
fonte
fonte
Jersey precisa ser frascos desembalados.
fonte
fonte
Com base na resposta de Andy, usei o seguinte para obter fluxos de entrada de todos os YAMLs em um diretório e subdiretórios em recursos (observe que o caminho passado não começa com
/
):fonte
Eu também coloquei uma situação semelhante, mas não exatamente semelhante, queria ler um arquivo JSON na pasta resources.src / main / resources Por isso, escrevi um código parecido com este abaixo.
Existem várias maneiras listadas aqui para ler um arquivo do caminho de classe no Spring Boot Application.
@Value ("caminho da classe: test.json") private Resource;
recurso privado;
Agora, esse código funciona completamente bem quando eu o executo usando, mvn: spring-boot: run, mas assim que estou construindo e empacotando o aplicativo usando o maven e executando-o como um simples jar executável, estou recebendo uma exceção. Vamos em frente e descubra a solução agora.
Usando InputStream é o que eu encontrei a resposta no meu caso: -
O Spring trabalha com o conceito de Jarra gorda, portanto, é realmente difícil, pois se comporta de maneira diferente no Eclipse e enquanto você corre como jarra.
fonte
Em relação à mensagem de erro original
O código a seguir pode ser útil para encontrar a solução para o problema do caminho:
Com isso, você pode determinar onde o aplicativo espera o arquivo ausente. Você pode executar isso no método principal do seu aplicativo.
fonte