別のファイルをコピーして作成しただけなのになんで実行できないの?クラスファイルも生成されているのに!!
java_lessons/com/dot/myapp
にMyApp.javaを作成。
MyApp.javaをコピーしてPractice.java
を作成。
試したいことをPractice.javaに書いていく。
MyApp.javaの外部クラスをjava_lessons/com/dot/myapp/model
に入れていて、それを読みこんでいたけど、外部クラスを読み込まずに簡単なコードを試したいのでpackageとimportを削除してPractice.javaを作成して行った。
そしてコンパイルはうまく行ったけど、実行ができない。
実行しようとすると
メイン・クラスcom.dot.myapp.Practiceが見つからなかったかロードができませんでした
というエラーのループに。
調べたらPATHがどうとか書いてたけど、java_lessonsのディレクトリとは別にtestディレクトリを作成してそこにPractice.javaを移動してコンパイル・実行をするとできた。
ということはPATHがどうとかいう話ではないのではないかと考えた。
でもどうしたらいいかわからない。
ん〜こう言う時ってどうしたらいいんだろう。質問できる人がいたらいいけど、独学だからいません!ネットで聞けばいいけど、それならなんとか自分で対処したい!
解決までのプロセス
とりあえず考えられる原因をいくつか列挙できればそれぞれの原因について調べて見れば、同じようなエラーメッセージと合わせて検索に引っかかるはず!!
自分が作成したファイルと実行できていたコピー元のファイルを比較して原因究明
- mainはなんか特別なメソッドらしいから、別ファイルだけどmainが同じ階層に存在しているのがおかしいのか?
- packageを利用してないから消したけど、利用してないけど書けばできるのか?
- やっぱりPATHを通す設定が必要なのか?
- vagrantでsshで接続して実行とかしてるけど、ファイルの保存ができてなかったりして実行ファイルを読み込めない?
- FTPにCyberduckを利用しているけど、それがうまく行っていない?
あとはトライアルアンドエラー
1.の対処
java_lessonsの階層深くに入っていたけど、まずは別のディレクトリを作成して移動する。
- java_lessonsの横にtestフォルダを作成
- Practice.javaをそこに移動
- ターミナルでtestに移動
- コンパイル・実行
- 実行できた → mainメソッドは同じ階層に一つしかアカン?
- test/practiceのフォルダを作成
- ファイルを移動
- コンパイル・実行
- できない → mainは一つしかないのに・・・
- またtestに移動させる
- コンパイル実行
- できた → mainの数じゃなくてディレクトリの問題
- ターミナルで実行したいファイルがあるディレクトリに移動してから実行
- できた!!
収穫
ターミナルで移動してから実行すればいい。
しかし、もともとのMyAppは階層深くにあってもできたぞ?
ということは、ターミナルで移動してから実行しなくてもできるようにする方法があるということですね。
ということで、
2.の対処
packageの利用はしてないけど、とりあえずpackage宣言をしておこう!
package com.dot.myapp;
これを冒頭につけて、最初のディレクトリ、つまり、
java_lessons/com/dot/myapp
にPractice.javaを戻してコンパイル実行。
いけました。
収穫
package宣言すれば階層深くにいても実行できる。
でも、さらに一つ下のディレクトリmodelにあるクラスは利用してないのに書かないといけない?
ここでまたファイルを移動させて実験。
java_lessons/com
に移動させてpackage com;
と宣言して実行。
できた
収穫
ターミナルがいるディレクトリより下の階層にある場合は、package宣言でそのファイルのディレクトリを書けばいい!
自分なりの結論
package化するというのは、PHPとかでfunctionやdefineだけのファイルをmodelに入れて管理するための方法かと思いきや、実行させる時に、ターミナルのいるディレクトリより下にある場合に書く必要があるということ。
自分なりの収穫
いくつか原因を列挙してからやってたまたま最初の方に解決策が見つかったけど、とにかくいろいろ実際に試してみるのが早いのかな。
エラーメッセージをそのまま検索してもひっかかるときはあるけど、それよりもいろいろ自分で考えて試して解決する方が理解は深まる。
理解が深まるということは、同じ状況じゃないにしても、似たような状況では原因として考えられるものを列挙しやすくなり、結果的に解決が早くなる!
とにかく自分で考えて自分で解決する回数をこなしてスピードを上ていこう!