2011-03-09 71 views
12

我想看看這裏設置了哪些系統屬性(以及哪些值),所以最簡單的方法(如果不是在這裏寫一個新的Java程序)將會添加一些行到我的ant構建腳本中:在哪裏可以找到缺少可選的ant任務?

<target name="properties"> 
    <echoproperties/> 
    </target> 

但是運行ant給我此錯誤消息:

/u/ebermann/projektoj/stackoverflow-examples/build.xml:19: Problem: failed to create task or type echoproperties 
Cause: the class org.apache.tools.ant.taskdefs.optional.EchoProperties was not found. 
     This looks like one of Ant's optional components. 
Action: Check that the appropriate optional JAR exists in 
     -/usr/share/ant/lib 
     -/u/ebermann/.ant/lib 
     -a directory added on the command line with the -lib argument 

Do not panic, this is a common problem. 
The commonest cause is a missing JAR. 

This is not a bug; it is a configuration problem 

好了,所以我不慌,,但不知道該怎麼辦。

我這裏有螞蟻1.7.1(在OpenSuse系統),而可悲的是這個版本沒有文檔,而且我不是root來安裝這一個當前螞蟻版本或舊版本的文檔(我只是下載了它它仍然沒有說這裏需要哪個jar文件)。在上面列出的目錄中,只有/usr/share/ant/lib存在,但它不包含任何內容,如optional

我想下載必要的jar文件並將其放在我的主目錄中,但在哪裏可以找到它?該ant download archive包含沒有這樣的,我不知道在哪裏可以搜索。 (我做google了一下,但沒有發現任何東西。

因此,有人可以給我一些指點哪裏可以找到合適的jar文件?

(我猜的解決方案是很容易的,有什麼東西。只是擋着我的視線)


vahapt的回答,我從網上下載apache repository文件,並把它變成該錯誤消息中提到的目錄/u/ebermann/.ant/lib再次運行ant properties - 在相同的R-如上所述。

$ jar -tf /u/ebermann/.ant/lib/ant-nodeps-1.7.1.jar | grep 'EchoProperties.class' 
org/apache/tools/ant/taskdefs/optional/EchoProperties.class 

這看起來像它應該工作 - 是錯誤信息只是錯誤?

如果我把它直接到CLASSPATH,它的工作原理:

$ CLASSPATH=/u/ebermann/.ant/lib/ant-nodeps-1.7.1.jar ant properties 
Buildfile: build.xml 

properties: 
[echoproperties] #Ant properties 
[echoproperties] #Thu Mar 10 00:46:22 CET 2011 
... 
[echoproperties] user.name=ebermann 
[echoproperties] user.timezone= 

BUILD SUCCESSFUL 
Total time: 0 seconds 

我不想改變我的正常CLASSPATH變量,它應該是放入此目錄中工作,或者我才明白有問題?

任何想法,或者這是一個螞蟻的錯誤?

(另外,爲什麼是這個文件無處螞蟻文檔中提及?)


編輯:

vahapt答案後,我的ant構建文件看起來是這樣的:

<project name="stackoverflow-examples" basedir="."> 

    <target name="echoproperties.prepare"> 
    <available property="echoproperties.works" 
       classname="org.apache.tools.ant.taskdefs.optional.EchoProperties" 
       /> 
    </target> 

    <target name="echoproperties.init" 
      depends="echoproperties.prepare" 
      unless="echoproperties.works"> 
    <taskdef name="echoproperties" classname="org.apache.tools.ant.taskdefs.optional.EchoProperties"> 
     <classpath> 
     <fileset dir="${user.home}/.ant/lib"> 
      <include name="ant-nodeps.jar" /> 
     </fileset> 
     </classpath> 
    </taskdef> 
    </target> 


    <target name="properties" depends="echoproperties.init"> 
    <echoproperties/> 
    </target> 

</project> 

此重新註冊,只有當它是不是已經在螞蟻類路徑的任務。 (因此,它也適用於在主目錄中沒有此文件的完整ant安裝)。

我還是要說,This is not a bug; it is a configuration problem不完全正確的,更是爲將在該文件中指定的目錄幫助


還有一個有趣的現象:在${user.home}/.ant/lib的nodeps.jar(即現在/u/ebermann/.ant/lib/ant-nodeps.jar已經在類路徑(由${java.class.path}所示的一個,但是這似乎沒有幫助<echoproperties>到沒有這個工作。taskdef

所以,這個工程太:

<target name="echoproperties.init" 
      depends="echoproperties.prepare" 
      unless="echoproperties.works"> 
    <taskdef name="echoproperties" 
      classname="org.apache.tools.ant.taskdefs.optional.EchoProperties" 
      classpath="${java.class.path}" /> 
    </target> 
+0

也許如果你命名文件ant-nodeps.jar,而沒有版本,Ant可能會找到它。我相信你的問題出現了,因爲Ubuntu在幾個部分中封裝了Ant - 核心,可選,文檔,而Apache版本已經組裝好幾年了。現在將歷史的「核心」和「可選」任務視爲平等。 – 2011-03-10 00:31:37

+0

我在OpenSUSE而不是Ubuntu上,但它可能類似。 (在我的Ubuntu系統中,我是root用戶,並且也有當前的螞蟻。)更改文件名不會改變任何內容,它看起來像ant完全忽略了這個目錄。 '-lib'參數也是。 – 2011-03-10 00:36:49

回答

6

當你做一個谷歌搜索,結果指向螞蟻nodeps-1.7.1.jar
確保罐子存在,並且您已經將其添加到類路徑

對於你的問題的第二部分:
解決方法1.你並不需要修改你的CLASSPATH變量。相反,你可以通過添加參數-cp [JAR文件的位置](-cp是「Java」的可執行文件)
溶液2 Jar文件是簡單的ZIP文件,打開螞蟻nodeps.jar複製它添加了內容的ant.jar扔掉螞蟻nodeps.jar
溶液3請參見下面的示例。 taskdef是一個將jar或類加載到ClassLoader層次結構中的ant功能。 (你在使用它之前加載類,就像一個魅力)

<?xml version="1.0" encoding="ASCII"?> 
<project name="Test" default="properties" basedir="."> 

    <target name="properties" depends="init"> 
     <echoproperties/> 
    </target> 

    <target name="init"> 
     <taskdef name="echoproperties" classname="org.apache.tools.ant.taskdefs.optional.EchoProperties"> 
      <classpath> 
       <fileset dir="${ant.library.dir}"> 
        <include name="ant-nodeps.jar" /> 
       </fileset> 
      </classpath> 
     </taskdef> 
    </target> 
</project> 
+0

謝謝...僅供參考(因爲我似乎太愚蠢,無法使用谷歌),您使用了哪些關鍵字? – 2011-03-09 23:27:19

+1

org.apache.tools.ant.taskdefs.optional。EchoProperties :)有時我們看不到最簡單的解決方案。這就是爲什麼像StackOverflow這樣的網站已經啓動並正在運行。 – vahapt 2011-03-09 23:28:30

+0

我用我的新問題更新了這個問題 - 你(或其他人)有一些想法,爲什麼不使用類路徑不工作? – 2011-03-09 23:52:47

2

我下載Ant 1.7.1,並期待與它附帶的文檔。在那裏它將echoproperties描述爲可選任務,但沒有提及獲取該可選任務的jar文件的位置。

展望lib文件夾裏面,我發現了ant-nodeps.jar。顯然,它包含在Ant 1.7.1中。

我建議您下載並安裝Ant 1.8。由於Ant是一個Java jar文件,安裝最新最好的版本並不是那麼困難。

我看着我的Mac,/usr/bin/ant是鏈接到/usr/share/ant/bin/usr/share/ant/是鏈接到/usr/share/java/ant-1.8.2。所以,我所要做的就是將/usr/share/ant/bin/指向正確版本的Ant。

在螞蟻1.8.2,echoproperties現在是一個標準的任務。

+0

問題是我總是在我的配額限制下運行,所以我寧願不安裝完整的38 MB(1.7。 1)或39 MB(用於1.8.2)在我的主目錄中 - 在家裏我有一個當前版本,我現在安裝了'ant-nodeps.jar',它只有一半MB – 2011-03-10 00:10:25

+0

我明白了。我沒有意識到你沒有控制你的機器,我從來不喜歡OpenSUSE - 太多過時的程序了,最後一次看,他們仍然有Subversion 1.4和Apache httpd2的一個奇怪的實現,這使得非常設置服務器很難,我的公司最終轉向Fedora/CentOS/Redhat(取決於是否需要支持,桌面系統等) – 2011-03-10 17:31:45

相關問題