2011-06-22 13 views
8

私は同じディレクトリ(画像、プロパティなど)に並んでいる、ユーザが設定可能ないくつかのリソースを持つrunnable jar(maven-assemblyプラグインを使用)Jarを実行しているときの現在の作業ディレクトリ

コマンドラインからjava -jar ...でjarを実行すると、現在のディレクトリは期待通りです。問題は、いくつかのオペレーティングシステム(Ubuntu 11.04)では、単にjarをダブルクリックするだけでアプリケーションが起動された場合、現在の作業ディレクトリがホームディレクトリであるということです。

jarが入っているカレントディレクトリを取得する方法や、jarファイルの横にある外部リソースにアクセスする方法がありますか?

答えて

11

MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath()を使用すると、jarfileの場所を取得できます。

もう1つの方法は、他の読み取り専用リソースを関連するクラスと一緒にjarファイルにパッケージ化して、Class.getResource(String)またはClass.getResourceAsStream(String)を使用して、指定されたクラスに関連するリソースを取得することです。

はたとえば、あなたがクラスにcom.example.icons.Iconsを持っているかもしれない、とアイコンがCOM /例/ myappに/アイコン/パスにIcons.classと一緒にパッケージ化されるだろう。 jarファイルが実行されている場所からディレクトリを発見する私の試みここ

ImageIcon icon = new ImageIcon(Icons.getResource("open.png")); 
+0

コードの最初のチャンクはjarファイルで動作しますが、ファイルを移動しない限り、eclipseから実行するとブレークします。残念ながら、jar内のリソースをパッケージ化することは、ユーザーがそれらを構成する必要があるため、オプションではありません。 – job

1

:あなたのボタンがopen.pngという名前のアイコンを使用して「開く」とします。

public class JarLocation { 
    public static void main(String[] args) { 
     new JarLocation().say(); 
    } 

    public void say() { 
     String className = this.getClass().getName().replace('.', '/'); 
     String classJar = 
      this.getClass().getResource("/" + className + ".class").toString(); 
     if (classJar.startsWith("jar:")) { 
      System.out.println("*** running from jar!"); 
     } 
     javax.swing.JOptionPane.showConfirmDialog((java.awt.Component) 
       null, classJar, "jar location", 
       javax.swing.JOptionPane.DEFAULT_OPTION); 
    } 
} 

まず、現在のクラスの "パス"を "。"に置き換えます。 "/"によって、.classをリソースとして取得します。 jarファイルがあるディレクトリを取得するために与えられた文字列あなたのパースそこから

jar:file:/C:/temp/testing.jar!/my/package/JarLocation.class 

:のtoString()メソッドは次のように返します。

関連する問題