質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

9593閲覧

LinuxでJavaを実行する際のパス指定について

rontec

総合スコア169

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2015/11/20 08:23

編集2015/11/20 08:55

現在作成中のJavaアプリ(Spring Boot)を、Linux(debian)で実際に運用していくことを考えております。

その際、今まではeclipseで開発と検証し、Linuxの所定箇所に設置後に設置したディレクトリで「Java -jar ***.java」で実行して検証しておりました。
上記の状態でjarファイルと同じディレクトリにおいたファイルの入出力パス指定に困ることはなかったのですが(パスなしファイル名のみを指定)、今日supervisorを導入しアプリを起動した際、パス指定がうまくいかないことに気が付きました。

このような際、jarファイルが設置箇所はどのように取得したらよいのでしょうか。
ネットで調べたところ「System.getProperty("user.dir")」の方法がよく紹介されておりましたが、Linuxで試したところ「/」が取得されるだけでした。

絶対パスは分かっているのでそれを指定する方法もあるのですが、さすがにプログラム設置箇所を変更する度にコードを書き換える必要があるシステムはどうかと思い、今回質問させて頂いております。

なおsupervisorは以下の設定で、supervisor自身はrootユーザーが管理しています。

[program:****] command=java -jar /var/www/App/****/****.jar user=**** autorestart=true stdout_logfile=/var/log/supervisor/****.log stdout_logfile_maxbytes=1MB stdout_logfile_backups=5 stdout_capture_maxbytes=1MB redirect_stderr=true

追記

java.class.path指定でとりあえずLinuxのsupervisor指定で動かすことは出来るようになりました。
ただwindowsでは逆にclasspathが大量に取得され、動かなくなりました。

String jarPath = System.getProperty("java.class.path"); String dirPath = jarPath.substring(0, jarPath.lastIndexOf(File.separator)+1);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

javaから、実行時のjarのパスを取得する方法で良いでしょうか?

java - How to get the path of a running JAR file? - Stack Overflow
にある、以下の方法で取得できました。

lang

1ProtectionDomain protectionDomain = MyClass.class.getProtectionDomain(); 2CodeSource codeSource = protectionDomain.getCodeSource(); 3URL location = codeSource.getLocation(); 4URI uri = location.toURI(); 5File file = new File(uri.getPath()); 6 7File canonicalFile = file.getCanonicalFile(); 8System.out.println(canonicalFile.getParent());

別の方法

以下の方法でも、jarの場所を取得できるはずです。
file:/tmp/sample.jar!/example/MyClass.class
のような形で取得できるので、:から!までを切り出せばよいです。

lang

1URL resourceJarUrl = MyClass.class.getResource("MyClass.class"); 2String resourceJarPath = resourceJarUrl.getFile(); 3resourceJarPath = URLDecoder.decode(resourceJarPath, "UTF-8");

投稿2015/11/20 08:53

編集2015/11/20 10:21
eripong

総合スコア1546

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

eripong

2015/11/20 09:05

jarのあるディレクトリのパスを取得する様に、回答を修正しました。
rontec

2015/11/20 09:32

アドバイスありがとうございます。 eripong様の環境では、これがLinux上でも動いているのでしょうか。 私の環境ではEclipseでは問題なく動くのですが、LinuxではNullPointerExceptionのエラーになりました。
eripong

2015/11/20 10:10 編集

そうですか。 こちらでは、Linuxでも動きました。 ソースコードを更新したので、 NullPointerExceptionはどの行で発生するか、 教えていただけますか?
eripong

2015/11/20 10:21

別の方法も記述しました。
rontec

2015/11/24 13:32

返答が遅くなり申し訳ございません。 アドバイス頂いた方法を用いたところ、無事Linuxでもjarファイルのパスを取得出来ました。 今までPerlやNodeで素直に相対パスを指定していたのですが、javaでかつjarファイルとか使い出すと、パスの指定方法が少し複雑になりますね…。 アドバイスありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問