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

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

ただいまの
回答率

90.76%

  • Java

    13166questions

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

  • Eclipse

    1606questions

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

  • JAR

    87questions

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

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

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 385

yamico

score 2

質問

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

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と指定して実行することができましたが、設定内容をメモしていなかったもので再現できません。お恥ずかしい限りです。

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

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

ソースコード

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

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

package russian;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Random;

public class NumberQuiz {

    private static int ran;//問題番号を保持します
    private static int player;//入力された回答を保持します
    private static int result ;//正解数をカウントします
    private static int max;//各レベルごとの問題参照範囲を保持します

    //↓問題リスト
    private static ArrayList<String> mondai = new ArrayList<String>(101) {
        {
            add("ноль");//0
            add("один");
            add("два");
            add("три");
            add("четыре");
            add("пять");
            add("шесть");
            add("семь");
            add("восемь");
            add("девять");
            add("десять");//10
            add("одиннадцать");
            add("двенадцать");
            add("тринадцать");
            add("четырнадцать");
            add("пятнадцать");
            add("шестнадцать");
            add("семнадцать");
            add("восемнадцать");
            add("девятнадцать");
            add("двадцать");//20
            add("двадцать один");
            add("двадцать два");
            add("двадцать три");
            add("двадцать четыре");
            add("двадцать пять");
            add("двадцать шесть");
            add("двадцать семь");
            add("двадцать восемь");
            add("двадцать девять");
            add("тридцать");//30
            add("тридцать один");
            add("тридцать два");
            add("тридцать три");
            add("тридцать четыре");
            add("тридцать пять");
            add("тридцать шесть");
            add("тридцать семь");
            add("тридцать восемь");
            add("тридцать девять");
            add("сорок");//40
            add("сорок один");
            add("сорок два");
            add("сорок три");
            add("сорок четыре");
            add("сорок пять");
            add("сорок шесть");
            add("сорок семь");
            add("сорок восемь");
            add("сорок девять");
            add("пятьдесят");//50
            add("пятьдесят один");
            add("пятьдесят два");
            add("пятьдесят три");
            add("пятьдесят четыре");
            add("пятьдесят пять");
            add("пятьдесят шесть");
            add("пятьдесят семь");
            add("пятьдесят восемь");
            add("пятьдесят девять");
            add("шестьдесят");//60
            add("шестьдесят один");
            add("шестьдесят два");
            add("шестьдесят три");
            add("шестьдесят четыре");
            add("шестьдесят пять");
            add("шестьдесят шесть");
            add("шестьдесят семь");
            add("шестьдесят восемь");
            add("шестьдесят девять");
            add("семьдесят");//70
            add("семьдесят один");
            add("семьдесят два");
            add("семьдесят три");
            add("семьдесят четыре");
            add("семьдесят пять");
            add("семьдесят шесть");
            add("семьдесят семь");
            add("семьдесят восемь");
            add("семьдесят девять");
            add("восемьдесят");//80
            add("восемьдесят один");
            add("восемьдесят два");
            add("восемьдесят три");
            add("восемьдесят четыре");
            add("восемьдесят пять");
            add("восемьдесят шесть");
            add("восемьдесят семь");
            add("восемьдесят восемь");
            add("восемьдесят девять");
            add("девяносто");//90
            add("девяносто один");
            add("девяносто два");
            add("девяносто три");
            add("девяносто четыре");
            add("девяносто пять");
            add("девяносто шесть");
            add("девяносто семь");
            add("девяносто восемь");
            add("девяносто девять");
            add("сто");//100
        }
    };

    public static void main(String[] args){

        while(true) {

            result = 0;//一応初期化しておく

            int level = levelSelect();

            switch(level) {
            case 1:
                max = 21;
                quiz();
                break;
            case 2:
                max = 101;
                quiz();
                break;
            case 3:
                max = 300;
                System.out.println("ごめんね!未実装です");
                break;
            }

            System.out.println("\nもういちど挑戦しますか?");
            System.out.println("1:はい 2:いいえ");

            int retry = inputNum();

            if(retry == 2) {
                System.out.println("\n遊んでくれてありがとう!");
                System.out.println("何かキーを押すと終了します");
                int wait;
                wait = inputNum();//キー入力待ち
                break;
            }

        }

    }

    private static int inputNum() {//数値入力
        int x;
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);
        System.out.print("\n>");
        try {
            String buf = br.readLine();
            x = Integer.parseInt(buf);
        }catch(Exception e) {
            x = 0;
        }
        return x;
    }

    private static int levelSelect() {//レベル選択

        System.out.println("\nレベルを選択してください");
        System.out.println("1:初級【0から20までの数】");
        System.out.println("2:中級【0から100までの数】");
        System.out.println("3:上級【大きな数と時間】");

        int y = 0;

        while(true) {
            y = inputNum();
            if((y <= 0)||(y >= 4)) {
                System.out.println("1~3の範囲で入力してください");
                continue;
            }
            break;
        }
        return y;
    }

    private static int ranMaker() {//乱数作成(問題番号選択用)
        int a;
        Random rnd = new Random();
        a = rnd.nextInt(max);
        return a;
    }

    private static void quiz() {//出題~答え合わせメインループ

        System.out.println("10問続けて出題します。\n何かキーを押してスタート");
        int wait;
        wait = inputNum();//キー入力待ち

        long start = System.currentTimeMillis();//時間計測スタート

        for(int i = 1; i <= 10; i++) {
        String question = mondai();
        System.out.println("\n"+question);
        player = inputNum();

        if(player == ran) {
            System.out.println("正解!");
            result++;
        }else {
            System.out.println("不正解");
            System.out.println("答え:"+(ran));
            }
        }

        long end = System.currentTimeMillis();//時間計測ストップ

        long time = (end - start);

        System.out.println("\n終了です!\nお疲れさまでした");
        System.out.println("\n◆結果発表◆");
        System.out.println("正答数:"+result+"問");
        System.out.println("所要時間:"+time/1000+"秒");
        System.out.print("評価:");

        if(result <= 2) {
            if (time/1000 <= 20) {
                System.out.println("☆☆☆☆☆\n\nあなたのランクは【だめだめ】です");
                System.out.println("「はやければ いいってもんじゃ ない」");
            }else {
                System.out.println("★☆☆☆☆\n\nあなたのランクは【まだまだ】です");
                System.out.println("\n「のびしろ むげんだい」");
            }
        }else if((result >= 3)&&(result <= 5)) {
            System.out.println("★★☆☆☆\n\nあなたのランクは【まあまあ】です");
            System.out.println("\n「きみなら もっといけるはず」");
        }else if((result >= 6)&&(result <= 7)) {
            System.out.println("★★★☆☆\n\nあなたのランクは【そこそこ】です");
            System.out.println("\n「そのちょうし みなおし わすれずに」");
        }else if((result >= 8)&&(result <= 9)) {
            System.out.println("★★★★☆\n\nあなたのランクは【まずまず】です");
            System.out.println("\n「おしい あといっぽ がんばろう」");
        }else if(result == 10) {
            if (time/1000 >= 20) {
                System.out.println("★★★★★\n\nあなたのランクは【なかなか】です");
                System.out.println("\n「たいへん よくできました");
                System.out.println(" つぎは さらなるたかみ めざそう」");
            }else {
                System.out.println("★☆★☆★\n\nあなたのランクは【かんぺき】です");
                System.out.println("\n「すばらしい Поздравляю!」");
            }
        }


    }


    private static String mondai() {//問題参照
        String q;
        ran = ranMaker();
        q = new String(mondai.get(ran));
        return q;
    }

}

    /*
    private static int kotae() {//答え参照
        ArrayList<Integer> kotae = new ArrayList<Integer>(300) {
            {
                add(1);
                add(2);
                add(3);
            }

        };
    }

    ↑よく考えたらリスト番号で答え合わせできるからレベル3実装するまでこのプログラムいらない
    */

    /*
    public static String fileRead(int ran) {
        String line = null;
        try {
            FileReader fr = new FileReader("file.txt");
            BufferedReader br = new BufferedReader(fr);
            line = br.readLine();
            br.close();
        }catch(IOException ex) {
            System.out.println("システムエラー");
        }
        return line;
    }
    */
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

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:上級【大きな数と時間】

>13の範囲で入力してください

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/14 01:48

    早速の回答ありがとうございます!!
    こちらでも試してみたところ、無事に実行できました。ご教授の通りrussianフォルダに入れても実行できましたし、ソースコードからパッケージ宣言を丸ごと削除することでも可能でした。こんな単純なことだったなんて…。

    しかし一点だけ疑問が残ります。コンパイルしたときにどうしてclassファイルが2つできてしまうのでしょうか?
    しかも、$1がついたほうを消すと実行できなくなるようです(java.lang.NoClassDefFoundErrorになります)。
    これらにはどのような意味があるのでしょう?

    お答えいただけたら嬉しいです。

    キャンセル

  • 2017/10/14 02:06

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

    キャンセル

  • 2017/10/14 13:16

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

    キャンセル

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 13:21

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

    キャンセル

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

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13166questions

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

  • Eclipse

    1606questions

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

  • JAR

    87questions

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