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

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

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

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

Java

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

Eclipse

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

Q&A

2回答

2505閲覧

Eclipseで作成したjavaのプログラムを友達にあげる方法を教えてください。

yamico

総合スコア6

JAR

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

Java

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

Eclipse

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

0グッド

0クリップ

投稿2017/10/13 15:44

###質問
プログラミング初心者です。

Eclipseを使って作成したjavaのプログラムを友達にあげたいのですが、どうやってもうまくいきません。
なるべく簡単にできる方法が知りたいです。よろしくお願いします。

OSはWindows10です。

###試したこと
大きく分けて2つのアプローチを試しましたが、うまくいきませんでした。

1)テキストデータの受け渡し
Javaファイルとコマンドプロンプトさえあればプログラムをコンパイル→実行できるのだから、ソースコードのテキストデータをそのまま(メールなどで)送ればいいのでは?と思いやってみました。

Eclipseで作成したソースコードをWindowsのメモ帳にコピペ
→拡張子を.javaにしてデスクトップに保存
→コマンドプロンプトでコンパイル
→なぜかclassファイルが2つできる(片方のファイル名の末尾に$1がつく)
→ダメ元でコマンドプロンプトからjavaを使い実行
→エラー・メインクラスを検出およびロードできませんでした。と出る

ここで詰まりました。調べたらclasspathがどうこうと出てきて、たぶんそれが原因だとは思うのですが、具体的にどうしたらいいかはわかりませんでした…。

最初からテキストエディタで作成したら普通にコンパイル→実行できるのに、一度Eclipseを経由すると途端に動かなくなるのはなぜですか?
Eclipseのworkspaceからファイルをそのまま引っ張ってきたとかなら、見えないところで設定がおかしくなってるのかなという気もします。でも今回は単にテキストデータをコピーしているだけなので、どうしてそうなるのか不思議でなりません。

2)JARファイルの作成
上記の方法がダメでしたので、JARファイルでの実行も試みました。

Eclipse上でプロジェクトのエクスポートを選択、「JARファイル」と「実行可能JARファイル」の2種類それぞれで、詳細設定のチェックボックスを色々変えてみながら作成しました。しかし、いずれも.jarのアイコンが作成されるだけで、ダブルクリックしても実行されませんでした。
オプションをいじっている最中、一度だけコマンドプロンプトからjava -jar ファイル名.jarと指定して実行することができましたが、設定内容をメモしていなかったもので再現できません。お恥ずかしい限りです。

おそらく状況としてはこちらの質問者さんと同じかと思われます。ただベストアンサーで紹介されているページを見ても私には理解できなかったので、ここで手詰まりになりました。

自分で試したことは以上です。

###ソースコード
念のためソースコードを載せておきます。
ぐちゃぐちゃで見苦しい部分も多いかとは思いますが、ご容赦ください。

なお、今回はプログラム内容の評価(ここはこういう風にプログラムを組んだほうが綺麗だ、など)についてはノータッチでお願いします。

java

1package russian; 2 3import java.io.BufferedReader; 4import java.io.InputStreamReader; 5import java.util.ArrayList; 6import java.util.Random; 7 8public class NumberQuiz { 9 10 private static int ran;//問題番号を保持します 11 private static int player;//入力された回答を保持します 12 private static int result ;//正解数をカウントします 13 private static int max;//各レベルごとの問題参照範囲を保持します 14 15 //↓問題リスト 16 private static ArrayList<String> mondai = new ArrayList<String>(101) { 17 { 18 add("ноль");//0 19 add("один"); 20 add("два"); 21 add("три"); 22 add("четыре"); 23 add("пять"); 24 add("шесть"); 25 add("семь"); 26 add("восемь"); 27 add("девять"); 28 add("десять");//10 29 add("одиннадцать"); 30 add("двенадцать"); 31 add("тринадцать"); 32 add("четырнадцать"); 33 add("пятнадцать"); 34 add("шестнадцать"); 35 add("семнадцать"); 36 add("восемнадцать"); 37 add("девятнадцать"); 38 add("двадцать");//20 39 add("двадцать один"); 40 add("двадцать два"); 41 add("двадцать три"); 42 add("двадцать четыре"); 43 add("двадцать пять"); 44 add("двадцать шесть"); 45 add("двадцать семь"); 46 add("двадцать восемь"); 47 add("двадцать девять"); 48 add("тридцать");//30 49 add("тридцать один"); 50 add("тридцать два"); 51 add("тридцать три"); 52 add("тридцать четыре"); 53 add("тридцать пять"); 54 add("тридцать шесть"); 55 add("тридцать семь"); 56 add("тридцать восемь"); 57 add("тридцать девять"); 58 add("сорок");//40 59 add("сорок один"); 60 add("сорок два"); 61 add("сорок три"); 62 add("сорок четыре"); 63 add("сорок пять"); 64 add("сорок шесть"); 65 add("сорок семь"); 66 add("сорок восемь"); 67 add("сорок девять"); 68 add("пятьдесят");//50 69 add("пятьдесят один"); 70 add("пятьдесят два"); 71 add("пятьдесят три"); 72 add("пятьдесят четыре"); 73 add("пятьдесят пять"); 74 add("пятьдесят шесть"); 75 add("пятьдесят семь"); 76 add("пятьдесят восемь"); 77 add("пятьдесят девять"); 78 add("шестьдесят");//60 79 add("шестьдесят один"); 80 add("шестьдесят два"); 81 add("шестьдесят три"); 82 add("шестьдесят четыре"); 83 add("шестьдесят пять"); 84 add("шестьдесят шесть"); 85 add("шестьдесят семь"); 86 add("шестьдесят восемь"); 87 add("шестьдесят девять"); 88 add("семьдесят");//70 89 add("семьдесят один"); 90 add("семьдесят два"); 91 add("семьдесят три"); 92 add("семьдесят четыре"); 93 add("семьдесят пять"); 94 add("семьдесят шесть"); 95 add("семьдесят семь"); 96 add("семьдесят восемь"); 97 add("семьдесят девять"); 98 add("восемьдесят");//80 99 add("восемьдесят один"); 100 add("восемьдесят два"); 101 add("восемьдесят три"); 102 add("восемьдесят четыре"); 103 add("восемьдесят пять"); 104 add("восемьдесят шесть"); 105 add("восемьдесят семь"); 106 add("восемьдесят восемь"); 107 add("восемьдесят девять"); 108 add("девяносто");//90 109 add("девяносто один"); 110 add("девяносто два"); 111 add("девяносто три"); 112 add("девяносто четыре"); 113 add("девяносто пять"); 114 add("девяносто шесть"); 115 add("девяносто семь"); 116 add("девяносто восемь"); 117 add("девяносто девять"); 118 add("сто");//100 119 } 120 }; 121 122 public static void main(String[] args){ 123 124 while(true) { 125 126 result = 0;//一応初期化しておく 127 128 int level = levelSelect(); 129 130 switch(level) { 131 case 1: 132 max = 21; 133 quiz(); 134 break; 135 case 2: 136 max = 101; 137 quiz(); 138 break; 139 case 3: 140 max = 300; 141 System.out.println("ごめんね!未実装です"); 142 break; 143 } 144 145 System.out.println("\nもういちど挑戦しますか?"); 146 System.out.println("1:はい 2:いいえ"); 147 148 int retry = inputNum(); 149 150 if(retry == 2) { 151 System.out.println("\n遊んでくれてありがとう!"); 152 System.out.println("何かキーを押すと終了します"); 153 int wait; 154 wait = inputNum();//キー入力待ち 155 break; 156 } 157 158 } 159 160 } 161 162 private static int inputNum() {//数値入力 163 int x; 164 InputStreamReader isr = new InputStreamReader(System.in); 165 BufferedReader br = new BufferedReader(isr); 166 System.out.print("\n>"); 167 try { 168 String buf = br.readLine(); 169 x = Integer.parseInt(buf); 170 }catch(Exception e) { 171 x = 0; 172 } 173 return x; 174 } 175 176 private static int levelSelect() {//レベル選択 177 178 System.out.println("\nレベルを選択してください"); 179 System.out.println("1:初級【0から20までの数】"); 180 System.out.println("2:中級【0から100までの数】"); 181 System.out.println("3:上級【大きな数と時間】"); 182 183 int y = 0; 184 185 while(true) { 186 y = inputNum(); 187 if((y <= 0)||(y >= 4)) { 188 System.out.println("1~3の範囲で入力してください"); 189 continue; 190 } 191 break; 192 } 193 return y; 194 } 195 196 private static int ranMaker() {//乱数作成(問題番号選択用) 197 int a; 198 Random rnd = new Random(); 199 a = rnd.nextInt(max); 200 return a; 201 } 202 203 private static void quiz() {//出題~答え合わせメインループ 204 205 System.out.println("10問続けて出題します。\n何かキーを押してスタート"); 206 int wait; 207 wait = inputNum();//キー入力待ち 208 209 long start = System.currentTimeMillis();//時間計測スタート 210 211 for(int i = 1; i <= 10; i++) { 212 String question = mondai(); 213 System.out.println("\n"+question); 214 player = inputNum(); 215 216 if(player == ran) { 217 System.out.println("正解!"); 218 result++; 219 }else { 220 System.out.println("不正解"); 221 System.out.println("答え:"+(ran)); 222 } 223 } 224 225 long end = System.currentTimeMillis();//時間計測ストップ 226 227 long time = (end - start); 228 229 System.out.println("\n終了です!\nお疲れさまでした"); 230 System.out.println("\n◆結果発表◆"); 231 System.out.println("正答数:"+result+"問"); 232 System.out.println("所要時間:"+time/1000+"秒"); 233 System.out.print("評価:"); 234 235 if(result <= 2) { 236 if (time/1000 <= 20) { 237 System.out.println("☆☆☆☆☆\n\nあなたのランクは【だめだめ】です"); 238 System.out.println("「はやければ いいってもんじゃ ない」"); 239 }else { 240 System.out.println("★☆☆☆☆\n\nあなたのランクは【まだまだ】です"); 241 System.out.println("\n「のびしろ むげんだい」"); 242 } 243 }else if((result >= 3)&&(result <= 5)) { 244 System.out.println("★★☆☆☆\n\nあなたのランクは【まあまあ】です"); 245 System.out.println("\n「きみなら もっといけるはず」"); 246 }else if((result >= 6)&&(result <= 7)) { 247 System.out.println("★★★☆☆\n\nあなたのランクは【そこそこ】です"); 248 System.out.println("\n「そのちょうし みなおし わすれずに」"); 249 }else if((result >= 8)&&(result <= 9)) { 250 System.out.println("★★★★☆\n\nあなたのランクは【まずまず】です"); 251 System.out.println("\n「おしい あといっぽ がんばろう」"); 252 }else if(result == 10) { 253 if (time/1000 >= 20) { 254 System.out.println("★★★★★\n\nあなたのランクは【なかなか】です"); 255 System.out.println("\n「たいへん よくできました"); 256 System.out.println(" つぎは さらなるたかみ めざそう」"); 257 }else { 258 System.out.println("★☆★☆★\n\nあなたのランクは【かんぺき】です"); 259 System.out.println("\n「すばらしい Поздравляю!」"); 260 } 261 } 262 263 264 } 265 266 267 private static String mondai() {//問題参照 268 String q; 269 ran = ranMaker(); 270 q = new String(mondai.get(ran)); 271 return q; 272 } 273 274} 275 276 /* 277 private static int kotae() {//答え参照 278 ArrayList<Integer> kotae = new ArrayList<Integer>(300) { 279 { 280 add(1); 281 add(2); 282 add(3); 283 } 284 285 }; 286 } 287 288 ↑よく考えたらリスト番号で答え合わせできるからレベル3実装するまでこのプログラムいらない 289 */ 290 291 /* 292 public static String fileRead(int ran) { 293 String line = null; 294 try { 295 FileReader fr = new FileReader("file.txt"); 296 BufferedReader br = new BufferedReader(fr); 297 line = br.readLine(); 298 br.close(); 299 }catch(IOException ex) { 300 System.out.println("システムエラー"); 301 } 302 return line; 303 } 304 */ 305

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

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

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

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

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

guest

回答2

0

いずれも.jarのアイコンが作成されるだけで、ダブルクリックしても実行されませんでした。

Windows OS上でJARファイルをダブルクリックして実行するにはGUIを用意する必要があります(AWT、Swing、JavaFX等のGUIライブラリで表示・入力を行う)。今回のプログラムはコマンドプロンプト上での入力・表示を用いているので、JARファイルをダブルクリックする方法が使えません。

ダブルクリックではなく、コマンドプロンプトからjavaコマンドで実行(java -jar xxx.jar)するには、実行可能JARファイル形式で作成します。

Eclipseの[File]メニュー > [Export]で「Export」画面が表示されたら、

  • [Java] > [Runnable JAR file]を選択して[Next]ボタン
  • Launch configuration:欄にはmainメソッドを定義したクラスを選択
  • Export destination:欄には作成するJARファイルのフォルダとファイル名を選択

コマンドプロンプトで作成したJARファイルのフォルダに移動して、java -jar xxx.jar と実行します。

投稿2017/10/14 00:49

boochnich

総合スコア194

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

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

yamico

2017/10/14 04:21

ありがとうございます。 このままのプログラムでは、そもそもJARファイル単独では実行できないということですね…。勉強不足でした。 今後はGUIについても学んで、コマンドプロンプトの外でも動くプログラムに挑戦します!
guest

0

packageを指定しているので、NumberQuiz.javaをrussianフォルダに入れればいいだけかと。

参考までにソースをコピーして私の環境でコンパイル、実行してみました。
以下実行画面です。

> dir /b russian > dir /b russian NumberQuiz.java > javac russian\NumberQuiz.java -encoding utf8 > dir /b russian NumberQuiz$1.class NumberQuiz.class NumberQuiz.java > java russian.NumberQuiz レベルを選択してください 1:初級【0から20までの数】 2:中級【0から100までの数】 3:上級【大きな数と時間】 >1~3の範囲で入力してください

投稿2017/10/13 16:25

sa-yu

総合スコア201

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

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

yamico

2017/10/13 16:48

早速の回答ありがとうございます!! こちらでも試してみたところ、無事に実行できました。ご教授の通りrussianフォルダに入れても実行できましたし、ソースコードからパッケージ宣言を丸ごと削除することでも可能でした。こんな単純なことだったなんて…。 しかし一点だけ疑問が残ります。コンパイルしたときにどうしてclassファイルが2つできてしまうのでしょうか? しかも、$1がついたほうを消すと実行できなくなるようです(java.lang.NoClassDefFoundErrorになります)。 これらにはどのような意味があるのでしょう? お答えいただけたら嬉しいです。
swordone

2017/10/13 17:06

横から失礼。mondai変数の初期化の際に匿名クラスを作成しているので、その分のclassファイルが生成されているためだと思われます。
yamico

2017/10/14 04:16

なるほど、匿名クラスというものがあるのですね! しっかりと意味を理解しないままソースコード引っ張ってきてたので、全然気付きませんでした。ご指摘ありがとうございます!! 自分でも色々調べてみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問