質問編集履歴

3

ソースのコメント修正

2021/07/07 15:42

投稿

H-T
H-T

スコア4

test CHANGED
File without changes
test CHANGED
@@ -410,15 +410,15 @@
410
410
 
411
411
  // 絶対パスの取得
412
412
 
413
+ // jarで実行した際のurlが「file:/xxx/yyy/...Test.jar!/property/test.properties」
414
+
415
+ // のようなurlになるためfile:やTest.jar!の!以降を取り除きたい(/xxx/yyy/...Test.jar のようにしたい)
416
+
413
417
  String[] s = url.getPath().split(":");
414
418
 
415
419
  String path = s[s.length - 1].split("!")[0];
416
420
 
417
- /** なぜurl.getPath()ではだめなのか不明*/
421
+
418
-
419
- //String path = url.getPath();
420
-
421
-
422
422
 
423
423
  File file = new File(path);
424
424
 

2

実現したソースに修正

2021/07/07 15:42

投稿

H-T
H-T

スコア4

test CHANGED
File without changes
test CHANGED
@@ -249,3 +249,235 @@
249
249
  .project
250
250
 
251
251
  ```
252
+
253
+ ★実現したソース★
254
+
255
+ ```
256
+
257
+ 修正対象
258
+
259
+ TestReadJarService.java
260
+
261
+ PropertyUtil.java
262
+
263
+ test.properties(test.propertyからファイル名変更)
264
+
265
+ property/test.properties(フォルダ構成変更)
266
+
267
+ ```
268
+
269
+ TestReadJarService.java
270
+
271
+ ```
272
+
273
+ package service;
274
+
275
+
276
+
277
+ import util.PropertyUtil;
278
+
279
+
280
+
281
+ public class TestReadJarService {
282
+
283
+ // パス修正
284
+
285
+ final String PROPERTY_FILE = "property/test.properties";
286
+
287
+ public TestReadJarService() {
288
+
289
+ Controller();
290
+
291
+ }
292
+
293
+ private void Controller() {
294
+
295
+ outputName();
296
+
297
+ outputYear();
298
+
299
+ // 追加処理
300
+
301
+ callJar();
302
+
303
+ }
304
+
305
+ private void outputName() {
306
+
307
+ String name = new PropertyUtil().getProperty(PROPERTY_FILE,"Name");
308
+
309
+ System.out.println(name);
310
+
311
+ }
312
+
313
+ private void outputYear() {
314
+
315
+ String year = new PropertyUtil().getProperty(PROPERTY_FILE,"Year");
316
+
317
+ System.out.println(year);
318
+
319
+ }
320
+
321
+ // 追加メソッド
322
+
323
+ private void callJar() {
324
+
325
+ String gender = new PropertyUtil().getPropertyJar(PROPERTY_FILE,"Gender");
326
+
327
+ System.out.println(gender);
328
+
329
+ }
330
+
331
+ }
332
+
333
+ ```
334
+
335
+ PropertyUtil.java
336
+
337
+ ```
338
+
339
+ package util;
340
+
341
+
342
+
343
+ import java.io.File;
344
+
345
+ import java.io.FileInputStream;
346
+
347
+ import java.io.IOException;
348
+
349
+ import java.io.InputStream;
350
+
351
+ import java.net.URL;
352
+
353
+ import java.util.Enumeration;
354
+
355
+ import java.util.Properties;
356
+
357
+ import java.util.jar.JarEntry;
358
+
359
+ import java.util.jar.JarFile;
360
+
361
+
362
+
363
+ public class PropertyUtil {
364
+
365
+ public String getProperty(String fileName, String key) {
366
+
367
+ Properties properties = new Properties();
368
+
369
+ String path = getPath(fileName);
370
+
371
+ try (InputStream property = new FileInputStream(path)) {
372
+
373
+ properties.load(property);
374
+
375
+ return properties.getProperty(key);
376
+
377
+ } catch (IOException e) {
378
+
379
+ e.printStackTrace();
380
+
381
+ return "failed";
382
+
383
+ }
384
+
385
+ }
386
+
387
+
388
+
389
+ // 修正あり
390
+
391
+ private String getPath(String fileName) {
392
+
393
+ ClassLoader classLoader = PropertyUtil.class.getClassLoader();
394
+
395
+ URL url = classLoader.getResource(fileName);
396
+
397
+ return url.getPath();
398
+
399
+ }
400
+
401
+ // 追加メソッド
402
+
403
+ public String getPropertyJar(String fileName,String key) {
404
+
405
+
406
+
407
+ ClassLoader classLoader = PropertyUtil.class.getClassLoader();
408
+
409
+ URL url = classLoader.getResource(fileName);
410
+
411
+ // 絶対パスの取得
412
+
413
+ String[] s = url.getPath().split(":");
414
+
415
+ String path = s[s.length - 1].split("!")[0];
416
+
417
+ /** なぜurl.getPath()ではだめなのか不明*/
418
+
419
+ //String path = url.getPath();
420
+
421
+
422
+
423
+ File file = new File(path);
424
+
425
+ Properties properties = new Properties();
426
+
427
+ try (JarFile jarFile = new JarFile(file);) {
428
+
429
+ Enumeration<JarEntry> entries = jarFile.entries();
430
+
431
+ while (entries.hasMoreElements()) {
432
+
433
+ JarEntry entry = entries.nextElement();
434
+
435
+ // jarに固められているクラスファイルやプロパティファイルを1件ずつ取得
436
+
437
+ String entryFileName = entry.getName();
438
+
439
+ //System.out.println("entryFileName="+entryFileName);
440
+
441
+ if (entryFileName != null && entryFileName.startsWith(fileName)) {
442
+
443
+ // 取得したファイル名と読み込む対象の名が一致した場合
444
+
445
+ try (InputStream property = classLoader.getResourceAsStream(entryFileName);) {
446
+
447
+ properties.load(property);
448
+
449
+ }
450
+
451
+ }
452
+
453
+ }
454
+
455
+ return properties.getProperty(key);
456
+
457
+ } catch (IOException ex) {
458
+
459
+ // 例外処理
460
+
461
+ return "Failed";
462
+
463
+ }
464
+
465
+ }
466
+
467
+ }
468
+
469
+ ```
470
+
471
+ test.properties
472
+
473
+ ```
474
+
475
+ Name=TAROU
476
+
477
+ Year=10
478
+
479
+ #追加
480
+
481
+ Gender=BOY
482
+
483
+ ```

1

タイトル修正

2021/07/07 15:18

投稿

H-T
H-T

スコア4

test CHANGED
@@ -1 +1 @@
1
- jarファイル内にあるプロパティファイル参照する方法について
1
+ jarファイル内プロパティファイル参照する方法について
test CHANGED
@@ -1,6 +1,6 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
- jarファイル内に存在するプロパティファイルの読み込みを行いたい
3
+ jarファイル内に存在するプロパティファイルの読み込みを行いたいです。
4
4
 
5
5
 
6
6
 
@@ -8,6 +8,8 @@
8
8
 
9
9
  ソースを実行するとプロパティファイルに記述されている内容の出力を行えるのですがjarファイルで実行するとFileNotFoundExceptionとファイルが見つからないと言われてしまいます。
10
10
 
11
+ 下記のソースをどう修正したら良いでしょうか。
12
+
11
13
 
12
14
 
13
15
  エラーメッセージ