2011-02-24 37 views
8

我正在執行很多scpsshexec以及來自ant構建腳本的其他遠程命令。如果jsch.jar不在螞蟻lib目錄中,則這些命令不起作用。爲了使它工作,我將JAR複製到了ant lib目錄中,但這不是一個好的解決方案,因爲其他任何想運行該腳本的人都必須執行相同的操作。要從Teamcity運行ant目標,我們必須顯式設置lib文件的路徑。如何在ant buildfile中指定JAR的路徑?

有沒有一種方法可以指定JAR在Ant構建XML本身的路徑?

+0

已測試過您的螞蟻代碼示例?我沒有看到它不應該起作用的原因。我以同樣的方式用於其他任務。 – Robert 2011-02-24 12:58:37

+0

我並不是說它不起作用,它可以工作,但我必須在ant lib目錄中添加jsch.jar,這是我想避免的。道歉,如果我的問題沒有正確說明。我們有這樣的任務{ \t }爲了做到這一點,我必須手動在ant lib中添加jsch.jar。我是否可以通過在構建文件中加入某些東西來避免這種情況 – Ravi 2011-02-24 13:10:36

+0

如果jsch.jar不在lib目錄中,那麼您刪除的代碼段也可以工作。然後你必須確保你指定了正確的相對路徑或絕對路徑。 – Robert 2011-02-24 17:07:21

回答

4

謝謝你的回答。我設法使它與類加載器任務一起工作。這就是我所做的。

<project basedir="." > 
    <property environment="env"/> 

    <taskdef resource="net/jtools/classloadertask/antlib.xml"> 
    <classpath> 
     <fileset dir="${basedir}/lib" includes="ant-classloader*.jar"/> 
    </classpath> 
    </taskdef> 

    <!--Add JSCH jar to the classpath--> 
    <classloader loader="system"> 
    <classpath> 
     <fileset dir="${basedir}/lib" includes="jsch*.jar"/> 
     </classpath> 
    </classloader> 

    <target name="Test"> 
     <scp todir="user1:[email protected]:/tmp" trust="true" > 
     <fileset dir="dir1"> 
      <include name="test.txt" /> 
     </fileset> 
     </scp> 
    </target> 
</project> 

正如你可以看到這裏,我沒有給任何從屬目標爲我的「測試」的目標,它只是工作。它使用classloader,它將jsch.jar附加到系統類加載器。

+0

我不認爲類加載器是必要的。文件頂部的路徑聲明可以正常工作,並與taskdef ant任務上的classpathref屬性結合使用。 – 2011-02-25 11:46:39

+0

taskdef將不得不再次聲明,爲此我必須從lib目錄中刪除ant-jsch.jar,併爲scp和sshexec添加nw taskdef。 – Ravi 2011-02-27 12:07:15

+0

這個解決方案效果很好。類加載器jar和信息可以在http://enitsys.sourceforge.net/ant-classloadertask/上找到。 – zombat 2012-08-01 22:50:53

2

一個可能的解決方法是使用-lib命令行選項告訴螞蟻在哪裏查找附加jar。也許你可以創建一個包裝腳本,用這個選項集調用ant

另一種方式是移動ant-jsch.jar文件(這是與Ant定義的任務,而不是你需要單獨下載jsch.jar文件的jar)出你的螞蟻lib目錄中,並創建一個taskdef爲你的ssh任務分開,內置的一個,然後設置classpath中執行此任務的jsch.jarant-jsch.jar

<taskdef name="sshexec" 
    classname="org.apache.tools.ant.taskdefs.optional.ssh.SSHExec"> 
    <classpath> 
    <pathelement location="jsch-0.1.44.jar"/> 
    <pathelement location="ant-jsch.jar" /> 
    </classpath> 
</taskdef> 

我不知道這會幫助你,雖然,因爲它也涉及在修改lib目錄。

據我所知,目前不可能在構建文件本身中一般指定內置任務所需的額外jar。有一些特殊情況,比如junit。

+0

如果任務需要多個JAR,那麼如果出現問題,爲什麼不簡單地將所有JAR整合到一個JAR中? – Robert 2011-02-24 17:09:12

+1

我不想更改ant lib目錄,因爲我沒有任何控制權。這個選項在這種情況下不起作用 – Ravi 2011-02-25 10:58:20

1

爲了確保你的構建更跨平臺,我建議使用依賴管理。 ivy plug-in可以在構建時自動安裝版本的插件版本。

這種方法意味着你永遠需要安裝到您的ANT lib中的最後一個罐子常春藤2.2.0.jar :-)

首先在文件的ivy.xml申報項目的依賴

<ivy-module version="2.0"> 
    <info organisation="com.myspotontheweb" module="demo"/> 
    <configurations> 
     <conf name="anttask" description="Jars implementing ANT tasks"/> 
    </configurations> 
    <dependencies> 
     <dependency org="com.jcraft" name="jsch" rev="0.1.42" conf="anttask->default"/> 
    </dependencies> 
</ivy-module> 

在您的build.xml運行常春藤和使用它的基礎上的常春藤配置來填充一個自定義的類路徑:

<target name='init' description='Resolve project dependencies and set classpaths'> 
    <ivy:resolve/> 
    <ivy:cachepath pathid="anttask.path" conf="anttask"/> 
</target> 

最後,在您的構建中的其他地方使用現在由ivy自動填充的類路徑聲明您的ANT任務。

<target name='dosomething' depends="init"> 
    <taskdef name="sshexec" 
      classname="org.apache.tools.ant.taskdefs.optional.ssh.SSHExec" 
      classpathref="anttask.path"/> 
    .. 
    .. 
</target> 

這種方法適用於所有的ANT插件,其中大部分是在中央Maven倉庫可用。第二個好處是可以輕鬆升級所有版本的插件版本。

+0

這並不能解決一些需要在螞蟻lib目錄中的jar來滿足類加載需求的問題。實際的ant任務在ant中附帶的ant-jsch.jar中定義,而不是在單獨下載的jsch.jar中定義。問題是讓jsch.jar對ant-jsch.jar中的類可見。或者我錯過了什麼? – matt 2011-02-24 19:47:42

+0

檢出taskdef任務上的「classpathref」屬性。它允許您指定要在聲明任務時使用的類路徑。常春藤提供的幫助是在構建時下載和填充該類路徑的能力。這就是Maven構建工具所做的,它的所有插件都被下載。 – 2011-02-25 09:42:46

+0

我非常喜歡你的方法,但是在這裏,每個任務都必須先調用** init **任務'depends =「init」'。我正在尋找更像「改變一次,共同工作」的方案。 – Ravi 2011-02-25 11:01:18