- PR -

Javaアプリケーション実行パス取得方法について?

1
投稿者投稿内容
pere@java
会議室デビュー日: 2005/03/29
投稿数: 5
投稿日時: 2005-03-29 16:34
Javaアプリケーション実行パスの取得方法を教えてください。

ちなみ、System.getProperty("user.dir")は使えない。
(バッチで実行しているので、バッチファイルの保存先を取得してしまう)
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-03-29 16:48
実行パスって何ですか?

user.dir じゃダメってことは、カレントディレクトリのことではないんですよね? 実際にエントリポイントとなったメインクラスの名前が欲しいのか。メインクラスのファイルパス 〜.class が欲しいのか。アーカイブされている場合は、〜.jar のパスが欲しいのか。ネットワークからクラスがロードされた場合は・・・。

ちなみに、c でいうところの argv[0] に相当する値が欲しいのなら無理だと思う。JNI で GetModulePath() なんか使っても java.exe のパスが分かるだけだしねえ。
pere@java
会議室デビュー日: 2005/03/29
投稿数: 5
投稿日時: 2005-03-29 16:56
回答ありがとう。(^^)

Cでいうところの argv[0] に相当する値が欲しいです。やっぱ無理かな。

メインクラス(Jar)のパスは取れますか?
soluna
ベテラン
会議室デビュー日: 2004/06/15
投稿数: 59
投稿日時: 2005-03-30 13:35
ちょっと恥ずかしいのですが。
一応、私が解析した結果から作った物を示しておきます。

ただし、以下の問題があります。

  • SunのVMでしか試していない。しかも、1.4の最初の頃のみ。
  • 実行結果からの解析なので、間違っている可能性が多分にある。
  • 上項の状況なので、将来のバージョンでも動くか分からない。
  • アプレットやサーブレットなどでの実行はしていない。
  • C/C++ほどの融通性はない。
    (各々のアプリケーションで、静的にメインクラスを指定しなくてはいけない。)

と言う物でありますけど、それでも良ければ、どうぞ。

後、まだ、デザインパターンを勉強していない時に作った物なので、
すべのメンバーをスタティックで指定しています。
コード:
/**
 * <p>タイトル: メインクラスファイルのディレクトリの取得</p>
 * <p>説明: 指定されたメインクラスがあるディレクトリを取り出す。</p>
 */

final public class ExecuteFileOrgPath
{
    /** クラスパス */
    private static String myPath;
    /** JAR形式で固められているかフラグ */
    private static boolean jar;
    private static final String JAR_INFO = ".jar!/";
    private static final String FILE_INFO = "file:/";

    /** インスタンス禁止 */
    private ExecuteFileOrgPath (){}

    /**
     * <p>検索メインクラスの設定。</p>
     *
     * @param className メインクラス名
     * <p>フルパスで指定すること。パスの区切りは"<strong>/</strong>"(スラッシュ)
     * です。</p>
     * <p>例:<br />
     * "/main_package/sub_package/main.class"</p>
     */
    public static void setMainClassName (String className)
    {
        String path = ExecuteFileOrgPath.class.getResource(className).getFile();
        if (path.startsWith(FILE_INFO)) {
            path = path.substring(FILE_INFO.length() - 1);
            int diviedPosion = path.toLowerCase().indexOf(JAR_INFO);
            path = path.substring(0, diviedPosion + (JAR_INFO.length() - 2));
            jar = true;
        } else {
            jar = false;
        }
        if (path.matches("^/[A-Z]:/.*"))
            path = path.substring(1);
        path = path.substring(0, path.lastIndexOf("/"));
        if (path.matches("^[A-Z]:")) path += "/";
        myPath = path;
    }

    /**
     * <p>実行ファイルのフルパス取得。</p>
     * @return String 実行ファイルのフルパス
     */
    public static String getPath ()
    {
        return myPath;
    }

    /**
     * <p>実行ファイルのフルパス取得。</p>
     * @param className メインクラス名
     * @return String 実行ファイルのフルパス
     */
    public static String getPath (String className)
    {
        setMainClassName (className);
        return myPath;
    }

    /**
     * <p>実行ファイルはjar形式で固められているか、状態取得。</p>
     * @return boolean true = jar形式である。<br />
     *                 false=jar形式ではない。
     */
    public static boolean isJar ()
    {
        return jar;
    }
}

pere@java
会議室デビュー日: 2005/03/29
投稿数: 5
投稿日時: 2005-03-30 14:50
solunaさんありがとう。
参考にさせていただきます。

ちなみに、昨日はいろいろやってみて下記の方法も考えています。

自分で、プロパティをセットして、それをSystemクラスのゲットプロパティを使って取得する。最悪これを使う。

以上、また宜しくね。
1

スキルアップ/キャリアアップ(JOB@IT)