【问题标题】:Regarding automatic recompilation, I can't spot the difference between javac's -classpath and -sourcepath options关于自动重新编译,我看不出 javac 的 -classpath 和 -sourcepath 选项之间的区别
【发布时间】:2014-05-12 08:53:35
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java classpath javac


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我已经尝试了各种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 文件!

      【讨论】:

        猜你喜欢
        • 2011-01-27
        • 2012-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-01
        • 1970-01-01
        • 2017-09-03
        • 2021-05-27
        相关资源
        最近更新 更多