2012-03-05 78 views
5

我使用ant來編譯Java應用程序。問題是一些開發者在贏得7,其他人在XP和Vista。編譯的一部分是使用WIX構建msi,在win7上這是一個目錄,在xp和vista上它是另一個目錄。如何檢測ANT中的Windows操作系統

螞蟻任務在Maven中進行控制。我是通過一種方式來告訴windows的os與ant之間的區別,以設置wix目錄的條件標籤。有任何想法嗎?

我知道這將是這種格式:

<if> 
    <condition property="isWin7"> 
    Check for windows 7 
    </condition> 
    <then> 
    set wix path to win 7 installation 
    </then> 
    <else> 
    set to vista/xp wix installation 
    </else> 
</if> 

任何幫助將是巨大的。

+0

可能重複的[使用螞蟻來檢測操作系統和設置屬性](http://stackoverflow.com/questions/453170/using-ant-to-detect-os-and-set-property) – oers 2012-03-05 14:25:32

+0

我已經檢查,但我想要做的是檢查它的XP,Vista或Win7的其他選項只會讓你知道,如果它的窗戶。 – Nathan 2012-03-07 16:15:34

+0

@Nathan - 你有沒有運氣使用我的答案?請標記爲已接受,或者給我留言,以便我可以提供更多幫助。這種技術被用在我們的生產構建系統中,但它可能無法解決你的問題。 – 2013-07-01 09:54:58

回答

12

它看起來像ANT <condition>可以測試的名字,家庭&版本的操作系統:

基於該鏈接的,也有涉及到操作系統的一些特性,我們可以查詢。一個是在普通代碼中使用的正常family屬性:

<!-- CHECK FOR WINDOWS FAMILY OS --> 
<condition property="is_windows"> 
    <os family="windows"/> 
</condition> 

我ANT的版本不適用${os.family}打印出解析值。


還有:

  • os.name < ---這就是你需要檢查
  • os.arch
  • os.version
的一個

這裏有一個演示腳本,我提出來顯示這些屬性的使用:

<?xml version="1.0" encoding="UTF-8"?> 
<project name="Test" default="build" > 

    <!-- CHECK FOR WINDOWS FAMILY OS --> 
    <condition property="is_windows"> 
     <os family="windows"/> 
    </condition> 

    <condition property="is_windows_7"> 
     <os name="Windows 7"/> 
    </condition> 

    <!-- DISPLAYS WINDOWS OS --> 
    <target name="display_windows" if="is_windows" > 
     <echo message="OS Family is:  Windows" /> 
    </target> 


    <target name="build" > 

     <antcall target="display_windows" /> 

     <echo message="OS Name is:   ${os.name}" /> 
     <echo message="OS Architecture is: ${os.arch}" /> 
     <echo message="OS Version is:  ${os.version}" /> 

    </target> 

</project> 

因爲回答這個問題,上面的代碼已經被提升到我們的生產版本的系統,它是跨Windows &蘋果提供共享功能。


@thekbb取得了良好的建議,刪除<antcall target="display_windows" />,並更新目標定義取決於display_windows按下面的代碼:

<target name="build" depends="display_windows"> 

     <echo message="OS Name is:   ${os.name}" /> 
     <echo message="OS Architecture is: ${os.arch}" /> 
     <echo message="OS Version is:  ${os.version}" /> 

    </target> 

此基礎上antcall啓動一個新的實例的事實的螞蟻在一個新的JVM中。一些用戶可能會發現這種優化更容易理解;出於性能原因,其他人可能會這樣做。

+1

如果您複製粘貼/此,請務必刪除並更改構建目標以取決於顯示窗口目標。 antcall在一個新的jvm中創建一個新的ant實例來回應它是windows。 – thekbb 2013-10-15 18:26:37

+0

@thekbb提示的Thx。爲什麼在這個例子中分離一個新副本是一件壞事?什麼是在螞蟻中僞造一個方法調用的更好方法? – 2013-10-15 18:55:13

+1

這很大程度上是文體 - 我編輯了你的答案,以顯示我的建議。如果您不同意,請回復編輯。當構建文件變得很大,並且有大量的antcalls時,很難獲得控制目標之間流動的圖像。在現代硬件上,啓動一個新版本的ant的代價可以忽略不計,我在我的Mac上跑了每一路,差異是~0.5秒 – thekbb 2013-10-15 19:21:04