Я строю свой Jar-файл с Maven, они включают в себя все зависимости, так что я могу запустить банки черезЗагрузчик классов и FileInputStream не найти файл в JAR
Java -jar
Внутри баночки У меня есть config.json, который является конфигурацией приложения. Я проверил, что config.json действительно внутри кувшина:
/> jar tf cloudimport-0.1-jar-with-dependencies.jar | grep config.json
config.json
Но когда я запускаю приложение не будет найти config.json:
ClassLoader classLoader = getClass().getClassLoader();
System.out.println(classLoader.getResource("config.json"));
File configFile = new File(classLoader.getResource(fileName).getFile());
(Exception thrown here ->) FileReader fileReader = new FileReader(configFile);
BufferedReader br = new BufferedReader(fileReader);
производит:
java -jar cloudimport-0.1-jar-with-dependencies.jar
jar:file:/home/ubuntu/cloudimport-0.1-jar-with-dependencies.jar!/config.json
java.io.FileNotFoundException: file:/home/ubuntu/cloudimport-0.1-jar-with-dependencies.jar!/config.json (No such file or directory)
Класс, который выполняет вышеуказанный код, находится в банке по адресу:
com.test.cloudsync.config.AppConfig.class
Если я запустил приложение из intelliJ в windows, он работает правильно, но выполнение из intelliJ означает, что Main Class выполняется не в банке.
Я уже искал для этого, но ответы, как: What is the difference between Class.getResource() and ClassLoader.getResource()?
не помогло ...
// EDIT Предлагалось, что Excpetion было не забросил по ClassLoader - это правда. Я удалил некоторые вещи, чтобы ограничить область, теперь кажется, что проблема заключается в том, что я пытаюсь открыть FileINputStream, но это невозможно. Я думаю, если файл имеет банку?
The Full трассировку стека:
/> java -jar java_cloudsync/com/tsg/cloudimport/cloudimport/0.1/cloudimport-0.1-jar-with-dependencies.jar
jar:file:/home/ubuntu/java_cloudsync/com/tsg/cloudimport/cloudimport/0.1/cloudimport-0.1-jar-with-dependencies.jar!/config.json
java.io.FileNotFoundException: file:/home/ubuntu/java_cloudsync/com/tsg/cloudimport/cloudimport/0.1/cloudimport-0.1-jar-with-dependencies.jar!/config.json (No such file or directory)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileReader.<init>(FileReader.java:72)
at com.tsg.cloudsync.config.AppConfig.readConfigFile(AppConfig.java:33)
at com.tsg.cloudsync.config.AppConfig.<init>(AppConfig.java:23)
at com.tsg.cloudsync.awsutils.SQSSocket.<init>(SQSSocket.java:34)
at com.tsg.cloudsync.awsutils.SQSSocket.<clinit>(SQSSocket.java:19)
at com.tsg.cloudsync.NewFileWatchDog.main(NewFileWatchDog.java:24)
Exception in thread "main" java.lang.ExceptionInInitializerError
at com.tsg.cloudsync.NewFileWatchDog.main(NewFileWatchDog.java:24)
Caused by: java.lang.NullPointerException
at com.tsg.cloudsync.config.AppConfig.getAWSCredentials(AppConfig.java:50)
at com.tsg.cloudsync.awsutils.SQSSocket.<init>(SQSSocket.java:35)
at com.tsg.cloudsync.awsutils.SQSSocket.<clinit>(SQSSocket.java:19)
... 1 more
попробуйте с 'getResource ("/config.json ")' -> обратите внимание на '/' перед именем ресурса –
Не могли бы вы вывести код, который не удалось с помощью 'java.io.FileNotFoundException'. На основе строки 'jar: file: /home/ubuntu/cloudimport-0.1-jar-with-dependencies.jar!/Config.json' напечатано' System.out.println (classLoader.getResource ("config.json")) 'вы доказали, что файл можно найти. – SubOptimal
Я удалил кое-что и мог ограничить Исключение, см. Мое Редактирование для деталей. Похоже, что поток ввода не может быть прочитан, потому что файл находится внутри банки, я думаю? –