Эта проблема возникает как в Spring Boot 1.1.5, так и в 1.1.6 - я загружаю ресурс пути к классам с помощью аннотации @Value, которая отлично работает, когда я запускаю приложение из STS (3.6.0, Windows). Однако, когда я запускаю пакет mvn, а затем пытаюсь запустить jar, я получаю исключения FileNotFound.
Ресурс message.txt находится в src / main / resources. Я проверил банку и убедился, что она содержит файл «message.txt» на верхнем уровне (на том же уровне, что и application.properties).
Вот приложение:
@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());
}
}
}
Исключение:
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
источник
classpath:filename
чтобы файл хранилища ключей можно было прочитать из банка.Если вы используете фреймворк Spring, то читать
ClassPathResource
в фреймворке SpringString
довольно просто :FileCopyUtils
источник
Если вы хотите использовать файл:
источник
когда проект весенней загрузки работает как банка и вам нужно прочитать какой-то файл в пути к классам, я реализую его с помощью кода ниже
источник
Я создал класс ClassPathResourceReader способом java 8, чтобы легко читать файлы из пути к классам
Использование:
источник
Я тоже столкнулся с этим ограничением и создал эту библиотеку, чтобы решить эту проблему: spring-boot-jar-resources. В основном это позволяет вам зарегистрировать пользовательский ResourceLoader с помощью Spring Boot, который прозрачно извлекает ресурсы пути к классам из JAR по мере необходимости.
источник
источник
Джерси нужно распаковать по банкам.
источник
источник
Основываясь на ответе Энди, я использовал следующее, чтобы получить входные потоки всех YAML в каталоге и подкаталогах в ресурсах (обратите внимание, что переданный путь не начинается с
/
):источник
Я также застрял в подобной ситуации, но не совсем похож, хотел прочитать файл JSON из папки ресурсов. Src / main / resources Следовательно, написал код примерно так, как показано ниже.
Здесь перечислены различные способы чтения файла из пути к классам в Spring Boot Application.
@Value ("classpath: test.json") частный ресурс ресурса;
частный ресурсный ресурс;
Теперь этот код работает полностью нормально, когда я запускаю его с помощью mvn: spring-boot: run, но как только я создаю и упаковываю приложение с помощью maven и запускаю его как простой исполняемый файл jar, я получаю исключение. Давайте продолжим и найдем решение прямо сейчас.
Использование InputStream - это то, что я нашел в моем случае: -
Spring работает по концепции Fat Jar, поэтому это действительно сложно, так как он ведет себя по-разному в Eclipse и когда вы работаете как jar.
источник
Что касается исходного сообщения об ошибке
Следующий код может быть полезен для поиска решения проблемы пути:
С его помощью вы можете определить, где приложение ожидает недостающий файл. Вы можете выполнить это в основном методе вашего приложения.
источник