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

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

ただいまの
回答率

89.63%

コマンドでのコンパイル

解決済

回答 3

投稿

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

nterka

score 10

前提・実現したいこと

eclipseではコンパイル可能で実行可能でしたが、自分でWindowsのコマンドプロンプトでコンパイルしようとするとエラーとなってしまいます。。

また、1ファイルの場合では自分でコマンドプロンプトでのコンパイルから実行まで可能できました。複数クラス(複数ファイル)になるとコンパイルエラーとなってしまいます。

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

エラーメッセージ
シンボルを見つけられません

試したこと

なにか設定に不備があると思い各種サイトを見たのですが解決できず、「ここを確認したらよいかも」という点がありましたら、ぜひご教示いただけますと幸いです。どうぞよろしくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+4

単なる勘ですが、-sourcepath、-d、-cp(-classpass)オプションあたりのコマンドパラメーターの間違いという気がします。

質問文にこういうふうに書いてあれば原因かわかりやすいという例もかねて、一つのコンパイル&実行の例を挙げてみます。

  • パッケージ(ソース)構成
    package1.Main <-こちらにmainメソッドあり
    package2.Test
    (標準ライブラリー以外の外部ライブラリーは未使用)

  • ディレクトリー構成

  今いるディレクトリー
     +- src <- ソースファイル用
     |    +- package1
     |    |    Main.java
     |    +- package2
     |         Test.java
     +- bin <-クラスファイル出力用

なら、ソースファイルに誤りがない限り、以下でコンパイルと実行ができます。

$ javac -version
javac 9          <== javaとバージョンが一致
$ java -version
java version "9" <== javacとバージョンが一致
Java(TM) SE Runtime Environment (build 9+181)
Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)
$ javac -sourcepath src -d bin src/package1/Main.java
$ java -cp bin package1.Main

なにか設定に不備があると思い各種サイトを見たのですが解決できず

javacが動いたのでしょうから、単純にコマンドのパラメータの問題である気がします。プログラミングにおいてはまずマニュアル・リファレンス・仕様書の類をできるだけ読むのがよいです。javacのパラメータについては調べておられますか?それを調べれば「あ、これかな」と気づけることも結構あります。何が書いてあるかわからん!ということも確かに多いのですが、わからなければ質問するという手もあります。

「ここを確認したらよいかも」という点がありましたら

あなたがどういうパッケージ構成、ディレクトリー構成、コマンドオプションを指定したか、どんなエラーメッセージ(※)が出たのか明記せずに「どこが間違っていそうか」を尋ねるのは閲覧者からするとなぞなぞのような質問に見えるものです。上の方に書いた「どんな状態で何をしたか」をなるべく詳しく明確に書く必要があるということを認識しておくのが良いでしょう。
本件の場合「javacによる正しいコンパイルの仕方」がまだわからないのですから、ごく短い2~3のソースファイルを用いて試すこと、及び質問の際にはその短いソースの中身も含めて提示するのがベターだと思います。短いソースでやる方がいいのは「質問側・回答側双方にとって問題点を絞りやすくするため」です。

シンボルを見つけられません 

経験を積んだ質問者さんの場合「必要充分な情報」が何かが判断でき、「冗長な情報は記載しない」とできると思います。しかし初心者の方の場合は大概、

src\package1\Main.java:7: エラー: シンボルを見つけられません
    System.out.println(new Test());
                           ^
  シンボル:   クラス Test
  場所: クラス Main

    1   package package1;
    2
    3   import package2.Test;
    4
    5   public class Main {
    6     public static void main(String[] args) {
    7       System.out.println(new Test()); <==この行でコンパイルエラー
    8     }
    9   }


などのようになるべく自分の解釈を排した明確な事実を記載した方がベターであることが多いです。エラーメッセージの中には「あなたには気づけない問題のポイント」が隠されているかも知れないのです。例えばシンボルが見つからないってのが標準ライブラリーのクラス名なのか自分で定義したクラス名なのかによって問題点の切り分け方が違ってきます。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/10/08 01:08

    こちらありがとうございます。質問についてもその通りですね・・・。
    エラー文言など、そのまま貼るようにしたいと思います。

    キャンセル

checkベストアンサー

+3

例として、Eclipseでmyprojectというプロジェクトを作成し、com.example.mysampleというパッケージを作成して、その中にMain.javaとSub.javaという2つのJavaソースファイルを作ったとしましょう。mainメソッドはMain.javaの中にあって、その中でSub.javaのインスタンスを生成しているような構成になっているものとします。そうすると、myproject以下のディレクトリーツリーはこんな感じになっているはずです。

myproject
 ├ src
 │ └ com
 │   └ example
 │     └ mysample
 │       ├ Main.java
 │       └ Sub.java
 └ bin

Eclipseでは、ソースファイルはsrcの下に、コンパイルしたclassファイルはbinの下に配置するようになります。その結果通りにコマンドプロンプトでコンパイルしたい場合、まずmyprojectの直下に移動します。そこで、

C:\hoge\fuga\myproject>javac -sourcepath src -d bin src\com\example\mysample\Main.java


と実行すれば、2つのソースファイルがまとめてコンパイルされて通るはずです。

或いは、

C:\hoge\fuga\myproject>javac -d bin src\com\example\mysample\Sub.java
C:\hoge\fuga\myproject>javac -d bin -cp bin src\com\example\mysample\Main.java


のようにソースファイルごとにコンパイルして、Main.javaのコンパイルのときには-cp(或いは-classpath)を付けて先にコンパイルしたSub.classを参照するようにしても通るでしょう。

コンパイルが完了すると、binの下にsrcと同じようなパッケージ名によるディレクトリー階層が出来て、その下にclassファイルが作られているでしょう。

これを実行したければ、

C:\hoge\fuga\myproject>java -cp bin com.example.mysample.Main

のように完全修飾クラス名で指定すれば実行できます。ここでも-cpオプションの指定は必要です。


途中で間違った回答をしたり、後から回答を追記したりしています。いろいろ右往左往して申し訳ありません。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/10/07 14:29

    > この-cpを抜かしてしまうと、Main.javaをコンパイルしたときにSubクラスが参照エラー

    自分の回答例ではbinの下に何もない状態でMain.javaのみをコンパイルしてもTestクラスの参照エラーは起きませんでした。(経験的にですが)-dと同じ場所である場合は-cpは不要という認識でした。本来は付けるべきなのだろうか・・・

    キャンセル

  • 2017/10/07 14:32

    ごめんなさい、私の回答の不備です。修正している間にコメントが付いてしまいました。-sourcepathの指定さえしていれば、コンパイルでは-cpの指定は不要だったようです(実際、実験的にプロジェクトを使って確認しました)。不備の回答にわざわざ目を通していただいて恐縮ですし、面目次第もございません。

    キャンセル

  • 2017/10/07 14:52 編集

    知識を相互に補い合う場である点がteratailのよいところと思います。
    自分も間違った回答して指摘をいただくことで学ばせていただいてます。「え!これ間違いだったのですか!?」とショックを受けることもままありますが、気づかないままいるよりはこのサイトで恥かいた方がいいやーと自分は思ってます。

    キャンセル

  • 2017/10/08 01:11

    頂いた例をもとにして自分で改めて試して、理解/解決できました。
    ありがとうございます。

    ※それが解決したあとにもencodingやら何やらありましたが、オプションを付けて無事通ることができました。ありがとうございました

    キャンセル

+3

おそらくですが、下記サイトの記載内容が参考になるのではないかと思います。

初心者のためのJava講座/WEBワークショップ 【第12回】クラスパスについて理解する
初心者のためのJava講座/WEBワークショップ 【第13回】パッケージについて理解する

Eclipse上であれば問題なく実行できるコードであるという前提のもとで考えられるエラーの原因としては、以下のようなものがあります。

  • Eclipseで使用しているJavaのバージョンと、コマンドプロンプトで実行しているjavacのバージョンが異なる。
  • コード内でnamespaceを定義しているが、それを考慮した場所でjavacが実行されていない。
  • クラスパスの設定が適切に行われていない。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/10/07 14:17

    本来ならsuyamaさんぐらいの長さの回答が望ましいと思います。質問の仕方を考えてほしいということもあり自分は長すぎる回答をしてしまいました・・・

    キャンセル

  • 2017/10/08 01:05

    ありがとうございます。Javaのバージョンを最新化しておきました。

    キャンセル

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

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