7

私はJavaコンパイルについて内部を調べようとしています。そこで、IDEを片付けて、MS-DOSコマンドラインを使い始めました...

以下のツリーで説明されているように、簡単なプロジェクトを作成しました。

SampleApp

|____**src**

       |_____pack
               |______Sample.java
|____**classes**

これはSample.javaのソースコードです:

public class Sample 
{

    private String s = new String("Hello, world");

    public Sample(){
          System.out.println(s);
    }
}

このクラスをコンパイルしたいので、javacコマンドを使用しました:

prompt\SampleApp\src>javac -d ..\classes -sourcepath . pack\Sample.java

CLASSPATHすべて正常に動作しますが、Sample.javaファイルをコンパイルする前に環境変数を削除したため、予期していませんでした。そのため、コンパイラがjava.lang.Stringクラスファイルを見つけることができないため、コンパイラエラーが発生することが予想されていました。

この記事http://www.ibm.com/developerworks/java/library/j-classpath-windows/を読んだので、多くのことを理解するのに役立ちました。記事の作成者によると、デフォルトのクラスパスは現在の作業ディレクトリです。しかし、なぜ私のソースコードがエラーなしでコンパイルされるのか理解できません。誰かが私にこれを説明できますか?

4

2 に答える 2

6

そのため、コンパイラがjava.lang.Stringクラスファイルを見つけることができないため、コンパイルエラーが発生することが予想されていました。

簡単に言うと、コンパイラは、ユーザーに指示しなくても、すべての標準JavaSEライブラリクラスの場所を知っているということです。

より長い答えは、Stringクラスがbootclasspathで見つかっているということです。これは、JDKインストールで関連するJARを参照するようにコマンドによって暗黙的に設定されます。javacこのjavacコマンドは、通常のクラスパスで検索する前に、ブートクラスパスを検索します。

于 2012-12-03T03:11:03.337 に答える
5

クラスパス変数は、あなたが思っていることをしません。オラクルのドキュメントを引用するには:

CLASSPATH変数は、JDKツールを含むアプリケーションにユーザークラスを探す場所を指示する1つの方法です。(JRE、JDKプラットフォーム、および拡張機能の一部であるクラスは、ブートストラップクラスパスや拡張機能ディレクトリなどの他の手段で定義する必要があります。)

出典:http ://docs.oracle.com/javase/tutorial/essential/environment/paths.html

基本的に、java.lang.*はプラットフォームの一部であり、JDK / JVMで提供されるため、コンパイラーは、それらを探す場所をユーザーに指示する必要はありません。

于 2012-12-03T03:05:20.603 に答える