2009-10-16 67 views
9

(見下面的編輯。)Maven的Antrun和依賴

我不能只使用類路徑的原因,是因爲我需要管理一些非Java庫,而且我編譯非java項目。

我想在antrun呼叫使用Maven依賴關係,在Maven站點文檔以下內容:

http://maven.apache.org/plugins/maven-antrun-plugin/examples/classpaths.html

在頁面的底部:

<property name="mvn.dependency.jar" 
     refid="maven.dependency.my.group.id:my.artifact.id:classifier:jar.path"/> 
<echo message="My Dependency JAR-Path: ${mvn.dependency.jar}"/> 

我可以無論我如何嘗試,都無法做到這一點。我已經嘗試過在refid內容中添加$ {},我試過了冒號,句點等等。作爲分隔符,我可以想到各種方式。

任何人都可以告訴我什麼是refid應真的看起來像一些常見的依賴?

編輯:

感謝您的答覆。

使用你的榜樣SingleShot,我有以下幾點:

<plugins> 
    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-antrun-plugin</artifactId> 
    <executions> 
     <execution> 
     <id>create-messages</id> 
     <phase>compile</phase> 
     <configuration> 
      <tasks> 
      <property name="build.compiler" value="extJavac"/> 
      <property name="compile_classpath" refid="maven.compile.classpath"/> 
      <property name="runtime_classpath" refid="maven.runtime.classpath"/> 
      <property name="test_classpath" refid="maven.test.classpath"/> 
      <property name="plugin_classpath" refid="maven.plugin.classpath"/> 

      <property name="log4j.jar" refid="log4j:log4j:jar"/> 
      <echo message="Where is the Log4J JAR?: ${log4j.jar}"/> 
      </tasks> 
     </configuration> 
     <goals> 
      <goal>run</goal> 
     </goals> 
     </execution> 
    </executions> 
    <dependencies> 
     <dependency> 
     <groupId>log4j</groupId> 
     <artifactId>log4j</artifactId> 
     <version>1.2.14</version> 
     </dependency> 
    </dependencies> 
    </plugin> 

這裏就是我得到的運行時MVN編譯:

[INFO] Scanning for projects... 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building Chat Component 
[INFO] task-segment: [compile] 
[INFO] ------------------------------------------------------------------------ 
Downloading: http://<redacted>/content/groups/public/log4j/log4j/1.2.14/log4j-1.2.14.pom 
2K downloaded 
Downloading: http://<redacted>/content/groups/public/log4j/log4j/1.2.14/log4j-1.2.14.jar 
358K downloaded 
[INFO] [antrun:run {execution: create-messages}] 
[INFO] Executing tasks 
[INFO] ------------------------------------------------------------------------ 
[ERROR] BUILD ERROR 
[INFO] ------------------------------------------------------------------------ 
[INFO] Error executing ant tasks 

Embedded error: Reference log4j:log4j:jar not found. 
[INFO] ------------------------------------------------------------------------ 
[INFO] For more information, run Maven with the -e switch 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 3 seconds 
[INFO] Finished at: Fri Oct 16 14:54:19 PDT 2009 
[INFO] Final Memory: 7M/80M 
[INFO] ------------------------------------------------------------------------ 

EDIT(2):

展望在源代碼鏈接我決定運行「mvn -X編譯」和grep的「存儲」,這變成了一堆日誌輸出的地方是東西g存儲。

有趣的是,我明確指定的依賴並不在列表中顯示的事實,並且,當我切換到基於該項目的一個關鍵我看,我仍然得到錯誤。

回答

9

基礎上SingleShot掛碼和隨機戳,直到它的工作,這裏就是我得到了這個問題,「工作」,(我用引號說,因爲感覺很脆弱。)

這裏的方式來使其正常工作:

<property name="log4j_location" 
       value="${maven.dependency.log4j.log4j.jar.path}"/> 
<echo message="${log4j_location}"/> 

一些重要的事情需要注意:您無法使用maven依賴作爲REFID在設置Ant屬性。您必須使用$ {}來獲取maven var值。

看起來,依賴項必須位於頂層依賴列表中,這使得log4j成爲antrun插件的依賴關係,不會將其暴露給插件,無論如何我都能看到它。

所有的路徑分隔符都是點(。),沒有冒號(:)這就是爲什麼我最終檢查自己的答案是正確的。

肥皂盒:

我會強烈建議任何考慮的Maven使用Ant與Maven插件,或者甚至更好,使用Ant常春藤代替。

這個特別的問題是一個非常荒謬的例子,它與任何超出Maven規範的範圍相關。

我說這已經實現了基於Maven2的整個構建系統,並且還在Ant中實現了多個構建系統。我已經將Maven2和Ant用於涉及Java,Flex/AS3,C#和C++的複雜構建。 Maven對於Java有意義項目有對其他語言項目的外部依賴項。

Maven確實解決了一些Ant沒有明確解決的問題,但是有了一些前期規劃,Ant是更靈活,更好的文檔記錄和更少漏洞的工具。

如果你決定走螞蟻路線,一定要爲你的項目定義一個結構,找出你的依賴系統(使用一個)。

我認爲你最終會比使用Maven更快樂,因爲你不會花費緊縮時間來修復你的構建系統。

2

如果沒有您鍵入到您的POM其很難說有什麼例子,但是考慮到一個具體的例子。假設您的POM引用了log4j(groupId = log4j,artifactId = log4j)。我相信這是你將如何引用JAR在你的Ant文件:

<property name="log4j.jar" refid="maven.dependency.log4j:log4j:jar.path"/> 
<echo message="Where is the Log4J JAR?: ${log4j.jar}"/> 

理想情況下,你不應該引用特定的JAR文件,而是引用整個類路徑的適當範圍,因爲有些稀疏文件爲插件指示。

如果您仍然遇到問題,請發佈<dependency>標記,以確保您使用的Maven POM依賴項,並且我可以嘗試更具體。

我看着plugin's code確認。

+0

對不起。我原來的回答錯過了「maven.dependency」。前綴和「.path」後綴。它現在已經修復並且應該可以工作。查看插件來源(上面鏈接)的第87行,看看它應該看起來如何。 – SingleShot 2009-10-16 22:14:50

4

作爲Aaron H.上面答案的補充,我必須將插件的版本設置爲1.3,以便實際工作。我使用它沒有一個特定的版本,並得到1.1(似乎沒有任何工作)。


     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-antrun-plugin</artifactId> 
     <version>1.3</version> 
     ... 
     </plugin> 
+1

我懷疑差異在於我們使用的回購(s)。這就是imho(或者也許不那麼謙虛),只是另一個「它正常工作」的例子,與maven打破了...... – 2009-10-23 15:00:24

1

有一個bug in the documentation。路徑應該是這樣的形式:

<property name="mvn.dependency.jar" 
    value="${maven.dependency.my.group.id.my.artifact.id.classifier.jar.path}"/> 

因此,對於你的log4j依賴正確的密鑰將是:

maven.dependency.log4j.log4j.jar.path 

還要注意,它應該是value=而非refid=,所以全屬性會:

<property name="log4j.jar" 
     value="${maven.dependency.log4j.log4j.jar.path}"/> 
<echo message="My Dependency JAR-Path: ${log4j.jar}"/> 
0

我有一個現有的螞蟻,我們計劃使用(新)maven來調用它。我遇到了我可能不記得清楚的問題,但它與課堂練習有關,也許和你的一樣。

問題是,我們每天使用的「ant」是一個在XNIX和Windows上設置類路徑的shell腳本。我沒有比較由它設置的類路徑和可用於maven的類路徑,但是我的測試顯示它們不匹配,並且ant不會運行從maven傳遞給它的一些路徑。

我使用的是「exec-maven-plugin」,並運行ant作爲外部程序並應用了一些參數。不過這肯定會起作用,但會增加額外的依賴性。