2014-02-13 41 views
0

我有一個Apache Ant構建文件,用於包含javac命令以編譯我的源代碼的java項目。這個項目有一些特殊的限制,它由小的子項目組成。大多數這些子項目具有以下文件夾結構:Ant javac源碼目錄不工作

/docroot 
----/WEB-INF 
--------/lib 
--------/src 
-----------A.java 
----------- ... (more java classes) 
--------/service 
-----------B.java 
----------- ... (more java classes) 

src和service都是源文件夾。 A.java會導入位於/ service文件夾中的一些類,例如B.java。在eclipse中一切正常,A.java導入B.java沒有任何錯誤或問題,所以我認爲classpath是正確的。如果我運行從螞蟻,當他試圖編譯A.java它給了我一個錯誤說javac命令:

找不到符號B.java

在我的javac命令我設置單個源目錄= docroot/WEB-INF/src。如果我還將docroot/WEB-INF /服務設置爲源目錄,它也可以工作。但是這裏有這個解決方案的問題:一些子項目只有一個源文件夾「docroot/WEB-INF/src」。這意味着如果我爲javac命令設置了兩個源目錄,對於具有單個源目錄「docroot/WEB-INF/src」的項目,它會拋出一個錯誤,指出子項目沒有文件夾「docroot/WEB -INF /服務」。

我該如何解決這個問題?

<antcall target="compile-java"> 
    <param name="javac.classpathref" value="plugin.classpath" /> 
    <param name="javac.destdir" value="docroot/WEB-INF/classes" /> 
    <param name="javac.srcdir" value="docroot/WEB-INF/src" /> 
    <reference refid="plugin-lib.classpath" torefid="plugin-lib.classpath" /> 
</antcall> 

<target name="compile-java"> 
    <javac 
     classpathref="${javac.classpathref}" 
     compiler="${javac.compiler}" 
     debug="${javac.debug}" 
     deprecation="${javac.deprecation}" 
     destdir="${javac.destdir}" 
     fork="${javac.fork}" 
     includeAntRuntime="false" 
     memoryMaximumSize="${javac.memoryMaximumSize}" 
     nowarn="${javac.nowarn}" 
     encoding="${javac.encoding}" 
    >  
     <src path="${javac.srcdir}"/> 
    </javac> 

    <copy todir="${javac.destdir}"> 
     <fileset dir="${javac.srcdir}" excludes="**/*.java" /> 
    </copy>  
</target> 
+1

發佈您的'build.xml'文件。 – hmjd

+1

我不知道你在這裏做什麼,但我可以絕對肯定地說一件事:你不要把源文件放在WEB-INF文件夾中。該目錄僅用於可部署(僅限於/ lib中的jar文件,/ class中的類文件,WEB-INF本身中的配置文件)。 – Gimby

+0

@hmjd你想從構建文件中的特定目標?因爲我的構建文件有數百行。並且整個Ant過程由diferente構建文件組成.. –

回答

0
<src path="${javac.srcdir}"/> 

意味着${javac.srcdir}被解釋爲路徑(冒號或者根據您的平臺分號分隔),而不是一個單一的目錄。所以你可以在這裏提供多個目錄。

<path id="module.srcdir.path"> 
    <pathelement location="docroot/WEB-INF/src" /> 
    <pathelement location="docroot/WEB-INF/services" /> 
</path> 
<property name="module.srcdir" refid="module.srcdir.path" /> 

<antcall target="compile-java"> 
    <param name="javac.classpathref" value="plugin.classpath" /> 
    <param name="javac.destdir" value="docroot/WEB-INF/classes" /> 
    <param name="javac.srcdir" value="${module.srcdir}" /> 
    <reference refid="plugin-lib.classpath" torefid="plugin-lib.classpath" /> 
</antcall> 
+0

感謝您提前回復。我知道我可以做到這一點,甚至可以指定由:分隔的路徑,如path1:path2。但是如果我這樣做了,編譯沒有2個源目錄的子項目時,ant會拋出一個錯誤,指出其中一個目錄不存在。 –

+0

@PauloRodrigues對不起,我將它理解爲'compile-java'是通用目標,'antcall'是針對此特定子模塊的。 –

0

現在我找到了一個解決方案。我爲每個需要編譯兩個源目錄的子項目創建一個單獨的構建文件。在其中我重寫了javac命令,爲每個特定情況設置必要的源目錄。通過這種方式,「常規」javac命令仍將使用單個源執行,以便與只需要一個源目錄的子項目兼容。