gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 19:54:05 30 4
gpt4 key购买 nike

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

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

我一直在尝试使用 JavaCompile gradle task去做这个。因此,我阅读了 JavaCompile 的文档并尝试搜索示例,但似乎很少。我什至在 gradle forums 上发帖, 但到目前为止进展缓慢。

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

我已经创建了一个示例案例,其中只有两个源文件用于一个包中的两个类。

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

  • .\build.gradle
  • .\src\main\java\some\pkg\ClassOne.java
  • .\src\main\java\some\pkg\ClassTwo.java

一级:

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(我们要独立编译的类)依赖于 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 似乎有智慧去编译所有其他相关类,但我想对于 gradle JavaCompile 我需要设置一个 sourceSet 来做到这一点..不确定..

谢谢!

最佳答案

感谢与@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 - 而不是只尝试您指定的单个显式文件。任何其他类(不需要的)保持未编译 - 通过查看构建目录确认。

谢谢彼得!

关于java - 如何用gradle编译单个java文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19391872/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com