关于自动重新编译,我无法发现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
文件!