どのように行うには強制的にJavaコンパイラはONLY私が指定したソースファイルをコンパイルするには?

deltamind106:

それはコンパイルすることを決定するものに関して、-sourcepath引数を使用した時に、Javaコンパイラは12.0.1(ここでは私のテストは、MSのWindowsのすべての実行されます)いくつかの本当に奇妙な行動を持っています。これを説明する最も簡単な方法は、2つの例を提供し、動作の違いを引用することです。

例1:

ソース・ファイル「A.java」

public class A {
    public static void main(String[] args) {
        System.out.println("Hello World");
        B.myMethod();
    }
}

ソース・ファイル「B.java」

public class B {
    public static void myMethod() {
        System.out.println("Goodbye!");
    }
}

例1をコンパイルするには、私たちは次のようにします。

javac -sourcepath . A.java

これはA.javaとB.javaの両方をコンパイルし、A.classとB.classを作成します。私たちは、Aがそれに依存しているため、それはまたB.javaをコンパイルすることを期待します。今かそこらのいずれか「の.java」のソースファイルを変更することなく、第2待ち、単に上記のコンパイルコマンドを再実行。あなたはそれがA.javaと新しいA.classは(更新されたタイムスタンプで)作成され、再コンパイルしますが、B.classが再コンパイルされていないことがわかります。[OK]を、これはかなり1が期待するかもしれないものです。それでは、以下、次の例にこれを比較してみましょう。

例2:

ソース・ファイル「例2 / A.java」

package example2;
public class A {
    public static void main(String[] args) {
        System.out.println("Hello World");
        B.myMethod();
    }
}

ソース・ファイル「例2 / B.java」

package example2;
public class B {
    public static void myMethod() {
        System.out.println("Goodbye!");
    }
}

すべてがパッケージに移動された以外のソースファイルは、同じです。私たちはしばらくの間、現在「例2」フォルダ内の2つのソースファイルをコンパイルしたいです。私たちは、次のコマンドを使用して:

javac -sourcepath .. A.java

これは、再びA.javaとB.javaの両方をコンパイルし、A.classとB.classを作成します。ここでの問題はありません、前と同じ。-sourcepathが今であることに注意してください「..」それが今ではすべてがパッケージになっていることを 『ルート』ソースフォルダであるためです。今ほどのいずれかのソースファイルを変更することなく、第2待ち、単に上記のコンパイルコマンドを再実行。あなたはそれがA.javaとB.javaと(更新タイムスタンプ付き)が作成された新しいA.classとB.classファイルの両方-コンパイルし直すことがわかります。

javacコマンドが二度目に実行されたときにコンパイル動作の違いに注意してください。とき-sourcefileでした「」そして、ファイルがパッケージにありませんでした、第二「のjavac」コマンドでは、コマンドラインで指定されたソースファイルをコンパイルします。しかし、第二 『のjavac』コマンドは常に不特定のソースファイルを再コンパイルするか、しないかをする必要があるかどうかに関係なく、すべての依存ソースファイルをコンパイルし、-sourcefileは「..」で、クラスがパッケージ内にあるとき。

疑問は、なぜでしょうか?自分のクラスファイルがソースファイルよりも新しいタイムスタンプを持っている場合、私は、無条件にすべての依存のソースファイルを再コンパイルからストップ例2にjavacコマンドラインにどのような引数を渡すことができますか?

Klitos Kyriacou:

javacのは、.javaファイルとの.classファイル間のタイムスタンプを比較するため、この問題が発生します。これは、使用する-sourcepathソースファイルを検索して、-classpathクラスファイルを見つけること。したがって、あなたの問題は、クラスパスを指定することによって固定することができます。

javac -sourcepath .. -classpath .. A.java

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=214000&siteId=1
おすすめ