[英]How to programmatically add Ant library dependencies for mail task
我的任務是為Ant構建腳本創建自動通知。 這樣,當有人推出部署時,我們的團隊可以自動收到有關它的電子郵件。
顯而易見的選擇是使用Ant的郵件任務 ,它是使用Ant預定義的:
<target name="notify" description="notify team">
<mail subject="latest deployment">
<from address="me@gmail.com" />
<to address="jimmy@yahoo.com" />
<message>A new build has been pushed out to prod</message>
</mail>
</target>
但是,這會導致以下運行時異常:
java.lang.ClassNotFoundException: javax.mail.internet.MimeMessage
這是因為Ant的郵件任務依賴於JavaMail和JavaBeans Activation Framework ,這些庫顯然不包含在其發行版中。 為什么Ant會定義依賴於庫但不包含該庫的任務我不清楚。
此帖已經討論過這個問題: 在外部位置使用郵件和激活jar的ant郵件任務 。 基於答案,似乎有兩種解決方案。
第一種是手動將這些庫依賴項放在ant類路徑上。 這可以使用-lib
命令行參數完成,或者在eclipse中可以使用Window > Preferences > Ant > Runtime > Global Entries
,然后添加mail.jar
和activation.jar
(我很確定這相同)事情為-lib
,如果我錯了,請糾正我)。 但是這個解決方案對我們的團隊來說是不受歡迎的,因為這意味着我們每個人都必須手動執行這些步驟。 我正在尋找一種方法來簡單地提交我的通知代碼,它應該在svn更新后的另一個eclipse安裝上工作。
鏈接文章中的另一個解決方案提到了一種通過從自身調用Ant來以編程方式執行上述操作的方法:
<exec executable="ant">
<arg value="-lib"/>
<arg value="PATH_TO_MY_LIB"/>
<arg value="target"/>
</exec>
這個問題是Ant命令行工具顯然只包含在完整安裝中,而不是eclipse發行版。 因此,如果沒有任何想要使用郵件任務的人進行手動操作,就無法使其工作。
有沒有什么方法可以自動化這個,而不會給項目設置添加另一個惱人的步驟? 我真的不明白為什么這么難實現 - 看起來如果郵件任務沒有被Ant預定義,這會更容易。 希望我錯過了一些東西。
通過這個郵件線程的示例,我得到了一個可以在測試失敗時發送電子郵件的工作解決方案。
您需要從javamail下載ant-classloadertask.jar和mail.jar並將它們放在test.libs.dir中。
<property name="test.libs.dir" location="${basedir}/lib/unit-test"/>
<property name="test.results.dir" location="${basedir}/test-results/"/>
<path id="project.classpath.tests">
<pathelement location="${build}"/>
<path refid="project.lib.path"/>
</path>
<target name="unit-tests" depends="">
<mkdir dir="${test.results.dir}"/>
<junit fork="false" showoutput="yes" includeantruntime="false"
errorproperty="test.error" failureproperty="test.error"
haltonerror="false" haltonfailure="false">
<classpath refid="project.classpath.tests"/>
<formatter type="plain" usefile="true" />
<batchtest fork="no" todir="${test.results.dir}">
<fileset dir="${build}/test/">
<include name="package/dir/path/to/tests/TestFile.java"/>
</fileset>
</batchtest>
</junit>
<antcall target="sendMail"/>
</target>
<path id="mail.path">
<pathelement location="${test.libs.dir}/mail.jar"/>
</path>
<!-- http://enitsys.sourceforge.net/ant-classloadertask/ -->
<taskdef name="classloadertask"
classname="org.apache.tools.ant.taskdefs.ClassloaderTask"
classpath="${test.libs.dir}/ant-classloadertask.jar"/>
<classloadertask classpathRef="mail.path" loader="thread"/>
<target name="sendMail" if="test.error">
<mail mailhost="smtp.gmail.com"
mailport="587"
user=""
password=""
ssl="yes"
failonerror="true"
from=""
tolist=""
subject="Unit tests have failed"/>
</target>
郵件是ANT中的可選任務之一。 要安裝這些附加庫,ANT 1.7添加了一個fetch.xml腳本,調用如下:
ant -f $ANT_HOME/fetch.xml -Ddest=user -Dm2.url=http://repo1.maven.org/maven2
在Windows上你可以嘗試:
ant -f %ANT_HOME%/fetch.xml -Ddest=user -Dm2.url=http://repo1.maven.org/maven2
有關完整說明,請參閱ANT手冊文檔 。
以下ANT文件具有install-jars目標,可用於安裝郵件任務使用的缺少的ANT jar。
<project name="demo" default="notify">
<target name="install-jars" description="Install ANT optional jars">
<mkdir dir="${user.home}/.ant/lib"/>
<get dest="${user.home}/.ant/lib/mail.jar" src="http://search.maven.org/remotecontent?filepath=javax/mail/mail/1.4.4/mail-1.4.4.jar"/>
<get dest="${user.home}/.ant/lib/activation.jar" src="http://search.maven.org/remotecontent?filepath=javax/activation/activation/1.1/activation-1.1.jar"/>
</target>
<target name="notify" description="notify team">
<mail subject="latest deployment">
<from address="me@gmail.com" />
<to address="jimmy@yahoo.com" />
<message>A new build has been pushed out to prod</message>
</mail>
</target>
</project>
我發現ANT郵件任務任務從ANT系統類路徑加載它的依賴類。 這意味着構建必須分兩步運行:
$ ant install-jars
$ ant
大多數ANT任務允許您指定類路徑引用。 郵件任務沒有。 試圖研究這個問題讓我看到以下郵件列表主題:
解決方案很復雜,不值得付出努力。 我建議生活帶來不便......(安裝罐子目標只需要運行一次)
使用上面提到的Ant 1.8.2和ant-classloadertask.jar解決方案(由bro )我需要更改classloadertask的 loader屬性:
loader="thread"
成:
loader="project"
否則classloader找不到activation.jar和mail.jar中的類。
使用taskdef
命令,您可以動態加載新任務並指定加載它們的類路徑。 我成功地使用它來從不在ant類路徑上的外部庫加載新任務。 當任務已經存在時它是否也有效,我不知道。
我可能會嘗試使用新名稱重新定義郵件任務:
<taskdef name="mymail" classname="class.of.mail.task" classpath="mail.jar;activation.jar">
也許您需要在類路徑中包含原始ant類路徑,以便可以找到郵件任務的類。
如果這不起作用,也許您可以獲取郵件任務的源代碼,重命名該類,將它與mail.jar
和activation.jar
的類一起捆綁到您自己的jar中,並從JAR加載此任務。 這應該適用於任何未附帶ant的任務。
您可以將這些jar作為外部jar放到ant run config的類路徑中(這是我的ftp示例):
並將此運行配置保存到項目中(Tab:Common - > Shared File,我通常采用類似resources/eclipse
的方式)並將其提交給svn。
當然你可以編寫自己的郵件任務來處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.