关于自动重新编译,我无法发现javac的-classpath和-sourcepath选项之间的区别

我试图理解javac的-classpath-sourcepath选项之间的区别,关于源代码文件的自动重新编译。 我阅读了关于javac主题的Java文档,并且对于它的-sourcepath选项,它说明了 –

Note: Classes found through the class path may be subject to automatic recompilation if their sources are also found

我还查看了这个网页 (idevelopment.info),以了解有关javac的-classpath-sourcepath选项的更多信息。 在他们的示例中,它描述了一个测试项目,涉及两个名为TestFoo.java(一个超类)和TestBaz.java(一个依赖子类)的java文件。 它给出了如何编译这个测试项目的三个选项,其中两个总结如下。

选项#2

  • 在编译TestBaz时将TestFoo添加到源路径:

     javac -d baz/classes -sourcepath foo/src baz/src/TestBaz.java 

选项#3

  • 将依赖项放在sourcepath和classpath中。 然后,如果类路径中的.class文件过期,则将重新编译sourcepath中的.java文件。

不幸的是,我无法发现这两个选项之间的区别。 例如,在选项#2(不使用-classpath)中,如果我编辑TestFoo.java或TestBaz.java,那么我将获得更新的TestFoo.class或TestBaz.class文件。 换句话说,如果.class文件过时,那么将重新编译源代码。 在上面的选项#3(使用-classpath)中,会发生同样的事情。 因此,我看不出选项#2和#3之间的区别。

有人可以概述一个简单的示例测试项目的结构,我可以看到两个略有不同的javac命令与它一起使用吗? 一个javac示例命令应该使用-classpath ,而另一个不应该使用-classpath 。 当使用包含-classpath的javac示例时,如果找到编辑的超类源文件,则会发生自动重新编译。 当使用排除-classpath的javac示例时,如果已编辑超类源文件,则不会进行自动重新编译。 非常感谢。

区别在于-classpath告诉编译器在哪里找到已编译的类, -sourcepath告诉编译器在哪里找到这些类的源。 所以你应该将后者用于你有源代码的类,而前者用于你只有目标代码(.class文件)的类。

我已经尝试了各种javac命令行示例,现在我可以回答我自己的问题:

如果编辑了任何源代码依赖项文件,则这两个javac变体中的任何一个都将重新编译它们:

 javac -sourcepath src -cp bin -d bin src\pkgs\main\Main.java javac -sourcepath src -d bin src\pkgs\main\Main.java 

但是,以下javac变体不会重新编译已编辑的源代码依赖项文件:

 javac -cp bin -d bin src\pkgs\main\Main.java 

请注意,在上面所有三个javac变体中, Main.class文件总是被重新生成。 在我原来的问题中,我想知道如果javac排除了-cp-classpath )的使用,是否有可能不进行自动重新编译。 我不认为这是可能的,因为如果javac没有被告知.class文件的位置,它将被告知源文件的位置,一旦找到,它将必须重新编译它们,以便为项目创建所需的.class文件!