簡體   English   中英

如何用 gradle 編譯單個 java 文件?

[英]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 中,因此我們具有以下目錄結構:

  • .\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(我們想要獨立編譯的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM