[英]How to compile a single java file with gradle?
(更新:感谢下面 Peter N 的评论。)
我有一个 java package 有几个类,因此里面有文件。 但是,我最初只想编译其中一个文件,以便我可以使用它来更新 package 中的其他类。 它是其他类的工厂,因此依赖于它们 - 即。 它有对它们的引用。
我一直在尝试使用JavaCompile gradle 任务来执行此操作。 结果,我阅读了 JavaCompile 的文档并尝试搜索示例,但似乎那里几乎没有。 我什至在gradle 论坛上发帖,但到目前为止进展缓慢。
我可以使用 ant javac 任务通过 ant 脚本轻松完成所需的操作。 但我想在 gradle 中执行此操作(并且不使用 ant.javac 方法 - 如果我必须这样做,我将只使用 ant)。
我创建了一个示例案例,其中一个 package 中的两个类只有两个源文件。
这两个文件都位于名为 some.pkg 的 package 中,因此我们具有以下目录结构:
一级:
package some.pkg;
import some.pkg.*;
public class ClassOne {
public void doStuff() {
}
}
二类:
package some.pkg;
import some.pkg.*;
public class ClassTwo {
public void ClassTwo() {
ClassOne cone = new ClassOne();
cone.doStuff();
}
}
如您所见,ClassTwo(我们想要独立编译的 class)依赖于 ClassOne。
ant 脚本是一个简单的例子:
<project>
<property name="build.dir" value="build"/>
<property name="lib.dir" value="lib"/>
<property name="src.dir" value="src/main/java"/>
<target name="generate" >
<mkdir dir="${build.dir}"/>
<javac source="1.6" target="1.6" srcdir="${src.dir}" destdir="${build.dir}"
debug="true" includeantruntime="false"
includes="some/pkg/ClassTwo.java">
</javac>
</target>
</project>
但是在 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 似乎对 go 具有智能并编译所有其他相关类,但我想对于 gradle JavaCompile 我需要设置一个源设置。
谢谢!
感谢与@PeterNiederwieser 就评论中的原始帖子进行的讨论,为了完整起见,我将在此处提供答案。
要以与 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 - 而不是仅尝试您指定的单个显式文件。 任何其他类(不是必需的)保持未编译状态 - 通过查看构建目录确认。
谢谢彼得!
我尝试在gradle版本6.4.1 中使用@I Stevenson 答案。 有一些变化让我感到惊讶,所以希望这可以帮助其他人。 此任务的变化是:
destinationDir -> destinationDirectory (正在孵化)(我也遇到了类型问题)
compileOne.options.compilerArgs -> options.sourcepath这也在任务中定义
我还需要在我的编译中添加注释处理,因为我使用的是 lombok 项目。 我知道您的问题没有要求进行注释处理,因此我将在任务中发表评论,指出这是额外的。
apply plugin: 'java'
task compileOne (type: JavaCompile) {
source = sourceSets.main.java.srcDirs
include 'some/pkg/ClassTwo.java'
classpath = sourceSets.main.compileClasspath
destinationDirectory = new File("${buildDir}/classes/java/main")
options.sourcepath = sourceSets.main.java.getSourceDirectories()
options.annotationProcessorPath = sourcesSet.main.compileClasspath//extra for lombok
}
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[0]
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.