2012-02-07 11 views
8

के लिए प्रोग्रामेटिक रूप से एंटी लाइब्रेरी निर्भरताओं को जोड़ने के लिए मुझे हमारी चींटी बिल्ड स्क्रिप्ट के लिए स्वचालित सूचनाएं बनाने के साथ काम सौंपा गया है। ऐसा इसलिए है कि जब कोई तैनाती को निकाल देता है, तो हमारी टीम स्वचालित रूप से इसके बारे में एक ईमेल प्राप्त कर सकती है।मेल कार्य

स्वाभाविक पसंद Ant's mail task, जो चींटी के साथ पूर्वपरिभाषित आता उपयोग करने के लिए किया गया था:

java.lang.ClassNotFoundException: javax.mail.internet.MimeMessage 

इसका कारण यह है है चींटी के मेल कार्य JavaMail पर निर्भर करता है:

<target name="notify" description="notify team"> 
    <mail subject="latest deployment"> 
     <from address="[email protected]" /> 
     <to address="[email protected]" /> 
     <message>A new build has been pushed out to prod</message> 
    </mail> 
</target> 

हालांकि इस निम्नलिखित क्रम अपवाद में परिणाम और JavaBeans Activation Framework, पुस्तकालय जो स्पष्ट रूप से इसके वितरण के साथ शामिल नहीं हैं। क्यों चींटी एक कार्य को परिभाषित करेगी जो लाइब्रेरी पर निर्भर है लेकिन इसमें शामिल नहीं है कि पुस्तकालय मेरे लिए अस्पष्ट है।

इस मुद्दे पर इस मुद्दे पर पहले से ही चर्चा की गई है: ant mail task using mail and activation jar in external location। उत्तरों के आधार पर दो समाधान प्रतीत होते हैं।

पहला यह है कि मैन्युअल रूप से एंटी क्लासपाथ पर इन लाइब्रेरी निर्भरताओं को मैन्युअल रूप से रखना है। यह -lib कमांड लाइन तर्क का उपयोग करके किया जा सकता है, या ग्रहण में Window > Preferences > Ant > Runtime > Global Entries का उपयोग कर सकते हैं, और फिर mail.jar और activation.jar जोड़ें (मुझे यकीन है कि यह -lib जैसा ही है, मुझे सही करें अगर मैं गलत हूं)। लेकिन यह समाधान हमारी टीम के लिए अवांछनीय है क्योंकि इसका मतलब यह होगा कि हम में से प्रत्येक को मैन्युअल रूप से इन चरणों को पूरा करना होगा। मैं बस अपना अधिसूचना कोड प्रतिबद्ध करने का एक तरीका ढूंढ रहा हूं, और इसे svn अद्यतन के बाद किसी अन्य ग्रहण पर स्थापित करना चाहिए।

जुड़ा हुआ पोस्ट में अन्य समाधान प्रोग्राम के रूप में ऊपर करने के लिए एक तरह से उल्लेख है, जो अपने आप से चींटी को फोन करके:

<exec executable="ant"> 
    <arg value="-lib"/> 
    <arg value="PATH_TO_MY_LIB"/> 
    <arg value="target"/> 
</exec> 

इस के साथ समस्या यह है कि चींटी कमांड लाइन टूल जाहिरा तौर पर केवल के साथ शामिल है है पूर्ण स्थापना, ग्रहण वितरण नहीं। तो फिर मेल कार्य का उपयोग करने के इच्छुक किसी भी व्यक्ति द्वारा मैन्युअल कार्रवाई के बिना इसे काम करने का कोई तरीका नहीं है।

क्या कोई तरीका है कि मैं इसे सेटअप सेटअप के लिए एक और परेशान कदम जोड़ने के बिना स्वचालित कर सकता हूं? मैं वास्तव में समझ में नहीं आता कि यह हासिल करना इतना कठिन क्यों है - ऐसा लगता है कि मेल कार्य एंट द्वारा पूर्वनिर्धारित नहीं था यह आसान होगा। उम्मीद है कि मैं कुछ याद कर रहा हूँ।

+0

क्या आपने इस तरह के कार्यों के लिए सीआई का उपयोग करने पर विचार किया है? वे मेल और बहुत बेहतर रिपोर्टिंग के साथ आता है। मेरे वोट http://jenkins-ci.org/ – Jayan

उत्तर

5

मेल एएनटी में वैकल्पिक कार्यों में से एक है। स्थापित करने के लिए इन अतिरिक्त पुस्तकालयों चींटी 1.7 एक fetch.xml स्क्रिप्ट कहा, लागू इस प्रकार है: खिड़कियों पर

ant -f $ANT_HOME/fetch.xml -Ddest=user -Dm2.url=http://repo1.maven.org/maven2 

आप की कोशिश कर सकते:

ant -f %ANT_HOME%/fetch.xml -Ddest=user -Dm2.url=http://repo1.maven.org/maven2 

एक संपूर्ण स्पष्टीकरण के लिए ANT Manual documentation देखते हैं।


अद्यतन

निम्नलिखित चींटी फ़ाइल एक स्थापित-जार लक्ष्य है कि मेल कार्य द्वारा इस्तेमाल किया याद आ रही चींटी जार स्थापित करने के लिए इस्तेमाल किया जा सकता है।

<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="[email protected]" /> 
      <to address="[email protected]" /> 
      <message>A new build has been pushed out to prod</message> 
     </mail> 
    </target> 

</project> 

मुझे पता चला कि एएनटी मेल कार्य कार्य एएनटी सिस्टम क्लासपाथ से इसकी निर्भर कक्षाओं को लोड करता है। इसका मतलब है कि निर्माण को दो चरणों में चलाया जाना चाहिए:

$ ant install-jars 
$ ant 

अधिकांश एएनटी कार्य आपको क्लासपाथ संदर्भ निर्दिष्ट करने की अनुमति देते हैं। मेल कार्य नहीं करता है। इस मुद्दे अनुसंधान करने के लिए कोशिश कर रहा है मेरा पीछा मेलिंग सूची धागा करने के लिए नेतृत्व:

समाधान जटिल और प्रयास के लायक नहीं है। मैं असुविधा के साथ रहने की अनुशंसा करता हूं ... (इंस्टॉल-जार लक्ष्य को केवल एक बार चलाने की आवश्यकता है)

+0

और बिल्ड फ़ाइल के माध्यम से प्रोग्रामेटिक रूप से कैसे किया जा सकता है, ताकि ग्रहण में परिवर्तनों (और जार) के svn चेकआउट करने के बाद यह बिना किसी मैन्युअल सेटअप के काम करेगा ? –

+0

@PaulBellora मैंने जवाब –

+0

अपडेट किया है यह देखने के बाद कि यह वास्तव में इसे स्वचालित करने के लिए कितना दुर्बल है, मेरी टीम और मैंने मैन्युअल रूप से एंटी प्रति ग्रहण स्थापित करने की गोली को छोड़ने और निगलने का फैसला किया। आपका इंस्टॉल लक्ष्य करीब आया, उसके लिए +1 और लिंक - यह सिर्फ दुर्भाग्यपूर्ण चींटी को पुनरारंभ करने की ज़रूरत है, लेकिन ऐसा लगता है कि क्लासलोडर गड़बड़ी में बिना किसी चीज के वास्तव में कोई रास्ता नहीं है। –

1

taskdef कमांड के साथ, आप गतिशील रूप से नए कार्यों को लोड कर सकते हैं और जहां से वे लोड होते हैं वहां से एक वर्गपथ निर्दिष्ट कर सकते हैं। मैं बाहरी पुस्तकालय से नए कार्यों को लोड करने के लिए सफलतापूर्वक इसका उपयोग करता हूं जो चींटी वर्ग पथ पर नहीं है। यह कार्य तब भी काम करता है जब कार्य पहले से मौजूद है, मुझे नहीं पता।

मैं शायद किसी नए नाम से मेल कार्य फिर से परिभाषित करने की कोशिश कर के साथ शुरू होगा:

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

शायद आप यहाँ वर्ग रास्ते में मूल चींटी वर्ग पथ शामिल करने की जरूरत है ताकि के वर्ग मेल कार्य पाया जा सकता है।

अगर यह काम नहीं करता है, शायद आप मेल कार्य के स्रोत कोड ले जा सकते हैं, वर्ग का नाम बदलने के लिए, यह एक साथ बंडल mail.jar और activation.jar से वर्गों के साथ अपने स्वयं के जार में और जार से इस कार्य को लोड करते हैं। यह काम करना चाहिए क्योंकि यह किसी भी कार्य के साथ काम करता है जो चींटी से नहीं भेजा जाता है।

+0

@oers क्या आप कृपया दे सकते हैं कुछ और विवरण क्यों यह काम नहीं करता है? –

+0

श्रीमान मैं जल्दी से हो सकता था। मैंने आपके उत्तर को कुछ ऐसा करने के रूप में गलत तरीके से पढ़ा। यह दृष्टिकोण काम कर सकता है। – oers

+2

[ऐसा लगता है] (http: //ant.1045680 .n5.nabble.com/मेल-टास्क-साथ-मेल-जार-एक्ट-एक्टिवेशन-जार-आउट-ऑफ-lib-folder-td3347501.html), लेकिन कक्षा लोडिंग समस्याओं के कारण एक additonal चींटी कार्य की आवश्यकता है। – oers

1

आप चींटी रन config के classpath के लिए बाहरी जार के रूप में इन जार रख सकते हैं (यह मेरा एफ़टीपी उदाहरण है):

enter image description here

और परियोजना (टैब को यह रन config बचाने: राष्ट्रमंडल -> साझा फ़ाइल, मैं आमतौर पर resources/eclipse जैसे कुछ लेता हूं) और इसे svn पर प्रतिबद्ध करता हूं।

  1. यह सभी डेवलपर जो SVN
  2. से इस परियोजना की जाँच के लिए उपलब्ध हो जाएगा आपको लगता है कि इस परियोजना में जार, भी वितरित करने के लिए है। ताकि वे हमेशा उपलब्ध हो जाएगा
  3. हर कोई बाहरी उपकरण मेनू
बेशक

आप कर सकते थे write your own mail task, पर यह समस्या दूर करने के लिए से आसानी से इसे चला सकते हैं।

+0

+1 यह एक दिलचस्प सुझाव है - आखिरकार हमने प्रति इंस्टॉल मैन्युअल एंट सेटअप को बर्दाश्त करने का फैसला किया। –

5

this mail thread से उदाहरण के साथ मुझे एक कामकाजी समाधान मिला जो परीक्षण विफल होने पर ईमेल भेजता है।

आपको ant-classloadertask.jar, और javamail से 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> 
1

चींटी 1.8 के साथ।2 और ant-classloadertask.jar समाधान उल्लेख above (bro द्वारा) मैं लोडर से classloadertask की विशेषता को बदलने के लिए की जरूरत: और activation.jar में

loader="project" 

अन्यथा कक्षाएं: में

loader="thread" 

mail.jar क्लासलोडर द्वारा नहीं मिला था।