前提・実現したいこと
jarファイル内に存在するプロパティファイルの読み込みを行いたいです。
発生している問題・エラーメッセージ
ソースを実行するとプロパティファイルに記述されている内容の出力を行えるのですがjarファイルで実行するとFileNotFoundExceptionとファイルが見つからないと言われてしまいます。
下記のソースをどう修正したら良いでしょうか。
エラーメッセージ
java.io.FileNotFoundException: property/test.property (No such file or directory) at java.base/java.io.FileInputStream.open0(Native Method) at java.base/java.io.FileInputStream.open(FileInputStream.java:211) at java.base/java.io.FileInputStream.<init>(FileInputStream.java:153) at java.base/java.io.FileInputStream.<init>(FileInputStream.java:108) at util.PropertyUtil.getProperty(PropertyUtil.java:24) at service.TestReadJarService.outputYear(TestReadJarService.java:20) at service.TestReadJarService.Controller(TestReadJarService.java:12) at service.TestReadJarService.<init>(TestReadJarService.java:8) at main.Main.main(Main.java:8)
Main.java
package main; import service.TestReadJarService; public class Main { public static void main(String[] args) { new TestReadJarService(); } }
TestReadJarService.java
package service; import util.PropertyUtil; public class TestReadJarService { final String PROPERTY_FILE = "test.property"; public TestReadJarService() { Controller() ; } private void Controller() { outputName(); outputYear(); } private void outputName() { String name = new PropertyUtil().getProperty(PROPERTY_FILE,"Name"); System.out.println(name); } private void outputYear() { String year = new PropertyUtil().getProperty(PROPERTY_FILE,"Year"); System.out.println(year); } }
PropertyUtil.java
package util; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class PropertyUtil { public String getProperty(String fileName, String key) { Properties properties = new Properties(); String path = getPath(fileName); try (InputStream property = new FileInputStream(path)) { properties.load(property); return properties.getProperty(key); } catch (IOException e) { return "failed"; } } private String getPath(String fileName) { String path = "property/" + fileName; return path; } }
test.property
Name=TAROU Year=10
パッケージ構成
ReadJar(プロジェクト名) -.classpath -.project -.settings -src -main -Main.java -service -TestReadJarService.java -util -PropertyUtil.java -bin -main -Main.class -service -TestReadJarService.class -util -PropertyUtil.class -property -test.property
jarの中身
-test.property
META-INF/MANIFEST.MF .classpath main/Main.class service/TestReadJarService.class util/PropertyUtil.class property/test.property .project
★実現したソース★
修正対象 TestReadJarService.java PropertyUtil.java test.properties(test.propertyからファイル名変更) property/test.properties(フォルダ構成変更)
TestReadJarService.java
package service; import util.PropertyUtil; public class TestReadJarService { // パス修正 final String PROPERTY_FILE = "property/test.properties"; public TestReadJarService() { Controller(); } private void Controller() { outputName(); outputYear(); // 追加処理 callJar(); } private void outputName() { String name = new PropertyUtil().getProperty(PROPERTY_FILE,"Name"); System.out.println(name); } private void outputYear() { String year = new PropertyUtil().getProperty(PROPERTY_FILE,"Year"); System.out.println(year); } // 追加メソッド private void callJar() { String gender = new PropertyUtil().getPropertyJar(PROPERTY_FILE,"Gender"); System.out.println(gender); } }
PropertyUtil.java
package util; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Enumeration; import java.util.Properties; import java.util.jar.JarEntry; import java.util.jar.JarFile; public class PropertyUtil { public String getProperty(String fileName, String key) { Properties properties = new Properties(); String path = getPath(fileName); try (InputStream property = new FileInputStream(path)) { properties.load(property); return properties.getProperty(key); } catch (IOException e) { e.printStackTrace(); return "failed"; } } // 修正あり private String getPath(String fileName) { ClassLoader classLoader = PropertyUtil.class.getClassLoader(); URL url = classLoader.getResource(fileName); return url.getPath(); } // 追加メソッド public String getPropertyJar(String fileName,String key) { ClassLoader classLoader = PropertyUtil.class.getClassLoader(); URL url = classLoader.getResource(fileName); // 絶対パスの取得 // jarで実行した際のurlが「file:/xxx/yyy/...Test.jar!/property/test.properties」 // のようなurlになるためfile:やTest.jar!の!以降を取り除きたい(/xxx/yyy/...Test.jar のようにしたい) String[] s = url.getPath().split(":"); String path = s[s.length - 1].split("!")[0]; File file = new File(path); Properties properties = new Properties(); try (JarFile jarFile = new JarFile(file);) { Enumeration<JarEntry> entries = jarFile.entries(); while (entries.hasMoreElements()) { JarEntry entry = entries.nextElement(); // jarに固められているクラスファイルやプロパティファイルを1件ずつ取得 String entryFileName = entry.getName(); //System.out.println("entryFileName="+entryFileName); if (entryFileName != null && entryFileName.startsWith(fileName)) { // 取得したファイル名と読み込む対象の名が一致した場合 try (InputStream property = classLoader.getResourceAsStream(entryFileName);) { properties.load(property); } } } return properties.getProperty(key); } catch (IOException ex) { // 例外処理 return "Failed"; } } }
test.properties
Name=TAROU Year=10 #追加 Gender=BOY
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/06 23:40
2021/07/07 00:27
2021/07/07 15:44 編集
2021/07/07 23:46
2021/07/07 23:49
2021/07/08 00:17
2021/07/08 00:30
2021/07/08 01:32