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

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

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

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

Q&A

解決済

1回答

554閲覧

jar化すると相対パスが動かなくなる

sadro

総合スコア10

Java

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

0グッド

1クリップ

投稿2022/09/19 08:39

編集2022/09/19 10:52

前提

開発環境はIntellij IDEAです

問題

そのまま実行すると大丈夫なんですが、Jar化するとJarがあるディレクトリからの相対パスになるみたいで、ファイルを読み込めなくなります
Jar内のファイルを読み込むにはどうすればいいですか?

該当のソースコード

java

1import java.io.File; 2 3public class Main { 4 public static void main(String[] args){ 5 File file = new File("src/hoge.txt"); 6 System.out.println(file.toURI()); 7 } 8}

補足情報

IntelliJ IDEA 2022.2.1
Java17
※質問者は英語が読めないので英語の記事を理解することはできません

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

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

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

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

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

sadro

2022/09/19 09:20

Jarのファイル名が変わったら動かなくなりませんか?
m.ts10806

2022/09/19 09:21

キーワードも質問内にあるくらいですし、何も調べがつかないとは思えないのですが、 何か調べたことはあるのでしょうか?
m.ts10806

2022/09/19 09:22

>Jarのファイル名が変わったら動かなくなりませんか? 前提は何ですか? hoge.txtなどではなく本来の目的など提示されたほうが良いかと思います。 仮のものでは仮のアドバイスにしかなりません。
sadro

2022/09/19 09:30

いいえ、これが本来の目的です、実行したjar内のファイルパスを出力するのが目的のアプリケーションです それ以上の情報に何か意味があるのですか?
m.ts10806

2022/09/19 09:32

ファイル名が「hoge.txt」なので仮のものであると認識するのは仕方がないと思います。 そのうえで「Jarのファイル名が変わったら」という内部の実装と関係ない懸念をされています。 質問者さんのことを何も知らない赤の他人からして出てきて当然の疑問と思うのですが。
m.ts10806

2022/09/19 09:35

ビルドした成果物に含む=ファイル内容が変わったら毎回ビルドしなおす ということになるので、それって何が書かれているテキストファイルなのかなと。 内容次第では成果物に含むのは悪手ではないかという疑問です。 質問者の中には、本来はもっと別の目的があるけどそこだけ解決したいからそこだけ聞く という人も実際にいます。 直接的な解決策を提示したら、「実は」のように出てきた後出し要件によって 回答が全く意味がなくなって書き直さなきゃいけないようなことも出てきます。 邪推とまではいきませんが、いろんな余白を伝えないままにしてるように見えたので確認をしています。
sadro

2022/09/19 09:39

関係はあると思うのですが ファイル名が変わったら内部の実装も変えないといけなくなるじゃないですか それとも、どんなファイル名でも動くように出来るのですか?
sadro

2022/09/19 09:42

ファイルの内容は変わりません、ずっとそこにあるものです
m.ts10806

2022/09/19 09:55 編集

>それとも、どんなファイル名でも動くように出来るのですか? jarのファイル名は「Javaプログラム内に記載されたテキストを読み込む」のとは無関係です。 成果物としてのjarファイルは任意のファイル名にできるため、mainメソッドを持つクラス名やプロジェクト名と一致している必要はなく、成果物として出来上がったただのファイルなので後でいくらでも名前変えられます。(念のため確認済み) クラス名を変更したなら関係するかもしれませんが、そこはクラスの参照自体を「今自身が所属しているクラス」にすれば実装の変更は不要です。
sadro

2022/09/19 10:23

あぁ、いえ、上のURLの内容の話です 相対パスがjarの外になってしまうので、そこから自分のjarに入るという方法だと思うのですが、自分のjarファイル名が分かってないと不可能じゃないか、という事です
m.ts10806

2022/09/19 10:37

「If it is not on the classpath」 のケースを言われているなら、自プロジェクトにあるファイルを参照しようとしている時点で 当たらないはずですが、実際に試されたのでしょうか?
sadro

2022/09/19 10:41

英語分からないし機械翻訳しても良くわからないので試せてないですね コードだけ見て思っただけです だからここで質問しているのでしょう?
m.ts10806

2022/09/19 10:45

「だから」と言っても書かれてないことは赤の他人には伝わりませんので、知らないです。 質問本文更新して書いてください。 せっかく提示された参考記事をきちんと読まず試さずというのは単に作業依頼してるのと変わらないです。 結局何かしら回答ついたとしても、自身で試さないことには解決にはならないので、 まず試してみてはどうでしょう。 それでうまくいかなかったときに質問してください。 コードだけ読んでも解説読まないと意味ないですし、「コードだけくれ」というのはやはり質問ではないですし。
sadro

2022/09/19 10:53

言われた通り本文を更新しました 読まない試さないではなく、読めない試せないんです、そう書いたはずです 読めるならもちろん試します
m.ts10806

2022/09/19 11:06 編集

「コードだけ見て」というのでしたらベストアンサーに選ばれた回答のコードを試してください。1つ目の回答の1つ目のコードも意味としては同じです。 私も「英語を読んで」ではなく、幾つか提示されたコードを試してほしいという意図があったのですが、そこを書いてなくて申し訳ない。 そもそも解説文の細かいところならともかく、コードの前にある1文は難しい英語があるわけではないし、Javaをやっていたらエラーに出てくる程度の英語なので、「全く読めない」のはおかしいと思ってます。 teratailに限らず、回答者は調べてすぐ見つかるようなもの、過去投稿で解決するものについては回答を避ける傾向があります。 私も、提示された記事で解決可能と判断して回答を見送ってます。 英語のコメントを読むことは出来なくても、そこに提示されたコードを自身の環境にもってきて試すことはできますよね?できないならteratailで回答もらっても「試せない」です。つまりどんな回答も無意味となるということです。
sadro

2022/09/19 11:18

すみませんが、ベストアンサーってどれですか? bestで検索かけても出なかったので無いと思ってました、一番上の解答でいいんですかね 簡単な英語もわかりません、エラー文も毎回エラー文をそのまま検索しています ちなみにちゃんと調べました、調べましたが相対パスの書き方みたいなのしか見当たらず、jar内で使う方法が分かりませんでした 調べ方が悪いんですかね
sadro

2022/09/19 11:43

一番上のを使ったら動きました はい、ありがとうございます ちなみにここに書き込まれた物はベストアンサーとして選べないんですかね? 誰かが回答として書いてくれないと、解決したのにずっと未解決扱いになりそうですね 回答のつもりじゃないからここに書いてると思うんですけど、ここ閉じたいんで誰か回答してもらえますか? 自己解決じゃないので自分でも出来ないですし
m.ts10806

2022/09/19 11:49

stackoverflowについては、緑のチェックマークがついた回答がベストアンサーに選ばれた回答です。 ここはあくまで「質問への追記修正依頼」のコメント欄であり回答ではないので ここのコメントをもって解決済みにはできません。 私もあくまで「調べたことを追記してほしい」意図でコメントしています +既に解決可能な情報がコメントについたのでそのままの流れでコメントで「質問者本人による自己解決」を促しています。 あとteratailでは自身で回答を投稿できるので、 実際に解決したコードをもって回答として投稿されたら良いかと。 質問も回答も後から同じような悩みをもった人が見るものにもなるので、 ある程度分かってる人が書くより、悩んで解決した本人が回答にまとめたほうが 参考にはしやすいと思います。
guest

回答1

0

自己解決

ということらしいんで

java

1InputStream is = Main.class.getResourceAsStream("/hoge.txt");

これで解決みたいです
はい、ありがとうございました

投稿2022/09/19 12:26

sadro

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問