簡體   English   中英

如何以編程方式為郵件任務添加Ant庫依賴項

[英]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的郵件任務依賴於JavaMailJavaBeans Activation Framework ,這些庫顯然不包含在其發行版中。 為什么Ant會定義依賴於庫但不包含該庫的任務我不清楚。

此帖已經討論過這個問題: 在外部位置使用郵件和激活jar的ant郵件任務 基於答案,似乎有兩種解決方案。

第一種是手動將這些庫依賴項放在ant類路徑上。 這可以使用-lib命令行參數完成,或者在eclipse中可以使用Window > Preferences > Ant > Runtime > Global Entries ,然后添加mail.jaractivation.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.jarmail.jar中的類。

使用taskdef命令,您可以動態加載新任務並指定加載它們的類路徑。 我成功地使用它來從不在ant類路徑上的外部庫加載新任務。 當任務已經存在時它是否也有效,我不知道。

我可能會嘗試使用新名稱重新定義郵件任務:

<taskdef name="mymail" classname="class.of.mail.task" classpath="mail.jar;activation.jar">

也許您需要在類路徑中包含原始ant類路徑,以便可以找到郵件任務的類。

如果這不起作用,也許您可​​以獲取郵件任務的源代碼,重命名該類,將它與mail.jaractivation.jar的類一起捆綁到您自己的jar中,並從JAR加載此任務。 這應該適用於任何未附帶ant的任務。

您可以將這些jar作為外部jar放到ant run config的類路徑中(這是我的ftp示例):

在此輸入圖像描述

並將此運行配置保存到項目中(Tab:Common - > Shared File,我通常采用類似resources/eclipse的方式)並將其提交給svn。

  1. 它將適用於從svn檢查此項目的所有開發人員
  2. 你也必須在該項目中交付罐子。 這樣他們將永遠可用
  3. 每個人都可以從外部工具菜單輕松運行它

當然你可以編寫自己的郵件任務來處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM