はじめまして、Java初心者な質問です。
package宣言するときの、ディレクトリの構造がどうあるべきか?という質問なのですが、
例えばカレントディレクトリが
/home/test/java にあるとして
----------// ClassA.java //-----------
package a.b;
public class ClassA {
/** コンストラクタ */
public ClassA() {
}
}
とした場合、
ClassA.javaファイルとClassA.classはどこに保存されるべきなのでしょうか?
参考書などによると
「aディレクトリ内のbディレクトリ」と書いてあるのですが、どこから見てのaディレクトリ内のbディレクトリなのでしょうか?
この場合だと、/home/test/java/a/b/ClassA.java という事なのでしょうか、、?
それだったらpackage宣言が
package home.test.java.a.b;
になるような気がして、困惑しています。
よろしくお願いします><
No.3ベストアンサー
- 回答日時:
> 「aディレクトリ内のbディレクトリ」と書いてあるのですが、どこから見てのaディレクトリ内のbディレクトリなのでしょうか?
classpathから見て、です。
chasspathが /home/test/java に設定されていれば、package a.b が参照するディレクトリは /home/test/java/a/b となりますし、classpathが /foo/bar なら、参照ディレクトリは /foo/bar/a/b となります。
> No.2のお礼の件
原因はおそらく /home/test/java/ClassA.java です。
少々難しい話になりますが、理解してください。
import a.b.* とした場合、ClassB.java中のソースに登場するクラス ClassAはパッケージ名なしのClassAか、a.b.ClassAか、その時点では判別できません。
よって、まずパッケージ名なしのClassAを探します。
パッケージ名なしのClassAはクラスパス直下にある(今回の場合はカレントディレクトリ=/home/test/java)ので、コンパイラはまず /home/test/java/ClassA.class または/home/test/java/ClassA.javaを探します。
ここでコンパイラは /home/test/java/ClassA.java を発見するので、ClassB.java中のClassAはパッケージ名なしのClassAと決定します。
ところが、このClassA.javaにかかれているクラスの内容はa.b.ClassAのソースで、パッケージ名なしのClassAではありません。
よって、/home/test/java/ClassA.java には「パッケージ名なしのClassAに関する情報が含まれていません」というエラーを返します。それがNo.2お礼で出てくるエラーメッセージです。
ご理解いただけたでしょうか。
要は /home/test/java/ClassA.java を除去するか、ClassA.javaを/home/test/java/a/b に移動させればコンパイルできます。
が、除去か移動をしなければならない理由は上記によるものです。
とてもよく分かりました!
てっきりコンパイル時にコンパイラは X.class ファイル(クラスファイル)のみを探すものだと、決め付けてました、、。
テストで作成したClassA.javaを移動させたら、bgbgさんのおっしゃるとおりコンパイルが通りました。
kamkamkam3さん、kyon2_PaPaさん、bgbgさん、本当にありがとうございました!!><
No.2
- 回答日時:
基準のディレクトリはすきなところにできます。
c:\test\javaを基準フォルダにすると
javaフォルダの中のソースはjavac ***.javaでコンパイルできます。
このフォルダを基準フォルダにすると package a.b;で宣言されたファイルは
基準フォルダから考えて 基準フォルダ\a\b というフォルダに入れなくてはいけません。フォルダは広くディレクトリとも言われます。
要するに基準フォルダからパッケージ階層を作れるのがJava言語の規則なのです。いつでもどこでも絶対パス(作者の場合です/home/test/java/a/b/)にパッケージ階層を指定すると、ひどい弊害があります。UNIXシステムは基本的に一般ユーザーは特定のフォルダしか使えません。ですから、パッケージ階層は自分の使いたくないフォルダ名まで含めないといけなくなります。また、一般的にパッケージ階層の名前というのは慣例があります。企業の名前とか。そういった純粋なパッケージ名にするためにも自分の好きな基準フォルダを決めてそこからパッケージを作れる事になっています。そうすることにより、自分の好きなパッケージ名を作れる事となります。
早い話が元からの全部のフォルダ名をパッケージ名につけるより、自分の好きなフォルダからパッケージ名をつけた方が好きな名前がつけられるというだけです。
回答ありがとうございます。
Java勉強はじめたばかりで、とても参考になりました。
自分の環境(Linux CentOS / JDK1.5)でいろいろ試してて、パッケージ宣言をしたクラスを別クラスからnew()しようとして、コンパイルエラーが出てつまづいていました^^;
下のお礼にも書いたのですが、別クラス(ClassB.java)で
import a.b.ClassA;
とすればコンパイルが通るのですが、
import a.b.*;
とするとコンパイルできません><
------// コマンド //--------
$ javac -classpath . ClassB.java
---------// エラーメッセージ //---------
ClassB.java:5: cannot access ClassA
bad class file: ./ClassA.java
file does not contain class ClassA
Please remove or make sure it appears in the correct subdirectory of the classpath.
ディレクトリ構造は
/home/test/java/ClassB.java
/home/test/java/a/b/ClassA.class
です、、。
ClassB.javaのソースは下のお礼に書いたとおりです。
また時間があるときにアドバイス頂けたら幸いです。
No.1
- 回答日時:
>この場合だと、/home/test/java/a/b/ClassA.java という事なのでしょうか、?
もし、/home/test/java/内にプログラムを作成しているなら、そうです。
あくまで「どこに作成しているか」からみた相対位置ですので。
>「aディレクトリ内のbディレクトリ」と書いてあるのですが、どこから見てのaディレクトリ内のbディレクトリなのでしょうか?
プログラムを実行する際の起動ディレクトリからみた相対位置です。プログラムを実行するとき、/home/test/java/にカレントディレクトリを移動して実行をしますね? すると、そのディレクトリ内にある「a」がaパッケージに、その中の「b」がa.bパッケージになるわけです。
回答ありがとうございます!
なるほどでした。
ということは
/home/test/java に ClassA.java(このファイルはどこでも良いのでしょうが、、) を
/home/test/java/a/b に ClassA.class を
ということですね。
> プログラムを実行する際の起動ディレクトリからみた相対位置です。
ということは、
/home/test/java/ClassB.java
=> コンパイル =>
/home/test/java/ClassB.classを作成
----------// ClassB.java // ----------
import a.b.ClassA;
public class ClassB {
/** コンストラクタ */
public ClassB() {
ClassA classA = new ClassA();
}
}
という事ですね!
というかそうしたらできました^^;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) 図に示す階層構造で,現在のディレクトリ(カレントディレクトリという)が*印のディレクトリであるとき, 2 2022/11/16 10:55
- サーバー 別サーバに構築したApache+Tomcatの連携について 2 2023/03/06 23:23
- UNIX・Linux ubuntuのサーバー(virtual box)が、再起動するとデータが消えてしまいます。 4 2022/04/27 21:29
- その他(開発・運用・管理) フォルダの中にファルダを作成してファイルを格納するバッチコマンド 1 2022/06/30 11:39
- Java java final 1 2022/06/10 22:49
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Perl Perl の外部モジュールの利用方法 3 2022/07/10 18:34
- Mac OS PATHを使ってcdなどで簡単に移動できるようになりたい 3 2023/05/13 14:22
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- PHP ファイルアップロードに関してのセキュリティについてアドバイスお願い致します 1 2023/08/20 00:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Javaでのエラーについて
-
java と javax の違いは?
-
AntでのJunitの試験
-
-Applet表示でのjava.lang.Clas...
-
android-studioがインストール...
-
CLASSPATHを設定しても、『Clas...
-
package宣言のディレクトリ構造
-
javaのコンパイルエラーについ...
-
JSPファイルで生じるエラーをど...
-
vba クリップボードクリアにつ...
-
MSFormsとは何ですか?
-
IISワーカープロセスが原因でCP...
-
mavenでtools.jar
-
VBAの「for i=1 to cells(…」...
-
gitでバージョン指定してダウン...
-
DirectX SDKのダウンロード
-
appleスクリプトでアプリケーシ...
-
Eclipseソース開発画面の行番号...
-
美人時計の作り方
-
C言語で円周率を求めるプログラ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Javaでのエラーについて
-
java と javax の違いは?
-
propertiesが読み込めなくてnul...
-
javacのコンパイルでファイルが...
-
JAVA実行時エラーについて教え...
-
javaからデータベースに接続 エ...
-
CLASSPATHを設定しても、『Clas...
-
struts2環境構築で不具合が出て...
-
Tomcatでエラー
-
マイクラ1.7.10にcutallなどが...
-
javaのGUIツールキット
-
log4jを使用し、JAVAのバッチプ...
-
マイクラ Ender IO 入れたらク...
-
-Applet表示でのjava.lang.Clas...
-
javaサーブレット upload時
-
JavaMail関係でエラーが出ます
-
JasperExceptionのエラーログの...
-
AntでのJunitの試験
-
マイクラがクラッシュします。
-
Tomcat上で動くサーブレットが...
おすすめ情報