我试图理解javac的-classpath
和-sourcepath
选项之间的区别,关于源代码文件的自动重新编译。我阅读了subject of javac上的Java文档,以及它所声明的-sourcepath
选项 -
Note: Classes found through the class path may be subject to automatic recompilation if their sources are also found
我还查看了this webpage(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
不幸的是,我无法发现这两个选项之间的区别。例如,在选项#2(它不使用-classpath)中,如果我编辑TestFoo.java或TestBaz.java,那么我将获得更新的TestFoo.class或TestBaz.class文件。换句话说,如果.class文件过时,那么将重新编译源代码。在上面的选项#3(使用-classpath)中,会发生同样的事情。因此,我无法看到选项#2和#3之间的区别。
有人可以概述一个简单的示例测试项目的结构,我可以看到两个略有不同的javac命令与它一起使用吗?一个javac示例命令应该使用-classpath
,而另一个不应该使用-classpath
。当使用包含-classpath
的javac示例时,如果找到编辑的超类源文件,则会发生自动重新编译。当使用排除{{1}}的javac示例时,如果已编辑超类源文件,则不会进行自动重新编译。非常感谢。
答案 0 :(得分:0)
不同之处在于-classpath
告诉编译器在哪里找到已编译的类,-sourcepath
告诉编译器在哪里找到这些类的源。所以你应该将后者用于你有源代码的类,而前者用于你只有目标代码(.class文件)的类。
答案 1 :(得分:0)
我已经尝试了各种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
文件!