2016-10-13 6 views
0

内のファイルを見つけることができません、彼らはすべての依存関係を含めるので、私は瓶の中にクラスローダとFileInputStreamのは、私はMavenのと私のjarファイルを構築していますJAR

のjava -jar

を経由してjarファイルを実行することができます私は、アプリケーション構成である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) 
を 私はconfig.jsonは、瓶の内側に実際にある検証しました

上記のコードを実行するクラスは、jarファイルにあります。

com.test.cloudsync.config.AppConfig.class 

WindowsでintelliJからアプリケーションを実行すると正しく動作しますが、intelliJから実行すると、メインクラスがjarでなく実行されます。

私はすでに、この検索が、のような回答をしている:提案はExcpetionがthrowedていなかったということでしたEDIT // What is the difference between Class.getResource() and ClassLoader.getResource()?

が助けにはならなかった...

jar-contents

ClassLoaderによって - これは本当です。私はいくつかのものを削除したので、スコープを制限することができました。問題はFileINputStreamを開こうとしているようですが、ファイルがjarファイルであるかどうかはわかりません。

のフルスタックトレース

/> 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'で失敗したコードを投稿できますか? 'System.out.println(classLoader.getResource(" config.json "))によって出力される行' jar:file:/home/ubuntu/cloudimport-0.1-jar-with-dependencies.jar!/ config.json'に基づいて、 )あなたはファイルが見つかることを自分自身で証明しました。 – SubOptimal

+0

私はいくつかのものを取り除き、例外を制限することができました。それはファイルが私が推測する瓶の中にあるので、入力ストリームが読み取れないようですね? –

答えて

0

は、だから、私はjarファイル自体がファイルであることから、可能ではない

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(); 
    } 
} 

マニフェスト以下とします。MF

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'プロトコルを使用しているからです。 URLから入力ストリームを取得する最も簡単な方法は、単にURL.openConnection()。getInputStream()を呼び出すことです。 –

+0

メソッドとgetResourceAsStream(fileName)の違いは何ですか? ありがとう –

関連する問題