それはコンパイルすることを決定するものに関して、-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コマンドラインにどのような引数を渡すことができますか?
javacのは、.javaファイルとの.classファイル間のタイムスタンプを比較するため、この問題が発生します。これは、使用する-sourcepath
ソースファイルを検索して、-classpath
クラスファイルを見つけること。したがって、あなたの問題は、クラスパスを指定することによって固定することができます。
javac -sourcepath .. -classpath .. A.java