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

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

ただいまの
回答率

89.10%

クラスパスの指定について

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,873

kasa-nyan

score 9

javaで2つのソースコード(Calc.javaとCalcLogic.java)にまたがって作成された1つのプログラムは、コンパイルには成功しますが、実行できません。

コマンドプロンプトに打ち込むコマンドは、java calcapp.main.Calcです。
エラー内容は、メイン・クラスcalcapp.main.Calcが見つからなかったかロードできませんでした、というものです。
おそらく、クラスパスの指定ができていないのだと思います。
ユーザー環境変数に新規で、変数名:CLASSPATH 変数値:C:\javaという任意のディレクトリを指定して適応させると、C:\Users\xxxx\soucecode\java配下にあるソースコードがすべて実行できなくなってしまいます。
なので、もともとあった変数名:JAVA_HOME 変数値:C:\Program Files\Java\jdk1.8.0_172の変数値に、C:\javaを追加して対応することにしました。
追加後は、変数名:JAVA_HOME 変数値:C:\Program Files\Java\jdk1.8.0_172;C:\javaです。
しかしそれでも実行できません。

ちなみに実行させようとしているCalc.javaとCalcLogic.javaの完全限定クラス名はcalcapp.main.Calcとcalcapp.logics.CalcLogicで、C:\java\calcapp配下にmainとlogicsというフォルダを作成してそれぞれ保存してあります。

またコマンドプロンプトで実行する際は、java calcapp.main.Calc calcapp.logics.CalcLogicと2つ並べて記述せず、java calcapp.main.Calcと入力して、enterキーを押せばいいのですよね?

適切にまとめられていない質問かもしれませんが、javaの勉強に行き詰っているので、どうかご回答いただけると助かります。
必要な情報が記載されていない場合は、ご指摘いただければお伝えします。

【Calc.java】
package calcapp.main;
import calcapp.logics.CalcLogic;    // この行を追加

public class Calc{
public static void main(String[] args) {
int a = 10; int b = 2;
int total = CalcLogic.tasu(a,b);    // FQCNじゃなくてもOK
int delta = calcapp.logics.CalcLogic.hiku(a,b);
// もちろんFQCNで書いてもOK
System.out.println("足したら" + total + "、引いたら" + delta);
}
}

【CalcLogic.java】
package calcapp.logics;
public class CalcLogic {
public static int tasu(int a, int b) {
return (a + b);
}

public static int hiku(int a, int b) {
return (a - b);
}
}

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • kasa-nyan

    2018/10/02 13:03

    ソースコードを追加しました。

    キャンセル

  • mather

    2018/10/02 17:02

    このコードを書くにあたって参考にしたページや資料があれば、それもできる限り提示してくださいね。

    キャンセル

  • kasa-nyan

    2018/10/04 13:45

    参考にした資料は、スッキリわかるJava入門第2版の第6章複数クラスを用いた開発の6.6クラスが読み込まれるしくみ6.7パッケージに属したクラスの実行方法です。

    キャンセル

回答 3

checkベストアンサー

0

提示していただいたコードを私のローカル環境で同じディレクトリ構成で
コンパイルし、実行しましたが再現しませんでした。

「正しくやったはずだ」という思い込みは捨てて、改めて下記を確認してください。
・ディレクトリ構成が正しく、誤字脱字もない
・コンパイルが正常に完了している
・実行時のコマンドがjava calcapp.main.Calcである


[コメントのコンパイル方法などを拝見して追記]

コンパイル後のクラスファイルはパッケージと同じディレクトリ構造の場所に置かないといけません。
エラー:メイン・クラスCalc(もしくは完全限定クラス名)が見つからなかったかロードできませんでした
というエラーはそれが守られていないために起きます。

どういう手順でコンパイルおよび実行すればよいのか2パターン書きます。

 Javaファイルがプロジェクトルート(calcapp/ が置いてあるディレクトリ)にある状態

  1. javac Calc.java CalcLogic.javaでコンパイルします
  2. Calc.classCalcLogic.classが生成されます。(ここまではやっていた手順と同じ)
  3. 生成されたCalc.classcalcapp/main/に移動します。
  4. 生成されたCalcLogic.classcalcapp/logics/に移動します。
  5. java calcapp.main.Calcで実行します。

この手順は修正のたびにファイルの移動が行われるので、非効率です。
実際は次のパターンのように指定のディレクトリにjavaファイルを置いた状態で行うと良いでしょう。

 Javaファイルがパッケージ通りのディレクトリにある状態

  1. calcapp/main/Calc.javacalcapp/logics/CalcLogic.javaがある状態で
    javac calcapp\main\Calc.javaでコンパイルします。(.ではないので注意)
  2. calcapp/main/Calc.classcalcapp/logics/CalcLogic.classが生成されます。
  3. java calcapp.main.Calcで実行します。

注意点としてはコンパイル時は\(linux系は/)、実行時は.でパッケージ(ディレクトリ)を表すことです。

どちらかの方法でやってみてください。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/02 17:15

    カレントディレクトリはcalcappがあるディレクトリと同じ場所である必要があります。
    カレントディレクトリはどこになっているでしょうか?

    キャンセル

  • 2018/10/02 17:28

    カレントディレクトリを合わせたらコンパイル・実行ともにできました。
    ありがとうございます。

    しかし一つすっきりしない点がありますので、質問させてください。
    私が参考にしている教材では、クラスパスを指定する(Windowsでコントロールパネルから入っていき環境変数をいじるところで設定)ことによって(ここでは例としてクラスパスをC:\javaとしたとします)、完全限定クラス名で指定することでコンパイル・実行ともにできるようになるというような記載があるのですが、ここを理解するのにあたって、カレントディレクトリはどこでも完全限定クラス名で指定すればコンパイル・実行ともにできるようになるものだと脳内補完してしまっていたようです。
    この脳内補完は間違っていますか?
    環境変数の設定でクラスパスを指定すれば、カレントディレクトリに関係なくコンパイル・実行ができるようになりますか?
    それともやはり不可能なのでしょうか?

    キャンセル

  • 2018/10/02 17:54

    なるほどやっとクラスパスにこだわっていた理由が判明しました。
    私自身クラスパスを設定して使う機会が殆どなかったものでそういう設定ができる事自体失念してました。

    classpathはあくまでも「クラスがあるパス」を指定するもので、ディレクトリを指定するものではありません。設定するのであれば「C:\java\calcapp\main\Calc」のようになるでしょう。

    キャンセル

0

一応つっこんどこう

CLASSPATH を設定する場合は

  1. .;C:\java\libpath\commons-lang.jar (明示的にカレントパスを設定する)
  2. C:\java\libpath\commons-lang.jar;  (セミコロンで終わらす)

とする必要があります。

また

C:\Program Files\Java\jdk1.8.0_172;C:\java のようにディレクトリを指定した場合、ディレクトリだからその下全てをマッピングするということはありません。
jar ファイルを全部明示的に指定しましょう。

あと設定が C:\java\libpath\commons-lang.jar  のようにカレントパスを含まない場合は クラスパスに設定した jar ファイル内からしか探しません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/02 13:08

    CLASSPATHの設定について。
    1の.;にはどういう意味がありますか?
    2のセミコロンで終わらせるのは、なぜ1には適応されないのですか?
    またカレントパスとは現在開いているパスのような意味合いでしょうか?

    jarファイルとはなんですか?
    またjarファイルを明示的に示すにはどうしたらいいですか?

    キャンセル

  • キャンセル

-1

PATH や CLASSPATH を設定しなくても、プロジェクトのルートディレクトリにいればコンパイルと実行ができますよ?

フォルダ構成

calcapp
├── logics
│   └── CalcLogic.java
└── main
    └── Calc.java

実行したコマンドと結果

$ javac calcapp/main/Calc.java
$ javac calcapp/logics/CalcLogic.java
$ java calcapp.main.Calc
足したら12、引いたら8

実行後のフォルダ構成

calcapp
├── logics
│   ├── CalcLogic.class
│   └── CalcLogic.java
└── main
    ├── Calc.class
    └── Calc.java

今一度ご確認ください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/02 19:44

    @mather
    CLASS_PATH の設定でカレントパス無視の状態になってるからねいま。

    キャンセル

  • 2018/10/03 00:22

    なるほど。CLASSPATHは自身で設定したようなので、自身で直してもらうしかないですね。

    キャンセル

  • 2018/10/04 13:41

    お返事遅くなり申し訳ありません。
    回答ありがとうございました。
    javacコマンドを実行する際に、正しいフォルダにいなかったことが今回、コンパイル・実行ができなかったことの理由でした。
    クラスパスの指定は環境変数をいじって確かに自分で設定したのですが、うまく機能していないようです。
    結局、環境変数を設定しても、プロジェクトのルートディレクトリにいないと、コンパイル・実行ができません。
    この場合、環境変数の設定の何がいけないのでしょうか?

    【以下設定内容】
    JAVA_HOME 変数値:C:\Program Files\Java\jdk1.8.0_172の変数値に、C:\javaを追加して対応することにしました。
    追加後は、変数名:JAVA_HOME 変数値:C:\Program Files\Java\jdk1.8.0_172;C:\javaです。
    なお、コンパイル・実行をしようとしているファイルは、C:\java\calcapp\main\Calc.javaとC:\java\calcapp\logics\CalcLogic.javaです。

    キャンセル

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

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

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