2016-10-13 3 views
0

Я строю свой 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()?

не помогло ...

jar-contents

// 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 
+1

попробуйте с 'getResource ("/config.json ")' -> обратите внимание на '/' перед именем ресурса –

+0

Не могли бы вы вывести код, который не удалось с помощью 'java.io.FileNotFoundException'. На основе строки 'jar: file: /home/ubuntu/cloudimport-0.1-jar-with-dependencies.jar!/Config.json' напечатано' System.out.println (classLoader.getResource ("config.json")) 'вы доказали, что файл можно найти. – SubOptimal

+0

Я удалил кое-что и мог ограничить Исключение, см. Мое Редактирование для деталей. Похоже, что поток ввода не может быть прочитан, потому что файл находится внутри банки, я думаю? –

ответ

0

Так получилось, что я пытался определить

ClassLoader classLoader = getClass().getClassLoader(); 
File f = new File(classLoader.getResource(fileName).getFile()) 
FileReader fileReader = new FileReader(configFile); 
BufferedReader br = new BufferedReader(fileReader); 

Что не представляется возможным, так как сама баночка является файлом. Поэтому вместо того, чтобы получить содержимое файла сделать:

ClassLoader classLoader = getClass().getClassLoader(); 
InputStream in = classLoader.getResourceAsStream(fileName); 
BufferedReader br = new BufferedReader(new InputStreamReader(in)); 

Также смотрите здесь: Reading a resource file from within jar

Обратите внимание на разницу getResourceAsStream(fileName) и getResource(fileName).getFile()

Спасибо за указание мне в правильном направлении!

0

Предположим, следуя простой структуре

bin/ 
src/AppConfig.java 
src/config.json 
src/manifest.mf 

AppConfig.java

package com.test.cloudsync; 
public class AppConfig { 
    void check() { 
     ClassLoader classLoader = getClass().getClassLoader(); 
     System.out.println(classLoader.getResource("config.json")); 
    } 
    public static void main(String[] args) { 
     new AppConfig().check(); 
    } 
} 

манифеста.М.Ф.

Main-Class: com.test.cloudsync.AppConfig 

компиляции и построить Jar файл

javac -d bin/ src/*.java 
cp src/config.json bin/config.json 
jar cfm test.jar src/manifest.mf -C bin/ . 

запустить фляге

java -jar test.jar 

выход

jar:file:/tmp/foobar/test.jar!/config.json 

Это свидетельствует о том, что исключение не поднятая линия ClassLoader classLoader = getClass().getClassLoader()

+0

Спасибо за ваш ответ, кажется, что проблемы в том, что я пытаюсь открыть FileInputStream на основе этого пути, что, по-видимому, невозможно, потому что файл находится внутри Jar. –

+0

Это потому, что URL-адрес использует протокол 'jar'. GetInputStream() ' –

+0

В чем разница между вашим методом и getResourceAsStream (имя_файла); Спасибо –

Смежные вопросы