如何使用gradle编译单个java文件?

更新 :感谢下面Peter N的评论。)

我有一个包含多个类的java包,因此包含文件。 但是我最初只想编译其中一个文件,以便我可以使用它来更新包中的其他类。 它是其他类的工厂,因此依赖于它们 – 即。 它引用了它们。

我一直在尝试使用JavaCompile gradle任务来执行此操作。 因此,我已经阅读了JavaCompile的文档,并试图搜索示例,但似乎没有什么。 我甚至在gradle论坛上发帖 ,但到目前为止进展缓慢。

我可以使用ant javac任务使用ant脚本轻松完成所需的操作。 但我想在gradle中完成它(并且不使用ant.javac方法 – 如果我必须这样做,我将只使用ant)。

我创建了一个示例案例,在一个包中只有两个类的两个源文件。

这两个文件都在一个名为some.pkg的包中,因此我们有以下目录结构:

  • \的build.gradle
  • \ SRC \主\ java的\一些\ PKG \ ClassOne.java
  • \ SRC \主\ java的\一些\ PKG \ ClassTwo.java

ClassOne:

package some.pkg; import some.pkg.*; public class ClassOne { public void doStuff() { } } 

ClassTwo:

 package some.pkg; import some.pkg.*; public class ClassTwo { public void ClassTwo() { ClassOne cone = new ClassOne(); cone.doStuff(); } } 

如您所见,ClassTwo(我们想要独立编译的类)依赖于ClassOne。

ant脚本是一个简单的例子:

           

但是在gradle中,我一直遇到一个问题,即javac(或JavaCompile任务)无法找到ClassOne。 就好像sourcedir没有指向应该的位置 – 事实上我就像在命令行上运行javac一样。 我认为gradle’JavaCompile’任务的’source’属性就像ant’srcdir’属性一样工作,但事实并非如此。 所以这是我正在尝试的gradle脚本:

 apply plugin: 'java' task compileOne (type: JavaCompile) { source = sourceSets.main.java.srcDirs include 'some/pkg/ClassTwo.java' classpath = sourceSets.main.compileClasspath destinationDir = sourceSets.main.output.classesDir } 

但它导致:

 C:\test\>gradle generate :generate C:\test\src\main\java\some\pkg\ClassTwo.java:7: cannot find symbol symbol : class ClassOne location: class some.pkg.ClassTwo ClassOne cone = new ClassOne(); ^ C:\test\src\main\java\some\pkg\ClassTwo.java:7: cannot find symbol symbol : class ClassOne location: class some.pkg.ClassTwo ClassOne cone = new ClassOne(); ^ 2 errors :generate FAILED 

那么如何在gradle中实现ant javac等效?

ant javac似乎有聪明才能去编译所有其他相关的类,但我想对于gradle JavaCompile我需要设置一个sourceSet来做到这一点..不确定..

谢谢!

感谢@PeterNiederwieser在评论中的原始post上的讨论,我将在此提供完整性的答案。

要以非常类似于ant javac的方式使用Gradle JavaCompile函数,您需要通过options.compilerArgs属性提供sourcepath编译器选项。 因此,现在可用的gradle脚本如下:

 apply plugin: 'java' task compileOne (type: JavaCompile) { source = sourceSets.main.java.srcDirs include 'some/pkg/ClassTwo.java' classpath = sourceSets.main.compileClasspath destinationDir = sourceSets.main.output.classesDir } compileOne.options.compilerArgs = ["-sourcepath", "$projectDir/src/main/java"] 

特别注意允许所有工作的最后一行(唯一的区别)。 结果是它实际上会在构建时编译ClassOne和ClassTwo – 而不是仅尝试您指定的单个显式文件。 任何其他类(不需要)仍然未编译 – 通过查看构建目录确认。

谢谢彼得!