2009-04-22 13 views
14

私は一緒に入れている.jarファイルを持っています。私はユーザの名前&のような設定可能なものを持つ本当にシンプルな.propertiesファイルを作成したいので、GUIエディタを含めるのではなく手で編集することができます。私は何をしたいのですが、この順で、検索できるようにすることです.jarの外部にあるプロパティファイルにアクセスするには?

  1. 指定されたプロパティファイル(args[0]
  2. 現在のディレクトリ内MyApp.properties(ディレクトリたからJavaは、ユーザーのディレクトリに
  3. MyApp.properties(user.homeシステムプロパティ)と呼ばれていた?)アプリケーションの.jarが保存されているディレクトリ内
  4. MyApp.propertiesを

私は#1と#3にアクセスする方法を知っていますが、実行時#2と#4でどのように判断できますか?現在の作業ディレクトリの

答えて

6

#2は、"user.dir"システムプロパティです。 #3は "user.home"プロパティです。

#4は、どのように接近してもちょっとしたクルーです。ここでは、システムクラスパス上にないJARからクラスをロードした場合に動作する別のテクニックを示します。

CodeSource src = MyClass.class.getProtectionDomain().getCodeSource(); 
if (src != null) { 
    URL url = new URL(src.getLocation(), "MyApp.properties"); 
    ... 
} 
else { 
    /* Fail... */ 
} 
+0

非常にうまく動作します。 :-)ありがとう! –

+0

@ericksonそれは動作します!しかし、もしMyApp.propertiesがjar内にあり、外部ディレクトリ(パッケージ内ではない)にある場合。次にそれを読む方法は? – Achyut

6

:現在のディレクトリ内のファイルの場合

new File("."); 

という名前MyApp.properties:

new File(new File("."), "MyApp.properties"); 
+3

これは機能しますが、空の文字列(新しいファイル( ""))を渡すことはさらに短くなります – StaxMan

+0

私は何かを学びました!ありがとう:) –

10

4について、あなたはこれを試みることができます。クラスパスを取得します:

String classpath = System.getProperty("java.class.path"); 

次に、アプリケーションのjarファイルの名前のためにそれを検索:

int jarPos = classpath.indexOf("application.jar"); 

それに至るまでのパスを解析します。

int jarPathPos = classpath.lastIndexOf(File.pathSeparatorChar, jarPos) + 1; 
String path = classpath.substring(jarPathPos, jarPos); 

その後MyApp.propertiesを追加します。 jarPos == -1を確認してください。つまり、クラスパスの場合はjarファイルが見つかりません(dev環境で実行されている場合など)。

+0

一週間、これは、どこでも 'Main.class.getProtectionDomain()。getCodeSource()'を使っていると言われています。 .appファイルの内容の中から少なくともMac上ではない...しかし、これで最終的に私の問題は解決しました...ありがとうございました... –

関連する問題