2017-01-21 58 views
3

說我有一個圖書館和一個二元目標的相關性,我們姑且稱之爲MyLibMyBinMyBin取決於MyLib使用Ant構建當前構建目標

我正在嘗試創建一個MyBin的Ant構建文件,它首先構建MyLib,然後在構建MyBin時將其包含在類路徑中。

我試過使用Ant任務,如Building other, dependent projects with Ant

但是,它不工作,從ant -v我認爲MyBinbuild-deps目標是甚至沒有建設MyLib。看起來很混亂MyBinMyLib屬性?我不知道如何防止這個。

我只在下面傾倒MyBin/build.xml,但MyLib幾乎完全相同,只是它沒有build-deps目標。

<project name="MyBin" default="main" basedir="."> 
    <property name="projectName" value="MyBin" /> 
    <property name="src.dir" location="src" /> 
    <property name="build.dir" location="bin" /> 
    <property name="dist.dir" location="dist" /> 
    <property name="dist.lib.dir" location="dist/lib" /> 
    <property name="lib.dir" value="lib" /> 


<target name="build-deps" depends="init"> 
<!-- MyLib main target does clean -> build -> jar to dist folder --> 
<!-- Its build.xml uses many of the same property values as above --> 
     <ant antfile="../MyLib/build.xml" target="main"/> 
</target> 

<path id="classpath"> 
    <fileset dir="${basedir}/"> 
     <include name="../MyLib/dist/**/*.jar" /> 
    </fileset> 
</path> 

<!-- Need classpath to run this --> 
<target name="compile" depends="build-deps" description="compile the source "> 
    <javac includeantruntime="false" srcdir="${src.dir}" 
        destdir="${build.dir}" classpathref="classpath" /> 
</target> 

<!-- Group all dependencies into a big dependency-all.jar --> 
<target name="copy-dependencies"> 

    <mkdir dir="${dist.lib.dir}" /> 

    <jar jarfile="${dist.lib.dir}/dependencies-all.jar"> 
     <zipgroupfileset dir="${lib.dir}"> 
      <include name="**/*.jar" /> 
     </zipgroupfileset> 
    </jar> 

</target> 

<!-- jar it, extract above dependency-all.jar and zip it with project files --> 
<target name="jar" depends="compile, copy-dependencies" 
      description="package, output to JAR"> 

    <mkdir dir="${dist.dir}" /> 
    <mkdir dir="${dist.lib.dir}" /> 

    <jar jarfile="${dist.dir}/${projectName}.jar" basedir="${build.dir}"> 
     <manifest> 
      <attribute name="Main-Class" value="${main-class}" /> 
     </manifest> 
     <zipfileset src="${dist.lib.dir}/dependencies-all.jar" 
          excludes="META-INF/*.SF" /> 
    </jar> 

</target> 

<target name="clean" description="clean up"> 
    <delete dir="${build.dir}" /> 
    <delete dir="${dist.dir}" /> 
</target> 

<!-- Default, run this --> 
<target name="main" depends="clean, compile, jar" /> 
</project> 

ant -v in MyBin看到的是沿着線的東西:

build-deps: 
Project base dir set to: /MyBin 
     [ant] calling target(s) [main] in build file /MyLib/build.xml 
parsing buildfile /MyLib/build.xml with URI = file:/MyLib/build.xml 
Project base dir set to: /MyBin 
Override ignored for property "projectName" 
Override ignored for property "build.dir" 
Override ignored for property "dist.dir" 
Override ignored for property "dist.lib.dir" 
Override ignored for property "lib.dir" 
[pathconvert] Set property classpath.name = 
     [ant] Entering /MyLib/build.xml... 
Build sequence for target(s) `main' is [clean, init, copy-dependencies, jar, main] 
Complete build sequence is [clean, init, copy-dependencies, jar, main, ] 

clean: 
    [delete] Deleting directory /MyBin/bin 
    [delete] Deleting directory /MyBin/bin 

init: 
    [mkdir] Created dir: /MyBin/bin 

copy-dependencies: 
     [ant] Exiting /MyLib/build.xml. 

回答

1

在您的具體問題:

好像它混淆MyBin和MyLib中的屬性?我不知道如何 ,以防止這種情況。

您正在使用此調用MyLib編譯:

<ant antfile="../MyLib/build.xml" target="main" /> 

通過<ant>任務調用的構建這樣在默認情況下繼承呼叫者的所有特性,包括basedir,因此構建在運行錯誤的地方。

相反,你可以使用,例如:

<ant dir="../MyLib" /> 

這將運行在指定的目錄build.xml,設置basedir屬性,調用默認的目標,這應該是main如果您使用的是非常相似的就像你說的那樣,庫的buildfile。如果您不想在執行MyLib任務時繼承MyBin的屬性,請在任務中指定inheritAll=false

從已dir屬性<ant>任務文檔:

目錄作爲新的Ant項目的basedir(除非 useNativeBasedir設置爲true)來使用。默認爲當前項目的 basedir,除非inheritall已被設置爲false,在這種情況下,其 沒有默認值。這將覆蓋被調用項目的基本設置 。也可以作爲解決antfile和輸出屬性值(如果有的話)的目錄。

+0

現在我收到了一條不同的錯誤消息,而且它很明顯是配置爲遵循'MyLib'中的'MyBin/build.xml' ant任務,因爲錯誤消息來自於不能從'MyBin/build.xml'中找到* only *的目錄(我試過明確指定'antfile'以及'dir')。 我想要一個密封的'MyLib' ant build,接着是一個'MyBin'(然後將'MyLib'輸入到classpath中)。我認爲你已經指出了我的正確方向,但會花費一些時間處理各種螞蟻任務選項並報告回來。 –

+0

是的,'inheritAll = false1似乎能夠強制'MyLib'構建密碼。 –