- PR -

コンパイルエラーについて教えて下さい

1
投稿者投稿内容
m.i
会議室デビュー日: 2008/10/06
投稿数: 9
投稿日時: 2008-10-06 14:20
単純たjavaコードでコンパイルできす考え込んでいます。

以下の2つのソースファイルがあります。
Kit.java
--- top -------------------------------------------
package pkg;
public class Kit {
public String glueIt(String a, String b) { return a+b; }
}
--- end -------------------------------------------

UseKit.java
--- top -------------------------------------------
import pkg.*;
class UseKit {
public static void main(String[] args) {
String s = new Kit().glueIt(args[1],args[2]);
System.out.println(s);
}
}
--- end -------------------------------------------
この2つのファイルは
c:\wrkフォルダに存在するものと過程し、c:\wrkをカレントディレクトとして
C:\wrk>javac -d . Kit.java
とコンパイルする。
C:\wrk>javac -cp . UseKit.java
としてコンパイルするとコンパイルエラーが発生します。
とても初歩的な事なのかもしれませんが、理由が分かりません。
どなたか分かる方いらっしゃいましたら教えて頂けます様お願い致します。
Java僧
ぬし
会議室デビュー日: 2003/11/06
投稿数: 261
投稿日時: 2008-10-06 18:01
パッケージとディレクトリとCLASSPATHはJavaを始めるにあたり鬼門ですね。
JavaHouseの「トピックス」が今でも役に立ちます。
http://java-house.jp/ml/
関連するトピックスがたくさんあるので読んでみてください。
今ではJavaのエクスパートの人も10年数年前は同じ場所でハマって試行錯誤していました。
m.i
会議室デビュー日: 2008/10/06
投稿数: 9
投稿日時: 2008-10-07 11:18
Java僧さんご返事有難う御座いました。
私の記載に一部誤りがありましたので追記します。
UseKit.javaのコンパイルですが、
C:\wrk>javac -cp . UseKit.java
ではなく
C:\wrk>javac -classpath . UseKit.java
の誤りでした。
またコンパイルエラーは
--- top ---------------------------------------
UseKit.java:4: Kit にアクセスできません。
クラスファイル .\Kit.java は不正です。
ファイルにクラス Kit が含まれていません。
削除するか、クラスパスの正しいサブディレクトリにあるかを確認してください。
Kit k = new Kit();
--- end ---------------------------------------
のように出力されます。
ご指摘のJavaHouseを参照して見たのですが私自身のレベルが低い為か
該当項目を確認する事ができませんでした。
なぜUseKit.javaからpkg.Kit.classを見つけられないのでしょう?
宜しければ、ご指摘頂けます様お願い致します。
わたなべ
大ベテラン
会議室デビュー日: 2007/12/09
投稿数: 123
お住まい・勤務地: 札幌
投稿日時: 2008-10-07 11:35
まずは、ソースからpackage pkg; を削除してください。
import pkg.*; も不要です。
その上で-d も-cp(-classpath)もつけずにコンパイルしてください。
そうすればコンパイルは通ると思います。

次にパッケージに関して調べてみてください。
詳細は省きますが、Javaの機能の1つで、クラスをディレクトリ構造に整理する機能です。
すると、package pkg;の意味が解り、ソースファイルがpackageディレクトリになければならない事が解るはずです。

最後に-cp(-classpath)オプションですが、これはパッケージの概念を理解した後に調べましょう。
javacなどのコマンドでは暗黙的にコマンドを実行したディレクトリをルートディレクトリとして、パッケージ名+クラス名の解決を行います。
例えば、C:\work でjavacを行ったとき、hogeパッケージのFugaクラスは、C:\work\hoge\Fuga.java として存在することが期待されています。
このルートディレクトリを追加・変更したい場合に使用するオプションです。
また、-dはクラスファイルの出力先の制御で、デフォルトはソースと同じ場所になります。

一般的には作業スペースに対し、srcフォルダ(ソース)とclassesフォルダ(クラス)を分けて管理します。
で、実行するのは作業スペースからになるので、
javac -cp ./src -d ./classes
のようにコンパイルします。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-10-07 13:23
直接的な回答でもありませんし、批判もあるかと思いますが、
クラスパスの概念等は、後からでも覚えられると思いますの、
Eclipse等のIDEで作られてはいかがでしょうか?
コンパイルエラーからは悩まされることが減るかと思います。
m.i
会議室デビュー日: 2008/10/06
投稿数: 9
投稿日時: 2008-10-07 22:39
わたなべさん。かつのりさん。ご返事有難う御座いました。
お二人の言われる通り実施する限りコンパイルはできました。
ありがとうございました。
今回さらに色々試してみましたので以下に報告します。

当初の疑問としては、-classpathはクラス検索パス
と理解しておりなぜUseKit.javaからpkg.Kit.classを見つけられないのかを
疑問に思っていました。(カレントディレクトリから見てpkgディレクトリとその
下にpkg.Kit.classが存在しているにもかかわらす。)

またコンパイル時に
-- top ---------------------------
クラスファイル .\Kit.java は不正です。
-- end ---------------------------
とのメッセージが気になったのでKit.javaをコンパイル後、Kit.javaソースファイルを
削除して、
C:\wrk>javac -classpath . UseKit.java
を実行すると今度はコンパイルが通ります。

この事より-classpathはクラス検索パスで良いと考えますが如何なものでしょう。

どちらかというとコンパイラの挙動が、
1.
UseKit.javaをコンパイル
2.
参照するクラスのソースファイル(Kit.java)を検索し見つかったならばその
ソースをコンパイル。
3.
2.にて作成されたKit.classをUseKit.javaが利用しようとするが
Kit.classが作成されないのでコンパイルエラーが発生。(なぜかは不明)

のようになっている事が理解を妨げていたように思います。
結果からわたなべさんの言う通りソースのpackage文とそのソースの格納ディレクトリは
一致させておかないと想定したコンパイルが実施されなくなると感じました。
以上でした。



1

スキルアップ/キャリアアップ(JOB@IT)