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

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

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

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

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

Q&A

解決済

2回答

1028閲覧

Javaにて、複数クラスで構成されるプログラムのコンパイルが通らない

SuzukI

総合スコア1

Java

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

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

0グッド

0クリップ

投稿2023/08/21 23:51

編集2023/08/21 23:53

はじめに

  • 複数クラスで構成されるプログラムのコンパイルの仕方を教えてください。
  • 詳細は下記の通りです。

実現したいこと

  • コンパイルを通したい

問題点

  • 足し算と引き算をするメソッドを持つクラスを、メインから呼び出して実行するプログラムを作成中
    • 備考に記載している書籍の通りに実行しているつもり(コードも丸コピ)だがコンパイルが通らない
      • 書籍に記載されいる内容
        1. 各クラスごとにファイルを作成する
        2. パッケージ化する
        3. コンパイルする

これまでの経緯

  • ディレクトリ構成

    C:. └─calcapp ├─logics │ CalcLogic.class │ CalcLogic.java │ └─main Calc.java
  • 以下の2種類のソースコードを作成

    • CalcLogic.java

      java

      1package calcapp.logics; 2 3public class CalcLogic { 4 public static int tasu(int a, int b) { 5 return (a + b); 6 } 7 public static int hiku(int a, int b) { 8 return (a - b); 9 } 10}
    • Calc.java(mainメソッドが記載されているファイル)

      java

      1package calcapp.main; 2import calcapp.logics.*; 3 4public class Calc { 5 public static void main(String[] args) { 6 int a = 10; int b = 2; 7 int total = CalcLogic.tasu(a, b); 8 int delta = calcapp.logics.CalcLogic.hiku(a, b); 9 System.out.println("足すと" + total + "、引くと" + delta); 10 } 11}
  • 該当ディレクトリに移動して、コンパイルを実行

    • CalcLogic.java

      json

      1cd C:\Users\<ユーザー名>\Desktop\Git-practice\スッキリわかるJava入門\calcapp\logics 2javac CalcLogic.java
    • Calc.java

      json

      1cd C:\Users\<ユーザー名>\Desktop\Git-practice\スッキリわかるJava入門\calcapp\main 2javac Calc.java

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

  • CalcLogic.javaのコンパイルは通る

  • Calc.javaをコンパイルしようとすると以下のエラーが発生

    java

    1Calc.java:2: エラー: パッケージcalcapp.logicsは存在しません 2import calcapp.logics.*; 3^ 4Calc.java:7: エラー: シンボルを見つけられません 5 int total = CalcLogic.tasu(a, b); 6 ^ 7 シンボル: 変数 CalcLogic 8 場所: クラス Calc 9Calc.java:8: エラー: パッケージcalcapp.logicsは存在しません 10 int delta = calcapp.logics.CalcLogic.hiku(a, b); 11 ^ 12エラー3
    • パッケージ、メソッドが見つからないと怒られるが、指定の仕方は合っているし、冒頭に書いた通り書籍に書いてあるコードを丸コピしている
      • ソースコード上にもエラーは発生していない

自分なりの考察

  • ディレクトリ構成が間違っている
    • ディレクトリ構成までは記載されてなく、どのファイルをどのパッケージに属するかしか書いてなく、パッケージ名を元に自分でディレクトリを構成したため
  • コンパイルの手順が間違っている
    • 書籍の内容を正しく理解していない
    • 見落としがある

備考

  • 実行環境
    • OS
      • windows11
    • JDK
      • Eclipse Temurin(JDK17)
  • 現在、「スッキリわかるJava入門 第3版」を学習中
    • 6章「複数クラスで構成されるプログラム」を進行中

以上になります。
よろしくお願いいたします。

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

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

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

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

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

jimbe

2023/08/22 02:53

書籍にはパッケージを使用する場合にどのフォルダでどう指定してコンパイルするのかの説明は無いのでしょうか。
SuzukI

2023/08/22 16:09

せっかく回答して下さったのに、見落としており失礼しました。 フォルダ関連のことに関する記載は無く、パッケージとフォルダの関係性は自分で調べてコンパイルしております。。。 単に私が見落としているだけかもしれませんが・・・
jimbe

2023/08/22 17:43 編集

いえ、この欄は「質問へのコメント」でして回答ではありません。 回答が付いて話が進んでいれば先ずはそちらでしょうから、気になさらずに。 java のパッケージはフォルダ構造に直結していますが、それがどういうことなのかの説明が無いと難しいと思います。 terateil でも何度か見かけています。 eclipse 等の開発環境を使えばパッケージがどうあれコンパイルや実行が出来ますが、実際に何が行われているのかを理解しておいたほうが良いかもしれませんし、それもまた難しい所です。
SuzukI

2023/08/23 07:00

恐れ入ります。 パッケージ=フォルダ構造に直結という認識で合っているのですね! 文章でふわっとしか書いてないので、初学者としてはディレクトリ構造図もあったほうが嬉しいですね。 eclipseもインストールしたのですが、書籍によると最低限の構成で学習したほうが(JDKとエディタのみ)Javaプログラムの仕組みが分かるとあり実践している状態です。 私としても、PHPとPythonを軽く触った事しか無く、コンパイル→実行の概念を深く理解したいという気持ちが強いですが、ここ数日頭を抱えております・・・
jimbe

2023/08/23 19:57 編集

パッケージはフォルダ構造に直結しているため、逆にいうとパッケージが明示されていればフォルダ構造が決まっているということになります。 javac でコンパイルする場合等では、calcapp.main.calc というクラスは、"カレンドディレクトリ下"の ./calcapp/main/calc.java にあるということになっており、もしカレントディレクトリ下に無かったら、クラスパス内のどこかにある…ということになっています。 javac で指定する "クラス" はファイルですので、 calcapp.main.calc クラスをコンパイルするには ./calcapp/main/calc.java があるフォルダをカレントディレクトリにした上で javac calcapp/main/calc.java とすることになります。この辺ファイルなのかパッケージなのかごちゃごちゃになります(>< calcapp.main.calc クラスが使用する calcapp.logics.CalcLogic クラスの見つけ方も同様です。 javac は、 calcapp.main.calc クラスのコンパイル中に calcapp.logics.CalcLogic クラスが必要と分かるとカレントディレクトリ下の ./calcapp/logics/CalcLogic.java ファイルを探して有ればそれをコンパイルしてリンクしてくれます(javac に "calcapp/logics/CalcLogic.java" を追加指定する必要はありません)し、無かったらクラスパスから探してくれます。
SuzukI

2023/08/23 19:43

丁寧にご回答ありがとうございます。 先程まで頭が混乱して発狂していましたが、ようやく仰ってることが理解でき、コンパイルが通りました。
guest

回答2

0

ベストアンサー

ソースフォルダのルートでやるのは既存の回答でうまく行ってるみたいですので……

敢えて calcapp\main 以下でやりたいのならば、 -cp 指定はおそらくこうですね。

powershell

1calcapp\main> tree ../../ /F 2# D:. 3# └─calcapp 4# ├─logics 5# │ CalcLogic.java 6# │ 7# └─main 8# Calc.java 9 10calcapp\main> javac -encoding UTF-8 Calc.java 11# Calc.java:3: エラー: パッケージcalcapp.logicsは存在しません 12# import calcapp.logics.*; 13# ^ 14# Calc.java:8: エラー: シンボルを見つけられません 15# int total = CalcLogic.tasu(a, b); 16# ^ 17# シンボル: 変数 CalcLogic 18# 場所: クラス Calc 19# Calc.java:9: エラー: パッケージcalcapp.logicsは存在しません 20# int delta = calcapp.logics.CalcLogic.hiku(a, b); 21# ^ 22# エラー3個 23# 24# ※cp指定がないとできないという確認だけ。別にやらなくてもよいです 25 26# calcapp\main> javac -encoding UTF-8 ../logics/CalcLogic.java 27# ※依存コンパイルされるので、やらなくてもよいはずです 28 29 30calcapp\main> javac -encoding UTF-8 -cp ../../ Calc.java 31calcapp\main> tree ../../ /F 32# D:. 33# └─calcapp 34# ├─logics 35# │ CalcLogic.class 36# │ CalcLogic.java 37# │ 38# └─main 39# Calc.class 40# Calc.java 41 42calcapp\main> java calcapp.main.Calc 43# エラー: メイン・クラスcalcapp.main.Calcを検出およびロードできませんでした 44# 原因: java.lang.ClassNotFoundException: calcapp.main.Calc 45# 46# ※cp指定がないとできないという確認だけ。別にやらなくてもよいです 47 48calcapp\main> java -cp ../../ calcapp.main.Calc 49# 足すと12、引くと8 50

投稿2023/08/22 20:14

pecmm

総合スコア760

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

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

SuzukI

2023/08/23 19:38 編集

返信が遅くなって申し訳ありません。 そして丁寧なご説明ありがとうございます。 自分の知識不足で読み解くのに時間が掛かりました。 ../../でソースフォルダのディレクトリに戻ってから実行するということですね 無事、コンパイルが通りました。 自分なりに整理をしてみたのですが、以下の認識であってますか? もしお時間があればご回答いただけると幸いです。 ●コンパイルに関して ソースフォルダのディレクトリからコンパイルする場合 ・クラスパスを使用する場合   javac -cp ./ calcapp/main/Calc.java ・クラスパスを使用しない場合  javac calcapp/main/Calc.java ソースフォルダのルートディレクトリ以外からコンパイルする場合 ・../で一旦ソースフォルダのルートディレクトリに戻ってからコンパイルする  カレントディレクトリ calcapp\main  java -cp ../../ calcapp.main.Calc ●実行に関して ソースフォルダのディレクトリから実行する場合 ・クラスパスを使用する場合  ソースフォルダのディレクトリにいる場合はクラスパスは使用できない?  java -cp ./ calcapp/main/Calc  エラー: メイン・クラスcalcapp.main.Calcを検出およびロードできませんでした  原因: java.lang.ClassNotFoundException: calcapp.main.Calc ・クラスパスを使用しない場合  java calcapp/main/Calc ソースフォルダのルートディレクトリ以外から実行する場合 ・../で一旦ソースフォルダのルートディレクトリに戻ってからコンパイルする  カレントディレクトリ calcapp\main  java -cp ../../ calcapp.main.Calc
guest

0

javac が calcapp.logics を見つけるために、javac -cp C:\Users\<ユーザー名>\Desktop\Git-practice\スッキリわかるJava入門 Calc.javajavac -cp ..\.. Calc.javaとする必要があるかと思います。

また、

cd C:\Users\<ユーザー名>\Desktop\Git-practice\スッキリわかるJava入門 javac calcapp/main/Calc.java

とすると CalcLogic.java も自動的に同時にコンパイルされると思いますし、コンパイル後に実行することも考えると C:\Users\<ユーザー名>\Desktop\Git-practice\スッキリわかるJava入門 をカレントディレクトリにしたほうが話は簡単かと思います。

投稿2023/08/21 23:57

編集2023/08/22 00:03
int32_t

総合スコア21929

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

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

SuzukI

2023/08/22 04:58 編集

ご回答ありがとうございます。 クラスパスを付けなければならなかったのですね・・・ 初歩的なことでお恥ずかしいです。 早速、頂いたアドバイスを元に実践してみました。 ``` javac が calcapp.logics を見つけるために、javac -cp C:\Users\<ユーザー名>\Desktop\Git-practice\スッキリわかるJava入門 Calc.java や javac -cp ..\.. Calc.javaとする必要があるかと思います。 ``` - 以下のディレクトリに移動して実行しましたが、いずれにしてもソースファイルを見つけられませんでした。 - ルートディレクトリ - C:\Users\<ユーザー名>\Desktop\Git-practice\スッキリわかるJava入門 ``` C:\Users\<ユーザー名>\Desktop\Git-practice\スッキリわかるJava入門>javac -cp "C:\Users\<ユーザー名>\Desktop\Git-practice\スッキリわかるJava入門 Calc.java" エラー: ソース・ファイルがありません ``` - コンパイルするファイルが存在するディレクトリの1つ上のディレクトリ - C:\Users\<ユーザー名>\Desktop\Git-practice\スッキリわかるJava入門\calcapp ``` C:\Users\<ユーザー名>\Desktop\Git-practice\スッキリわかるJava入門\calcapp>javac -cp "C:\Users\<ユーザー名>\Desktop\Git-practice\スッキリわかるJava入門 Calc.java" エラー: ソース・ファイルがありません ``` - コンパイルするファイルが存在するディレクトリ - C:\Users\<ユーザー名>\Desktop\Git-practice\スッキリわかるJava入門\calcapp\main ``` C:\Users\<ユーザー名>\Desktop\Git-practice\スッキリわかるJava入門\calcapp\main>javac -cp "C:\Users\<ユーザー名>\Desktop\Git-practice\スッキリわかるJava入門 Calc.java" エラー: ソース・ファイルがありません ``` どのディレクトリからコンパイルを実行するべきなのかが、全く理解できていないことがわかりました。 書籍にクラスパスに関する記載がありましたので、今一度勉強してやり直してみます。 ``` cd C:\Users\<ユーザー名>\Desktop\Git-practice\スッキリわかるJava入門 javac calcapp/main/Calc.java ``` こちらは実行したところ、無事コンパイルが通りました。 ルートディレクトリに移動してから、javacコマンドで階層を潜っていって実行すれば良いのですね。 でないと、「メイン・クラスCalcを検出およびロードできませんでした」になりますもんね。
int32_t

2023/08/22 05:12

> 以下のディレクトリに移動して実行しましたが、いずれにしてもソースファイルを見つけられませんでした。 最後のやつ以外は、ディレクトリは C:\Users\<ユーザー名>\Desktop\Git-practice\スッキリわかるJava入門\calcapp\main のままの前提です。
SuzukI

2023/08/22 05:45

仰る通り、コマンド「javac -cp "C:\Users\<ユーザー名>\Desktop\Git-practice\スッキリわかるJava入門 Calc.java"」を見るに、mainディレクトリから実行することを前提ですよね・・・ 上記ディレクトリに移動してコマンドを打ちましたが、やはり以下の通りソース・ファイルがありませんになってしまうのです。 C:\Users\<ユーザー名>\Desktop\Git-practice\スッキリわかるJava入門\calcapp\main>javac -cp "C:\Users\<ユーザー名>i\Desktop\Git-practice\スッキリわかるJava入門 Calc.java" エラー: ソース・ファイルがありません
SuzukI

2023/08/23 19:39

先日はありがとうございました。 頂いたアドバイスを自分の中に落とし込み、無事コンパイルが通りました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問