前提
開発環境は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
※質問者は英語が読めないので英語の記事を理解することはできません
https://stackoverflow.com/questions/2271926/how-to-read-a-file-from-a-jar-file
Jarのファイル名が変わったら動かなくなりませんか?
キーワードも質問内にあるくらいですし、何も調べがつかないとは思えないのですが、
何か調べたことはあるのでしょうか?
>Jarのファイル名が変わったら動かなくなりませんか?
前提は何ですか?
hoge.txtなどではなく本来の目的など提示されたほうが良いかと思います。
仮のものでは仮のアドバイスにしかなりません。
いいえ、これが本来の目的です、実行したjar内のファイルパスを出力するのが目的のアプリケーションです
それ以上の情報に何か意味があるのですか?
ファイル名が「hoge.txt」なので仮のものであると認識するのは仕方がないと思います。
そのうえで「Jarのファイル名が変わったら」という内部の実装と関係ない懸念をされています。
質問者さんのことを何も知らない赤の他人からして出てきて当然の疑問と思うのですが。
ビルドした成果物に含む=ファイル内容が変わったら毎回ビルドしなおす
ということになるので、それって何が書かれているテキストファイルなのかなと。
内容次第では成果物に含むのは悪手ではないかという疑問です。
質問者の中には、本来はもっと別の目的があるけどそこだけ解決したいからそこだけ聞く
という人も実際にいます。
直接的な解決策を提示したら、「実は」のように出てきた後出し要件によって
回答が全く意味がなくなって書き直さなきゃいけないようなことも出てきます。
邪推とまではいきませんが、いろんな余白を伝えないままにしてるように見えたので確認をしています。
関係はあると思うのですが
ファイル名が変わったら内部の実装も変えないといけなくなるじゃないですか
それとも、どんなファイル名でも動くように出来るのですか?
ファイルの内容は変わりません、ずっとそこにあるものです
>それとも、どんなファイル名でも動くように出来るのですか?
jarのファイル名は「Javaプログラム内に記載されたテキストを読み込む」のとは無関係です。
成果物としてのjarファイルは任意のファイル名にできるため、mainメソッドを持つクラス名やプロジェクト名と一致している必要はなく、成果物として出来上がったただのファイルなので後でいくらでも名前変えられます。(念のため確認済み)
クラス名を変更したなら関係するかもしれませんが、そこはクラスの参照自体を「今自身が所属しているクラス」にすれば実装の変更は不要です。
あぁ、いえ、上のURLの内容の話です
相対パスがjarの外になってしまうので、そこから自分のjarに入るという方法だと思うのですが、自分のjarファイル名が分かってないと不可能じゃないか、という事です
「If it is not on the classpath」
のケースを言われているなら、自プロジェクトにあるファイルを参照しようとしている時点で
当たらないはずですが、実際に試されたのでしょうか?
英語分からないし機械翻訳しても良くわからないので試せてないですね
コードだけ見て思っただけです
だからここで質問しているのでしょう?
「だから」と言っても書かれてないことは赤の他人には伝わりませんので、知らないです。
質問本文更新して書いてください。
せっかく提示された参考記事をきちんと読まず試さずというのは単に作業依頼してるのと変わらないです。
結局何かしら回答ついたとしても、自身で試さないことには解決にはならないので、
まず試してみてはどうでしょう。
それでうまくいかなかったときに質問してください。
コードだけ読んでも解説読まないと意味ないですし、「コードだけくれ」というのはやはり質問ではないですし。
言われた通り本文を更新しました
読まない試さないではなく、読めない試せないんです、そう書いたはずです
読めるならもちろん試します
「コードだけ見て」というのでしたらベストアンサーに選ばれた回答のコードを試してください。1つ目の回答の1つ目のコードも意味としては同じです。
私も「英語を読んで」ではなく、幾つか提示されたコードを試してほしいという意図があったのですが、そこを書いてなくて申し訳ない。
そもそも解説文の細かいところならともかく、コードの前にある1文は難しい英語があるわけではないし、Javaをやっていたらエラーに出てくる程度の英語なので、「全く読めない」のはおかしいと思ってます。
teratailに限らず、回答者は調べてすぐ見つかるようなもの、過去投稿で解決するものについては回答を避ける傾向があります。
私も、提示された記事で解決可能と判断して回答を見送ってます。
英語のコメントを読むことは出来なくても、そこに提示されたコードを自身の環境にもってきて試すことはできますよね?できないならteratailで回答もらっても「試せない」です。つまりどんな回答も無意味となるということです。
すみませんが、ベストアンサーってどれですか?
bestで検索かけても出なかったので無いと思ってました、一番上の解答でいいんですかね
簡単な英語もわかりません、エラー文も毎回エラー文をそのまま検索しています
ちなみにちゃんと調べました、調べましたが相対パスの書き方みたいなのしか見当たらず、jar内で使う方法が分かりませんでした
調べ方が悪いんですかね
一番上のを使ったら動きました
はい、ありがとうございます
ちなみにここに書き込まれた物はベストアンサーとして選べないんですかね?
誰かが回答として書いてくれないと、解決したのにずっと未解決扱いになりそうですね
回答のつもりじゃないからここに書いてると思うんですけど、ここ閉じたいんで誰か回答してもらえますか?
自己解決じゃないので自分でも出来ないですし
stackoverflowについては、緑のチェックマークがついた回答がベストアンサーに選ばれた回答です。
ここはあくまで「質問への追記修正依頼」のコメント欄であり回答ではないので
ここのコメントをもって解決済みにはできません。
私もあくまで「調べたことを追記してほしい」意図でコメントしています
+既に解決可能な情報がコメントについたのでそのままの流れでコメントで「質問者本人による自己解決」を促しています。
あとteratailでは自身で回答を投稿できるので、
実際に解決したコードをもって回答として投稿されたら良いかと。
質問も回答も後から同じような悩みをもった人が見るものにもなるので、
ある程度分かってる人が書くより、悩んで解決した本人が回答にまとめたほうが
参考にはしやすいと思います。
回答1件
あなたの回答
tips
プレビュー