お世話になっております。Javaに関する質問です。

パッケージpaを作成して、そのディレクトリに
ファイルSample.java(メインメソッドもSample
クラスが持っている)を置くとします。

このときに、コンパイル済みとして、例えば
c:\test>java pa.Sample
とすれば実行できますが、
c:\test\pa>java Sample
とすると「Exception in thread "main"
java.lang.NoClassDefFoundError:」と
怒られてしまいます。

単純な問題なのかもしれませんが、どうしてなのか
が分かりません。ご存知の方、おりましたらご教授
下さいますよう、お願いします。

回答の条件
  • 1人2回まで
  • 登録:2006/09/06 23:15:56
  • 終了:2006/09/08 14:59:03

回答(2件)

id:mass3 No.1

mass3回答回数118ベストアンサー獲得回数152006/09/06 23:49:55

ポイント35pt

http://www.y-adagio.com/public/standards/tr_javalang2/packag...

(以下引用)

この単純なパッケージ構成において,Javaプラットフォームの処理系によっては,パッケージ名の構成要素を連結し,ファイル名の分離子(ディレクトリ表示子)を隣接する構成要素間に挟んで,パッケージ名をパス名に変換する。

例えば,この単純な構成をUNIXシステムで用いる場合,ファイル名の分離子は / なので,次のパッケージ名,

jag.scrabble.board

は,次のディレクトリ名へと変換される。

jag/scrabble/board

そして,

com.sun.sunsoft.DOE

は次のディレクトリ名へと変換される。

com/sun/sunsoft/DOE

(以上引用)

Windowsの場合はファイルの分離子は \ です。

つまり、

pa.Sampleは pa\Sample であり、

c:\test にいるときは、c:\test\pa\Sample となって正しいですが、

c:\test\pa にいるときは、c:\test\pa\pa\Sample となって存在しないものを指します。

だからNoClassDefFoundErrorです。

id:mimio17

解答ありがとうございます。

>この単純なパッケージ構成において,Javaプラットフォームの処理系によっては,パッケージ名の構成要素を連結し,

>c:\test\pa にいるときは、c:\test\pa\pa\Sample となって存在しないものを指します。

もうこのような仕組み、ということでしょうか。

コンパイルは通るのに、不思議です。

2006/09/08 14:06:34
id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402006/09/07 00:54:00

ポイント35pt

Java のパッケージはディレクトリではありません。

あくまでパッケージです。

だからディレクトリを移動してもパッケージ名を省略できるわけではありません。

java コマンドで指定しているのも、

pa\Sample

ではなく、

pa.Sample

であることからも両者は似て非なるものであることがお分かりいただけるかと思います。

仮にディレクトリを解釈するとしたら

test.pa パッケージで無いとおかしくありませんか?

id:mimio17

解答ありがとうございます。

>Java のパッケージはディレクトリではありません。

>あくまでパッケージです。

ということが厳密に決められているのなら、よく分かる

お話です。

でも、そうするとどうしてコンパイルはできてしまうのか。。

ここがまだ理解できていません。

2006/09/08 14:09:16
  • id:mimio17
    お騒がせしました。
    Javaソースファイルを二つ作り、それぞれ別のパッケージに
    含めるようにしてコンパイルしたら、正しく動作しました。
    私の手違いだったようです。ありがとうございました<(_ _)>

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません