jar化した時にリソースの参照が出来ません。
1.EclipseでMavenプロジェクトを作成。(特にMavenに関係する事象では無いと思いますが)
2.src/main/resources配下にフォルダーを作成してテキストファイルを配置する。
3.リソースを読み込んでSystem.out.printlnする処理を作成。
このような状況で、Eclipseから実行すると正しくテキストファイルの中身が出力されるのですが、Eclipseでjarにエクスポートして実行すると、参照できず例外が発生します。
■ Eclipseで定義している内容とテスト実行してFile1.txtの中身が出力されている実行結果のイメージです。
■ Jar化したファイルの中身を確認してFile1.txtが含まれていることを確認したうえで実行するとNull参照例外が発生した時のイメージです。
ちなみに、"folder1/folder2/File1.txt"の部分を"resources/folder1/folder2/File1.txt"に変更してみたところ、逆の事象が発生しました。(Eclipseで実行したらNull参照で、Jarで実行したら正しく参照される)
jarから呼ばれているかどうかをコードの中で聞くのもどうかと思いますし、なにかやり方が間違っているのではないかと思っています。
何か、情報をお持ちの方がいらっしゃいましたら教えて頂けると幸いです。
※ 追記2018-04-23
指摘事項がありましたので、追記します
ソースコードについては以下のように記述しています。
package rsTest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
public class Main {
public static void main(String[] args) {
try {
StringBuffer sb = new StringBuffer();
InputStream in = ClassLoader.getSystemResourceAsStream("folder1/folder2/File1.txt");
InputStreamReader isr = new InputStreamReader(in, "UTF-8");
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
sb.append(line + "\r\n");
}
br.close();
in.close();
System.out.println(sb.toString());
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
また、Jar化する手順については以下のとおりです。
1.パッケージエクスプローラでプロジェクトを選択して右クリックより「エクスポート」
2.「Java」=>「実行可能Jarファイル」を選択
3.起動構成とエクスポート先を指定し、ライブラリ処理で「生成されるJarに必須ライブラリを抽出」を指定して「完了」
(7fe28d20d8ead40b0599995cee92f38e.png)
以上です。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+2
プロジェクトのビルドパス設定に原因があるようです。
画面を拝見したところ、src/main/resources以下が通常のフォルダアイコンになっていましたので、Javaのクラスパスから除外された設定です。
ビルドパス>ビルドパスの構成を開き、src/main/resourcesの除外設定に ** がなされていると、同様の現象、実行可能jarでエクスポートした際にビルドパスに含まれません。
この設定を除外すると、実行可能jarに含まれます。
通常は除外設定は(なし)になりますが、一部のプロジェクト作成コマンドでは、この設定がデフォルトで ** (すべて除外)にしてあるものもあります。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
おそらくeclipse上で実行するか、jarとして実行するかで
ClassLoader.getResourceAsStream内で
基準となるパスが異なるのではないかと推察できます。
どういった方法が一般的かはわかりませんが、
方法のひとつとしてクラスパスからリソースを取得する方法があります。
以下にサンプルを示します。
検証環境
・OS : windows7
・Java : SE8
・eclipse: neon
検証手順
mavenプロジェクトを作成
Javaコードを下記のように編集
datas.propertiesを配置
eclipse上からmainを実行し、datas.propertiesの中身が出力されることを確認
mvn installしてjarを作成
コマンドラインから java -jar sample-1.0.0-jar-with-dependencies.jarを実行
datas.propertiesの中身が出力されることを確認
プロジェクト構成
sample
│
├─src
│ ├─main
│ │ ├─java
│ │ │ └─jp
│ │ │ └─co
│ │ │ └─panda
│ │ │ └─sample
│ │ │ App.java
│ │ │
│ │ └─resources
│ │ └─jp
│ │ └─co
│ │ └─panda
│ │ └─sample
│ │ datas.properties
│ │
│ └─test
│ └─java
│ └─jp
│ └─co
│ └─panda
│ └─sample
│ AppTest.java
│
└─target
├─sample-1.0.0-jar-with-dependencies.jar
└─sample-1.0.0.jar
※AppTestはユニットテスト用ファイルなので無視してください。
// App.java
package jp.co.panda.sample;
import java.util.ResourceBundle;
/**
* エントリポイント
*
*/
public class App {
public static void main(String[] args) {
ResourceBundle bundle = ResourceBundle.getBundle("jp.co.panda.sample.datas");
for(String key : bundle.keySet()) {
System.out.println(key + " -> " + bundle.getString(key));
}
}
}
#datas.properties
key1=value1
key2=value2
key3=value3
<!-- pom.xml -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>jp.co.panda</groupId>
<artifactId>sample</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<name>sample</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>jp.co.panda.sample.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
以上ご参考までに
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.13%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
KSwordOfHaste
2018/04/18 22:17
ソースを画像で貼り付けちゃうとちょこっとコピペして試してみようという気がおきなくなります。できるだけコピペできるようコードタグで囲んで質問文に書いた方がよいと思います。
asahina1979
2018/04/19 00:39 編集
jar 圧縮の手順を質問へ追記してください
退会済みユーザー
2018/04/19 02:26
見た目では「src/main/resources/」がビルドパスに入っているようなので、Eclipseの「Export -> JAR file」で「folder1/」以下がjarファイルに入るはずです。エクスポートの手順を教えてください。
cp0831
2018/04/23 10:18
遅くなりましたが情報追記しました。ご確認いただけると幸いです。
退会済みユーザー
2018/04/23 17:51
Eclipse Oxygen.3 で同じようなプロジェクトを作成してみましたが問題ありませんでした。ただしfolder1とfolder2のアイコンが違っています。私は「src/main/resources」の下にパッケージ「folder1.folder2」を作成し、その下に「File1.txt」を作成しました。folder1、folder2はどうやって作ったのでしょうか?
cp0831
2018/04/24 11:26
saka1029さん。情報ありがとうございます。こちらでも試してみたのですが、パッケージとして作成してもフォルダーとして作成してもアイコンはフォルダーのもので動作は変わりませんでした。A-pZさんの投稿にある様にビルドパスから除外設定を除去すると思ったようにEclipseからもJarにしてからも同じ方法"folder1/folder2/File1.txt"で正しくアクセスできることを確認しました。saka1029さんの環境ではビルドパスの除外設定の除去を行われた環境なのでしょうか?だとすると、リソース参照する場合はビルドの除外設定を外すというのでストーリーが一致するのですが、如何でしょう?
cp0831
2018/04/24 11:27
ちなみに、ビルドパスから除外設定を除去するとアイコンはフォルダーからパッケージのものに変わりました
cp0831
2018/04/24 11:41
たびたびすみません。私の環境で確認したところ、Mavenプロジェクト作成時に「シンプルなプロジェクトの作成(アーキタイプ選択のスキップ)」にチェックしてプロジェクトを作成するとResourcesフォルダーが除外設定付きで作成されました。これが今回の事象の原因だと思われます。Eclipseの環境内であれば参照できてしまうところにややこしさが有りますが原因としては特定できたと思います。ありがとうございました。
退会済みユーザー
2018/04/24 12:34
私が試したときはプロジェクト作成後にビルドパスを手動で追加したので除外設定は初めから「(なし)」となっていました。
cp0831
2018/04/24 14:18
了解しました。私が引っかかった原因がはっきりしました。ありがとう御座いました。