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

时间:2014-05-12 08:53:36

标签: java classpath javac

我试图理解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

  • 将依赖项放在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示例时,如果找到编辑的超类源文件,则会发生自动重新编译。当使用排除{{1}}的javac示例时,如果已编辑超类源文件,则不会进行自动重新编译。非常感谢。

2 个答案:

答案 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文件!