2013-10-15 20 views
9

修訂:由於從下面彼得無評論。)如何用gradle編譯單個java文件?

我有一個java包它包含幾個類別,因此文件。不過,我只想編譯其中一個文件,以便我可以使用它來更新包中的其他類。這是其他類的工廠,因此依賴於它們 - 即。它提到了它們。

我一直在試圖用JavaCompile gradle task來做到這一點。因此,我閱讀了JavaCompile的文檔並嘗試搜索示例,但似乎很少有。我甚至發佈了gradle forums,但目前進展緩慢。

我能夠使用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腳本是一個簡單的例子:

<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 

那麼,如何實現螞蟻javac的等值gradle這個?

ant的javac似乎有了智慧去編譯所有其他相關的類,但我猜gradle這個JavaCompile我需要建立一個sourceSet做..不知道..

謝謝!

+3

無論使用哪種構建系統,這都無法工作。要麼你必須一起編譯'ClassOne'和'ClassTwo',或者先編譯ClassOne,然後編譯ClassTwo(在類路徑中使用ClassOne)。另外,我不明白你分別編譯它們的動機。 –

+0

嗨@PeterNiederwieser,你是什麼意思,不管哪個構建系統使用它不會工作?我可以向你保證,上面的命令行上的javac和提供的ant構建腳本_DO_都可以工作。隨意將這些文件複製到上面的文件夾結構中,並嘗試使用ant和javac命令行 - 您會很快看到它們的工作。 (我也剛剛更新了javac命令行 - 注意,當我打算指定ClassTwo.java時,我指定了ClassOne.java,這正是我一直在做的事情。) –

+0

好的,我剛剛玩了另一個遊戲。我擔心我迷惑了自己。看來螞蟻正在編譯整個源代碼依賴樹,並且在ClassTwo.java的命令行中的javac不起作用,除非我首先執行ClassOne.java。是的,我覺得我迷惑了自己。我會先確認我的測試。謝謝。 –

回答

16

感謝與@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 - 而不是僅嘗試指定的單個顯式文件。任何其他類(不是必需的)都保持未編譯狀態 - 通過查看構建目錄進行確認。

謝謝彼得!