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

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

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

JAR(又はJava ARchive)はコンパイルされた複数のJavaバイトコード及び関連ファイルのリソースを一つのファイルに統合したものです。JARファイルはZIPファイルのフォーマットで構築されています。

Java

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

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

Q&A

1回答

2620閲覧

jarファイルで画像を使用できない

cretter

総合スコア91

JAR

JAR(又はJava ARchive)はコンパイルされた複数のJavaバイトコード及び関連ファイルのリソースを一つのファイルに統合したものです。JARファイルはZIPファイルのフォーマットで構築されています。

Java

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

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

0グッド

0クリップ

投稿2021/05/31 14:52

前提・実現したいこと

現在、画像入りのjarファイルを作っています。
今、jar cvf Main.jar *.classでjarファイルを作り
jar xvf PacMan.jarで展開した後、マニュフェストファイルにMain-Class: 〇〇と追加し、
jar cvfm Main.jar META-INF\MANIFEST.MF *.classでjarファイルを作りました。
そして、そのjarファイルにはJFrameに画像を表示するので
JFrame.setIconImage(new ImageIcon(getClass().getClassLoader().getResource("img/character/3.png")).getImage());のようにgetClass()などを使って画像を表示しています。(こうしないとjarファイル化した後にjarファイルを移動させて使うと画像が使えないらしいから)
ですがこのようにすると下のエラーが出てしまいます。直し方を教えてください。

追伸:
jarファイル化せずに実行するとエラーは発生せず正常に動作しました。

発生している問題・エラーメッセージ

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.net.URL.toExternalForm()" because "location" is null at java.desktop/javax.swing.ImageIcon.<init>(ImageIcon.java:217) at Game.<init>(Main.java:109) at Main.main(Main.java:9)

補足情報(FW/ツールのバージョンなど)

java version "16.0.1" 2021-04-20
Java(TM) SE Runtime Environment (build 16.0.1+9-24)
Java HotSpot(TM) 64-Bit Server VM (build 16.0.1+9-24, mixed mode, sharing)

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

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

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

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

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

hope_mucci

2021/05/31 18:46

以下の点を補足してください。 - jarファイル化したあとの起動方法はどうようにしていますか。 - 読み込みたい画像はjarファイルの中に入れていますか、それともjarファイルの外ですか。
cretter

2021/05/31 22:59 編集

> jarファイル化したあとの起動方法はどうようにしていますか。 jarファイルをどこかに移動させてから`java -jar Main.jar`で起動させています。 移動させるのは中に画像がしっかりと入っている確認でもあったのですが、そもそも読み込むときにエラーが発生してしまったため質問しました。 >読み込みたい画像はjarファイルの中に入れていますか、それともjarファイルの外ですか。 正直わからないです。jarファイルにするクラスがあるフォルダにimgフォルダを作ってその中に画像を入れています。`jar cvfm Main.jar META-INF\MANIFEST.MF *.class`で勝手にjarファイルに画像は入りませんか? 新しいフォルダー--------Main.class ,         ↳----img-------画像 ,               ↳--画像
hope_mucci

2021/05/31 23:02

jarファイルの実体はzipファイルです。作成したjarファイルの拡張子をzipに変更すれば中身を見ることができるでしょう。
hope_mucci

2021/05/31 23:03

あと、最終的には、画像の扱いはどちらにしたいのですか? jarに埋め込みたいのか、jarの外にファイルとして持たせたいのか。
hope_mucci

2021/05/31 23:21

> 画像がしっかりと入っている確認でもあった とコメントに書かれていたので、jarの中に画像を入れたい、と判断します。
guest

回答1

0

jarファイルの中に画像を埋め込むには

質問文のコマンドでは .classファイルしかjarの中に入りません。格納するファイル名を*.classとしているので当然ですよね。
jar cvfm Main.jar META-INF\MANIFEST.MF * でファイル名をワイルドカードにすればカレントディレクトリにある全てのディレクトリとファイルがjarに組み込まれます。

この方法であれば質問にあるgetStreamの方法で画像ファイルが読み込めるはずです。
ただし、jarを作る際にカレントディレクトリにimgディレクトリがあることが条件です。
jarなしで起動できるのであれば、おそらく問題はないでしょう。

補記

もし「画像ファイルをjarの外で管理したい」場合はコメントで追記をお願いします。

投稿2021/05/31 23:29

hope_mucci

総合スコア4447

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問