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

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

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

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

2回答

1963閲覧

eclipseのアプリ配布と画像のパスについて

YUUdesu

総合スコア5

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2023/09/17 12:15

実現したいこと

①eclipseで作ったアプリの配布の方法
②配布する上での画像のパスについて

前提

JAVAのプログラミングを独学で学び、初めて時計のアプリを作りました。
それを友達に配布したいのですが、そのやり方がよく分かりません。
まず、①については調べてみてエクスポートから実行可能jarファイルというのを作ってみたのですが、何度やっても「JARエクスポートが警告とともに完了しました。追加情報については詳細を参照してください。」と表示され、詳細を押すと「JAR エクスポートが警告とともに完了しました。追加情報については詳細を参照してください。次のコンパイル警告とともにエクスポートされました: pokecchi/src/pokecchi/main.java」といった表示がされます。
で、実際にエクスポートした際に選んだ場所を見に行くとこのようなファイルが作られているといった感じです。
イメージ説明

②に関しては、アプリを作る際、画像を使ったのですが、ArrayList<String>を使い画像の絶対パスの文字列をリスト化してそれをImageIconクラスで呼び出し大きさなどを変更して表示させています。しかし多分これだと他の人へ配布した際には動かないと思います。
相対パスというものもあるというのは分かったのですが、使い方や書き方がよく分かりません。
ちなみに画像は下記画像のような位置にimageフォルダーを作っておいてあり、時計の時間の数字の画像は数が多いためその中に時間ドットフォルダーにまとめてあります。
配布することを考えるとどのように配置し、どのような記述で画像を管理するのがよいのか教えていただきたいです。

イメージ説明

該当のソースコード

ソースコード

public class Gazou {

private ArrayList<String> list = new ArrayList<String>(); public void setList() { this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\0.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\1.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\2.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\3.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\4.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\5.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\6.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\7.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\8.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\9.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\10.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\11.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\12.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\13.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\14.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\15.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\16.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\17.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\18.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\19.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\20.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\21.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\22.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\23.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\24.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\25.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\26.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\27.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\28.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\29.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\30.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\31.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\32.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\33.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\34.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\35.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\36.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\37.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\38.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\39.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\40.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\41.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\42.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\43.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\44.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\45.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\46.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\47.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\48.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\49.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\50.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\51.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\52.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\53.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\54.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\55.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\56.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\57.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\58.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\59.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\時間ドット\\_.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\ぽけっち.png"); this.list.add("C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\グレイシア.png"); } public String getPass(int a){ return list.get(a); } public ImageIcon getImageIcon(int a){ ImageIcon icon = new ImageIcon(list.get(a)); return icon; } public Image getImage(int a) { ImageIcon icon = new ImageIcon(list.get(a)); Image image = icon.getImage(); return image; } }

補足情報

一応画像を管理するために作ったクラスのコードを載せておきます。
画像のパスをリスト化し、それぞれパスやImage型などを返すメソッドを作っています。
かなり初歩的なことなのかもしれませんが分かる方いらっしゃいましたらご教授願いたいです。
お手数ですがよろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

パッケージエクスプローラーで以下のような表示状態とすると
パッケージ・エクスプローラー
以下のコードで eclipse での実行でも jar にした時の実行でも画像が表示されます。

java

1package jartest.q_955suxo9vizcgf; 2 3import java.awt.BorderLayout; 4 5import javax.swing.*; 6 7public class JarTestFrame extends JFrame { 8 public static void main(String[] args) { 9 SwingUtilities.invokeLater(() -> new JarTestFrame().setVisible(true)); 10 } 11 12 JarTestFrame() { 13 super("jartestframe"); 14 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 15 16 ClassLoader classLoader = getClass().getClassLoader(); 17 18 JPanel panel = new JPanel(new BorderLayout()); 19 JLabel label = new JLabel(new ImageIcon(classLoader.getResource("image/sakura1.png"))); 20 panel.add(label); 21 22 setContentPane(panel); 23 24 pack(); 25 setLocationRelativeTo(null); 26 } 27}

Windows での実行可能 jar のダブルクリック実行ですが、 OS や java のバージョンによって原因が異なるようです。
私の環境(Windows10Pro 22H2 [19045.3448])でも↑のプログラムを ファイル>エクスポート...>Java>実行可能JARファイル で
実行可能 JAR ファイル・エキスポート ダイアログ
として作成した JarTestFrame.jar が、コマントプロンプトで javaw -jar JarTestFrame.jar では実行でき、ファイルエキスプローラーでダブルクリックでは実行できませんでした。(一瞬マウスカーソルが変わるだけ。)

調べた結果、レジストリの コンピューター\HKEY_CLASSES_ROOT\.jar_auto_file\shell\open\command が eclipse(pleiades) の java8 jre の javaw.exe を指していて、かつ(?) -jar オプションが付いていないことが原因だったようです。
同じものを指すようなエントリが他に コンピューター\HKEY_CLASSES_ROOT\jarfile\shell\open\command としてあり、こちらは最新 (java20) の javaw を指して -jar も付いていました。
試しに jarfile の方の値を .jar_auto_file に上書きした所、ダブルクリックで動くようになりました。
レジストリ エディター画面

投稿2023/09/17 17:22

編集2023/09/17 17:34
jimbe

総合スコア13318

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

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

0

①eclipseで作ったアプリの配布の方法

エクスポート以前の部分

JARエクスポートが警告とともに完了しました

この警告については、おそらくそもそもエクスポートに関係なく、コードに警告が出ている状態が原因だと思われます。
質問添付画像で main.java とその含まれるフォルダに黄色のビックリマークが付いていますが、コンパイル時の警告などが解決されてないよという注意表示です。
eclipse上でのデバッグ実行に支障がないのなら、たとえばささいなコード修正ミスへの警告(一切使用しないローカル変数が無意味に宣言されている等)の可能性もありえますが
どのような警告かは、eclipseの「問題ビュー」で確認してみるとよいでしょう。

エクスポート

このようなファイルが作られているといった感じです。

そのフォルダには必要な外部ライブラリ(jarファイル)が含まれていますか?
特に何も入ってない(外部ライブラリに依存していない)のなら、とりあえず無視してもよいはずです。
何か入ってるなら、そのフォルダごと一緒に配布することになります。
※jarファイルの隣にフォルダを置くという配置も名前もそのままで

とりあえずコマンドラインから javaw -jar ぽけっち.jar でちゃんと起動すれば、jar自体に問題はないです。

渡し方

それを友達に配布したいのですが、そのやり方がよく分かりません。

その友達の環境次第ですが
どのOSか、Javaがインストールされているか、パソコン操作に詳しいかetc…によってやり方というかやることが変わります。

最低限 jarファイル+画像(jarファイルに含めないなら別途フォルダごと)+必要なら外部ライブラリ …までは必ず渡すとして

たとえばwindowsでJavaインストール済みであればjarファイル一式だけでも良いですが、あまり詳しくないなら追加で起動用バッチファイルも作って一緒に配布とかが楽かもしれません。
※バッチファイルは究極的には javaw -jar ぽけっち.jar するだけなのですが、デスクトップにショートカット作って起動とかやろうとすると多少めんどくさくなります

便利にするなら起動用JRE同梱とかexeファイル化とか色々やれることはありますが、最悪「Java入ってなかったらJDKインストールして!」でも良い気がします。

もしもその友達がJavaプログラミング経験者なら、いっそプロジェクトごと共有でもいいかも

②配布する上での画像のパスについて

画像(に限らずリソース)の管理・扱い方には色々あり、それぞれメリット/デメリットがあります

  • jarファイルに含める
    • 利用者が何も考えなくてよくなるので楽、配布向き
    • 利用者が画像を選ぶ余地はない
    • 使用しているライブラリの都合などで、コード内で普通のファイルとして扱いたい場合にはやや不便
  • jarファイルに含めず、コード内で絶対パスで指定する
    • 配布には向かない
    • 相対パスとかに慣れてない場合は紛らわしくなくて楽かも?
  • jarファイルに含めず、相対パスで指定する
    • jarファイルからの相対パス(決め打ち)にリソースを配置させる
      • まあまあ配布向き
      • 利用者が画像だけ変更/編集できたりする
        ※メリットでもデメリットでもある
      • 開発やエクスポート作業時にちょっと注意点あり
    • 実行時のカレントディレクトリからの相対パス(決め打ち)にリソースを配置させる
      • まあまあ配布向き
      • 利用者が画像だけ変更/編集できたりする
      • バッチファイルのような起動スクリプトを別途用意しないと不便かも
    • javaコマンド実行時の引数でリソースを指定させる
      • アプリのためのリソース、というよりはアプリの処理対象を指定する時とかに用いる

※「リソースを指定させる」には、画像フォルダだけでなく設定ファイルとかもあります

jarファイルからの相対パス(決め打ち)に画像フォルダを配置させる

「ぽけっち.jar」と同じフォルダに「ぽけっち画像」フォルダ等を作り、そこに画像を配置するやり方です。
外部ライブラリのフォルダと同様に、一緒に配布することになります。

java

1 System.out.println("jarファイルの隣に ぽけっち画像フォルダ"); 2 File imageDir = new File(new File(ClassLoader.getSystemResource(".").getFile()), "ぽけっち画像"); 3 ImageIcon imageIcon1 = new ImageIcon(new File(imageDir, "img1.jpg").getPath()); 4 ImageIcon imageIcon2 = new ImageIcon(new File(imageDir, "img2.jpg").getPath());

多分コーディングはこれでいいはず…? ちょっと環境依存のコードかもしれません(自信なし)。

ただしこのやり方は少しeclipseと相性が良くないかもしれません。
eclipseでデバッグのためにsrcフォルダに「ぽけっち画像」フォルダを配置(≒パッケージ「ぽけっち画像」を作ってそこに画像を配置)していると、実行可能jarをエクスポートする際にjarの中にも画像が含まれてしまいます。
一緒に配布する画像フォルダとjarに含まれてしまう画像フォルダで、二重になってしまいます。
それを回避するにはantでjar生成するようにしてantファイル内で一部除外してエクスポート……等に必要があるかもしれません

実行時のカレントディレクトリからの相対パス(決め打ち)に画像フォルダを配置させる

「ぽけっち.jar」と同じフォルダに「ぽけっち画像」フォルダ等を作り、そこに画像を配置しておいて、そのフォルダでの起動を強制するやり方です。

java

1 System.out.println("実行時のカレントディレクトリに ぽけっち画像フォルダ"); 2 File imageDir = new File("ぽけっち画像"); 3 ImageIcon imageIcon1 = new ImageIcon(new File(imageDir, "img1.jpg").getPath()); 4 ImageIcon imageIcon2 = new ImageIcon(new File(imageDir, "img2.jpg").getPath());

コーディングは若干スッキリしますが、その代わり実行時に配置したフォルダ以外から起動しようとすると正しく動きません
たぶんショートカットからの起動もダメで、バッチファイルとかだと「バッチファイル自身のフォルダへカレントディレクトリ移動する処理」を最初に書かねばならないです。

eclipseでデバッグのためには、おそらく「プロジェクトフォルダ直下にぽけっち画像フォルダ」が必要だと思われます。
実行可能jarエクスポートへの影響はないので、「jarファイルからの相対パス」のやり方よりはeclipseとの相性はよいです。

javaコマンド実行時の引数で画像フォルダを指定させる

利用者に何かを指定させる場合にコマンド引数は一般的な手法ですが、今回の要件にはあまり相性がよくない気はします。
アプリ動作に必須な画像フォルダ内の画像ファイル名やファイルそのものはほぼ固定なのに、フォルダパスだけ引数で自由に指定というのはやや不自然です。
実行環境での準備もちょっと面倒ですし、eclipseでのデバッグもやりにくくなります。
というわけで、一応挙げてはみたけど候補というほどではない感じです。

「デフォルトではjarファイルに含まれる画像リソースを使うけど、利用者が独自の画像リソースで上書きして使いたい場合は、設定ファイルや画像フォルダをコマンド引数で指定して……」とかならアリかも?

jarファイルに含めず、相対パスや実行時コマンド引数で設定ファイルを指定させる

設定ファイル1つだけを指定させると、柔軟に様々なファイルパスやそれ以外の設定値も扱うことができます(もちろん設定ファイルからの相対パスの扱いについては一貫性が必要)。
が、設定ファイル自体の処理が増えてややハードルが高くなるので、ここでは「そういうやり方もあるよ」とだけ示しておきます。
※今回は、配布相手の友達に設定ファイルに関する知識を要求してしまうことにもなるので……

投稿2023/09/18 03:17

pecmm

総合スコア760

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問