2011-10-15 39 views
3

我想使用FileSet來準確指示我想要使用Javac任務編譯哪些文件。我不想要任何隱含的行爲。然而,我的嘗試卻失敗了。這是我到目前爲止:Ant:通過javac任務使用文件集

一個包含我所有源文件的FileSet。

<fileset id="srcfiles" dir="${srcdir}"> 
    <include name="**/*.java"/> 
</fileset> 

並試圖將它傳遞給javac的目標。

<target name="build"> 
    <javac srcdir="."> 
     <fileset refid="srcfiles"/> 
    </javac> 
</target> 

這給了我這個錯誤:javac doesn't support the nested "fileset" element.

閱讀螞蟻文檔後,我試圖改變最內層標籤從filesetsourcepath。這在文件被編譯的意義上是有效的,但它仍然是錯誤的:srcfiles doesn't denote a path。我認爲源只是由於隱含的規則而編譯的。

我怎樣才能明確地告訴javac我想編譯的單個文件?或者這不是螞蟻應該如何工作?我來自C++背景,其中識別源文件是構建過程的重要組成部分。但是,鑑於Java的文件命名和目錄結構要求,可能隱含的**/*.java模式規則涵蓋了所有用例。

回答

4

ant manual for javac說:

If you wish to compile only files explicitly specified and disable javac's default searching mechanism then you can unset the sourcepath attribute:

<javac sourcepath="" srcdir="${src}" 
     destdir="${build}" > 
    <include name="**/*.java"/> 
    <exclude name="**/Example.java"/> 
</javac> 

我不認爲這是一個好主意,但。在設計良好的項目中,應該編譯給定目錄(或一組目錄中)的所有文件。不應該編譯的文件應該不存在,或者應該放在單獨的目錄中。

1

你想要什麼?編譯單個目錄下的所有* .java代碼?或者只編譯一個文件?

如果你想編譯你所有的java源代碼?然後,您必須定義您的源代碼文件所在的位置,然後您必須定義構建目錄所在的位置。編譯您的java代碼後,此構建目錄用於* .class文件。

簡單的方法是,首先你必須創建一個文件,該文件是build.properties在這個文件中,您可以定義您的源代碼目錄,你的build目錄,等等,這是構建的簡單例子。性能文件

# Source Code Properties --------------------------- 
project.dir=. 
src.dir=${folder.project}/src 
dist.dir=${folder.project}/dist 
build.dir=${folder.project}/build 
test.dir=${folder.project}/testing 

,然後在你的的build.xml文件你可以編譯Java代碼:

<!-- define build.properties file --> 
<property file="build.properties" /> 

<target name="compile" description="Compile all java code from src dir"> 
    <javac srcdir="${src.dir}" 
      destdir="${build.dir}" 
    /> 
</target> 

通過這個ant任務,你可以編譯你所有的代碼在src目錄到build目錄下。

+0

目前,是的,我只是編譯一個特定目錄下的所有* .java文件。我想要一個通用的解決方案,以防萬一發生變化。然而,我越想到它,我不確定在Java項目上會發生什麼變化...... –

+0

對於java項目來說,首先你必須考慮項目的目錄結構。 '標準'的方式是你必須有** build和src ** dir。其他目錄是可選的:)簡單的方法是,從maven目錄結構看:) – martinusadyh

+0

如果你想了解更多關於java目錄結構的知識,請看本頁[標準目錄佈局簡介](http://maven.apache .ORG /引導件/導入/引入到該標準的目錄-的layout.html) – martinusadyh

1

在這種情況下,用C/C++術語思考是徒勞的。在C/C++中,您通常有一個Makefile,您可以列出所有要編譯的文件,每個文件從編譯器的角度來看都是獨立於其他文件的。

恰恰相反for Java是正確的:如果只給一個文件到Java編譯器和這個類的引用一些其他,那麼編譯器希望看到「別人的二進制形式。編譯器將嘗試三件事情:

  • 是在類路徑的一些庫「其他」 - 如果是這樣被使用的事情,因爲它已經被編譯
  • 那是「其他」中的目標路徑編譯器 - 它可能已經從源代碼編譯完畢,所以只需要它就可以了
  • 那是'別的'東西,可以在編譯器的源代碼路徑中找到源文件 - 如果是的話,先編譯它然後回到真實任務。

這是一點點簡化但已經示出了最其中C/C++只是在不同的要點:

  • Sourcefiles是相互獨立的。
  • 編譯器可能希望編譯的東西超出您作爲新手所猜測的。
  • 許多automagic的東西只能工作,因爲/如果編譯器可以猜測.class文件和.java文件之間的映射。
  • 在Java中,編譯器的參數並不多。所有這些設置都適用於每個源文件。另一方面,在C/C++中,您可以擁有幾千字節的define參數,優化設置等等 - 對於每個源文件可能都不相同。
  • Java開發人員不想微觀管理Java編譯器 - 他想編譯源目錄中的所有文件。
  • Java開發人員不想計算源文件之間的確切和正式的依賴關係 - 機器在這樣的任務上更好。

這都歸結爲Ant和Maven以及Java中任何體面的構建系統的工作原理:編譯完整的源代碼目錄。所以是的,這就是Ant想要工作的方式。