Yuav ua li cas rau automate koj txoj kev muaj Java thiab ntsaum?

Automate build with Ant

Automate muaj cov ntsaum

Txheej txheem cej luam:

Nyob rau hauv daim ntawv no peb yuav tham txog qhov muaj cuab tam ntsaum thiab siv yam tshuaj no npaum li cas peb yuav automate tau muaj mechanism rau java raws li daim ntaub ntawv. Nyob rau hnub no tus era ntsaum kuj yog ib feem ntawm txoj kev loj hlob java. Feem ntau cov neeg muas zaub xav kom muaj ib tsab ntawv xoovtooj kaw cia pab muaj li ib feem ntawm daim tauj qhov chaws. Yog vim li cas qhov no yog tus muab ntawm tus ntsaum kom tus neeg uas paub me ntsis scripting tau Meskas tus deployable binary tsis paub txog cov ntaub ntawv txhua huvsi simplicity.

Taw qhia:
Apache ntsaum yog ib tug muaj generic uas. Lub npe NTSAUM stands abbreviated rau 'Lwm zoo huv si Tool'. No uas zoo rau lub chaw tso dej 'Tsim' hauv UNIX tab sis yog DVR siv Java. Nws yog neeg siv lub binaries ntawm ib java raws li qhov chaws lub tsev thiab deploying tus binary generated rau ib tus neeg neeg rau zaub mov tshiab uas yog predefined. Nws kuj siv tau ua kom muaj javadocs rau lub chaws puag thiab coj lub tsev kuaj suite rau lub codebase tseem. Ntsaum nrog JUNIT pab tsim tawm los ua raws li txoj kev kuaj no uas tau tsim kev tsav.

Ntsaum yuav tsum tau Java compiler yuav muab ntsia tau nrog lub chaw kuj sib txawv thiab JAVA_HOME nrog rau nws cov hauj lwm tus nqi teev. Ntsaum siv ib XML tej ntaub ntawv los txhais tau cov muaj kev. Lub neej ntawd npe ntawm cov ntaub ntawv no yog build.xml. Ib co developers kuj siv lub zog ua ntaub ntawv thov namely build.properties txhais tau ib co khoom e.g. muaj pes tsawg version thiab lwm yam tsis muaj tej uas yuav tsum tau hloov txij ua ke mus ua ke raws li qhov yuav tsum tau.

Plahaum:
FEDORA: Nyob RHEL, NTSAUM yuav muab ntsia tau siv cov kev hais kom ua – yum nruab ntsaum los nws yuav muab ntsia tau siv lub rpm – kuv hais kom ua. Qhov no koj yuav tsum download tau tus ntsaum nws ua ntej.

DEBIAN: Nyob Ubuntu, NTSAUM yuav muab ntsia tau siv qhov hais kom ua – apt-mus nruab ntsaum.

Qhov rais: Ntawm ib puas ncig qhov rais peb yuav tsum download tau lub ant_<VERSION_NO>.cov ntaub ntawv zauv teb. No lub nras zauv teb yuav tsum tau muab rho tawm hauv lub ceev. Nplaub tshev no yuav tsum muab txhais tias yog ib qho chaw kuj sib txawv thiab ANT_HOME.

Muaj ntaub ntawv coj mus kuaj build.xml yog muaj raws li:

QHIA 1: Qauv ntaub ntawv build.xml

[Chaws]

<?xml version =”1.0″?>

<lub npe yog ib qhov =”Ntsaum-xeem” vim =”ntsiab” basedir =”.”>

<!– Teev tus nqi uas pub siv tau. –>

<!– Cov nqi rau ib yam khoom yog accessed ntawm ${} –>

<lub npe ntawm tus kheej =”src.dir” qhov chaw =”src” />

<lub npe ntawm tus kheej =”build.dir” qhov chaw =”rau hauv” />

<lub npe ntawm tus kheej =”dist.dir” qhov chaw =”dist” />

<lub npe ntawm tus kheej =”docs.dir” qhov chaw =”docs” />

<!– Deletes tus muaj ib, docs thiab dist ntawv–>

<lub npe phiaj =”ntxuav”>

<rho tawm dir =”${build.dir}” />

<rho tawm dir =”${docs.dir}” />

<rho tawm dir =”${dist.dir}” />

</phiaj>

<!– Ib qho ntawm cov muaj, docs thiab dist ntawv–>

<lub npe phiaj =”makedir”>

<mkdir dir =”${build.dir}” />

<mkdir dir =”${docs.dir}” />

<mkdir dir =”${dist.dir}” />

</phiaj>

<!– Compiles lub java chaws (nrog rau cov kev pab ntawm cov tsev qiv ntawv rau JUnit –>

<lub npe phiaj =”compile” yog nyob =”ntxuav, makedir”>

<javac srcdir =”${src.dir}” destdir =”${build.dir}”>

</javac>

</phiaj>

<!– Ib qho kev Javadoc –>

<lub npe phiaj =”docs” yog nyob =”compile”>

<javadoc packagenames =”src” sourcepath =”${src.dir}” destdir =”${docs.dir}”>

<!– Txhais cov ntaub ntawv twg yog cov uas / directory yuav tsum tau tso, peb txheej –>

<fileset dir =”${src.dir}”>

<xws li lub npe =”**” />

</fileset>

</javadoc>

</phiaj>

<!–Ib qho kev deployable thawv ntawv –>

<lub npe phiaj =”hwj iav” yog nyob =”compile”>

<rag destfile =”${dist.dir}\in.kolkalta.build.test.ant.jar” basedir =”${build.dir}”>

<manifest>

<lub npe attribute =”Main kawm” tus nqi =”ntsuam xyuas. Main” />

</manifest>

</hwj iav>

</phiaj>

<lub npe phiaj =”ntsiab” yog nyob =”compile, hwj iav, docs”>

<hauj lwm lawm>Hom loj</hauj lwm lawm>

</phiaj>

</yog ib qhov>

[/Chaws]

Automation siv NTSAUM:
Ntsaum qhia ib pab loj java developers. Yuav luag txhua java tsim tawm yuav nyiam muaj ib tsab ntawv uas tau saib xyuas khiav kuaj chav tsev thiab npaj lub binary tis tej ntaub ntawv uas yuav tsum deployed tus neeg rau zaub mov hauv tsab ntawv teev npe. Ntsaum thiab muab txoj kev khiav scripts suab uas yuav siv los ua kev kuaj chav tsev nyob rau ib qhov chaws puag. Yog li, Nws muab kev pab rau cov uas siv tau txoj kev kuaj no uas tau tsim kev tsav developers. Raws li peb paub hauv kuaj uas tau kev loj hlob vib this JUNIT tsav yog ib tug compulsion, Nws yog ib qho kom zoo dua nws yog tias peb muaj ib tsab ntawv xovtooj kaw lus uas sau tag nrho cov junit kuaj tus neeg mob nyob mus ib. Tsis zoo xwb tias tsab ntawv no tseem siv tau yog muaj peb muaj ib cov e.g nruam xws li tooled. Hudson. Peb coj cai nram qab no illustrates siv NTSAUM nrog JUNIT.

QHIA 2: Muaj ntaub ntawv coj mus kuaj java

[Chaws]

pob com.Home.junit;

pej xeem hoob SampleAdd {

pej xeem rau cov menyuam ntxiv(rau cov menyuam x, rau cov menyuam y) {

rov qab mus x + y;

}

}

[/Chaws]

QHIA 3: JUNIT ntawv coj

[Chaws]

pob com.home.junit;

ntshuam org.junit.After;

ntshuam org.junit.Assert;

ntshuam org.junit.Before;

ntshuam org.junit.Test;

tsev kawm SampleAddTest {

lwm yam SampleAdd sampleClass;

@Before

pej xeem tsis muaj dabtsis teeb() {

sampleClass = SampleAdd tshiab();

}

@Test

pej xeem tsis muaj dabtsis testAdd() {

Assert.assertEquals(5, sampleClass.add(3, 2));

}

@After

pej xeem tsis muaj dabtsis settleDown() {

sampleClass = thov;

}

}

[/Chaws]

QHIA 4: NTSAUM tsab ntawv rau compile thiab khiav txoj kev kuaj no JUNIT

[Chaws]

<?xml version =”1.0″?>

<lub npe yog ib qhov =”JUNIT” vim =”ntsiab” basedir =”..”>

<!– Teev tus nqi uas pub siv tau. –>

<!– Cov nqi rau ib yam khoom yog accessed ntawm ${} –>

<lub npe ntawm tus kheej =”src.dir” qhov chaw =”src” />

<lub npe ntawm tus kheej =”test.dir” qhov chaw =”soj ntsuam” />

<lub npe ntawm tus kheej =”build.dir” qhov chaw =”rau hauv” />

<lub npe ntawm tus kheej =”build.test.dir” qhov chaw =”rau hauv/kev ntsuam xyuas” />

<!– Zog siv rau JUnit testin –>

<lub npe ntawm tus kheej =”test.report.dir” qhov chaw =”testreport” />

<!– Txhais tau cov classpath uas muaj cov junit.jar thiab cov kev kawm tom qab compiling–>

<kev daim id =”junit.class.path”>

<qhov chaw pathelement =”lib/junit-4.11.jar” />

<qhov chaw pathelement =”lib/hamcrest-Core-1.3.jar” />

<qhov chaw pathelement =”${build.dir}” />

</kab>

<!– Deletes tus muaj ib, docs thiab dist ntawv–>

<lub npe phiaj =”ntxuav”>

<rho tawm dir =”${build.dir}” />

<rho tawm dir =”${test.report.dir}” />

</phiaj>

<!– Ib qho ntawm cov muaj, docs thiab dist ntawv–>

<lub npe phiaj =”makedir”>

<mkdir dir =”${build.dir}” />

<mkdir dir =”${build.test.dir}” />

<mkdir dir =”${test.report.dir}” />

</phiaj>

<!– Compiles lub java chaws (nrog rau cov kev pab ntawm cov tsev qiv ntawv rau JUnit –>

<lub npe phiaj =”compile” yog nyob =”ntxuav, makedir”>

<javac srcdir =”${src.dir}” destdir =”${build.dir}”>

<classpath refid =”junit.class.path” />

</javac>

<javac srcdir =”${test.dir}” destdir =”${build.test.dir}”>

<classpath refid =”junit.class.path” />

</javac>

</phiaj>

<!– Khiav kev tshuaj ntsuam JUnit –>

<!– Rau cov zis yog XML, yuav hais tau dawb–>

<lub npe phiaj =”junit” yog nyob =”compile”>

<junit printsummary =”rau” diav rawg =”tseeb” haltonfailure =”muaj”>

<classpath refid =”junit.class.path” />

<classpath>

<qhov chaw pathelement =”${build.test.dir}”/>

</classpath>

<formatter yam =”xml” />

<batchtest todir =”${test.report.dir}”>

<fileset dir =”${test.dir}”>

<xws li lub npe =”**/*Test*.java” />

</fileset>

</batchtest>

</junit>

</phiaj>

<lub npe phiaj =”ntsiab” yog nyob =”compile, junit”>

<hauj lwm lawm>Hom loj</hauj lwm lawm>

</phiaj>

</yog ib qhov>

[/Chaws]

Thaum peb khiav tsab ntawv no, nws xub compile chaws puag thiab mam li sau junit kev ntsuam xyuas rau ntawm qhov chaws compiled thiab generates ib daim ntawv qhia txog kev kuaj thaum kawg. Qhov no qhia tau generated hom ntawv twg. Zoojyim rau peb muaj generated no hom ntawv XML.

QHIA 5: Tus Generated ntsuam xyuas daim ntawv qhia txog hom ntawv XML

[Chaws]

<?xml version =”1.0″ encoding =”UTF-8″?>

-<testsuite timestamp =”2013-10-26T18:52:45″ lub sij hawm =”0.077″ kev tshuaj ntsuam =”1″ lub npe =”com.home.junit.SampleAddTest” hostname =”INDTAPPL132-001″ failures =”0″ kom raug =”0″>-<khoom><lub npe ntawm tus kheej =”java.vendor” tus nqi =”Oracle Corporation”/><lub npe ntawm tus kheej =”Sun.java.launcher” tus nqi =”SUN_STANDARD”/><lub npe ntawm tus kheej =”eclipse.pdebuild.templates” tus nqi =”/F:/Utpal/Softs/Softs/eclipse-java-indigo-win32/eclipse/plugins/org.eclipse.pde.build_3.7.0.v20110512-1320/templates/”/><lub npe ntawm tus kheej =”Sun.Management.compiler” tus nqi =”HotSpot kev Compiler”/><lub npe ntawm tus kheej =”os.name” tus nqi =”Qhov rai 7″/><lub npe ntawm tus kheej =”Sun.boot.class.path” tus nqi =”C:\Qhov kev pab cuam FilesJavajre7libresources.jar;C:\Qhov kev pab cuam FilesJavajre7librt.jar;C:\Qhov kev pab cuam FilesJavajre7libsunrsasign.jar;C:\Qhov kev pab cuam FilesJavajre7libjsse.jar;C:\Qhov kev pab cuam FilesJavajre7libjce.jar;C:\Qhov kev pab cuam FilesJavajre7libcharsets.jar;C:\Qhov kev pab cuam FilesJavajre7libjfr.jar;C:\Qhov kev pab cuam FilesJavajre7classes”/><lub npe ntawm tus kheej =”Sun.desktop” tus nqi =”qhov rais”/><lub npe ntawm tus kheej =”java.vm.specification.vendor” tus nqi =”Oracle Corporation”/><lub npe ntawm tus kheej =”ant.Home” tus nqi =”F:\UtpalSoftsSoftseclipse-java-indigo-win32eclipsepluginsorg.apache.ant_1.8.2.v20110505-1300″/><lub npe ntawm tus kheej =”java.runtime.Version” tus nqi =”1.7.0_45-b18″/><lub npe ntawm tus kheej =”user.name” tus nqi =”utpalb”/><lub npe ntawm tus kheej =”build.dir” tus nqi =”F:\WorkRnDSpaceJunitbin”/><lub npe ntawm tus kheej =”user.Language” tus nqi =”• siv cov mis”/><lub npe ntawm tus kheej =”test.report.dir” tus nqi =”F:\WorkRnDSpaceJunittestreport”/><lub npe ntawm tus kheej =”Sun.boot.Library.path” tus nqi =”C:\Qhov kev pab cuam FilesJavajre7bin”/><lub npe ntawm tus kheej =”ant.Project.default-phiaj” tus nqi =”ntsiab”/><lub npe ntawm tus kheej =”ant.Project.name” tus nqi =”JUNIT”/><lub npe ntawm tus kheej =”java.Version” tus nqi =”1.7.0_45″/><lub npe ntawm tus kheej =”user.timezone” tus nqi =””/><lub npe ntawm tus kheej =”Sun.Arch.data.Model” tus nqi =”32″/><lub npe ntawm tus kheej =”java.endorsed.dirs” tus nqi =”C:\Qhov kev pab cuam FilesJavajre7libendorsed”/><lub npe ntawm tus kheej =”Sun.cpu.isalist” tus nqi =”pentium_pro mmx pentium_pro pentium mmx pentium i486 i386 i86″/><lub npe ntawm tus kheej =”Sun.jnu.encoding” tus nqi =”Cp1252″/><lub npe ntawm tus kheej =”File.encoding.pkg” tus nqi =”Sun.io”/><lub npe ntawm tus kheej =”File.separator” tus nqi =”\”/><lub npe ntawm tus kheej =”java.specification.name” tus nqi =”Java Platform API Specification”/><lub npe ntawm tus kheej =”java.class.Version” tus nqi =”51.0″/><lub npe ntawm tus kheej =”user.Country” tus nqi =”PEB”/><lub npe ntawm tus kheej =”java.Home” tus nqi =”C:\Qhov kev pab cuam FilesJavajre7″/><lub npe ntawm tus kheej =”java.vm.info” tus nqi =”mixed hom, sib koom”/><lub npe ntawm tus kheej =”ant.File” tus nqi =”F:\WorkRnDSpaceJunitbuildbuild.xml”/><lub npe ntawm tus kheej =”os.Version” tus nqi =”6.1″/><lub npe ntawm tus kheej =”path.separator” tus nqi =”;”/><lub npe ntawm tus kheej =”java.vm.Version” tus nqi =”24.45-b08″/><lub npe ntawm tus kheej =”user.variant” tus nqi =””/><lub npe ntawm tus kheej =”ant.Library.dir” tus nqi =”F:\UtpalSoftsSoftseclipse-java-indigo-win32eclipsepluginsorg.apache.ant_1.8.2.v20110505-1300lib”/><lub npe ntawm tus kheej =”java.awt.printerjob” tus nqi =”sun.awt.windows.WPrinterJob”/><lub npe ntawm tus kheej =”Sun.io.unicode.encoding” tus nqi =”UnicodeLittle”/><lub npe ntawm tus kheej =”ant.file.type.JUNIT” tus nqi =”cov ntaub ntawv”/><lub npe ntawm tus kheej =”awt.toolkit” tus nqi =”sun.awt.windows.WToolkit”/><lub npe ntawm tus kheej =”user.Script” tus nqi =””/><lub npe ntawm tus kheej =”ant.file.JUNIT” tus nqi =”F:\WorkRnDSpaceJunitbuildbuild.xml”/><lub npe ntawm tus kheej =”eclipse.pdebuild.scripts” tus nqi =”/F:/Utpal/Softs/Softs/eclipse-java-indigo-win32/eclipse/plugins/org.eclipse.pde.build_3.7.0.v20110512-1320/scripts/”/><lub npe ntawm tus kheej =”user.Home” tus nqi =”C:\Usersutpalb”/><lub npe ntawm tus kheej =”java.specification.vendor” tus nqi =”Oracle Corporation”/><lub npe ntawm tus kheej =”test.dir” tus nqi =”F:\WorkRnDSpaceJunittests”/><lub npe ntawm tus kheej =”java.Library.path” tus nqi =”C:\Qhov kev pab cuam FilesJavajre7bin;C:\WindowsSunJavabin;C:\Windowssystem32;C:\Qhov rais;C:/Qhov kev pab cuam ntaub ntawv/Java/jre7/rau hauv/kev;C:/Qhov kev pab cuam ntaub ntawv/Java/jre7/rau hauv;C:/Qhov kev pab cuam ntaub ntawv/Java/jre7/lib/i386;C:\Windowssystem32;C:\Qhov rais;C:\WindowsSystem32Wbem;C:\WindowsSystem32WindowsPowerShellv1.0;C:\Qhov kev pab cuam FilesJavajdk1.6.0_10bin;E:\apache-ant-1.8.2-binapache-ant-1.8.2bin;C:\Kev FilesLiquid TechnologiesLiquid XML Studio 2011XmlDataBinder9Redist9cppwin32bin;C:\Qhov kev pab cuam FilesTortoiseSVNbin;E:\Qhov kev pab cuam FilesAndroidandroid-sdkplatform-cuab yeej;E:\Qhov kev pab cuam FilesAndroidandroid-sdktools;C:\Qhov kev pab cuam FilesQuickTimeQTSystem;D:\SunAppServerbin;9;F:\UtpalSoftsSoftseclipse-java-indigo-win32eclipse;;.”/><lub npe ntawm tus kheej =”java.vendor.url” tus nqi =”http://java.oracle.com/”/><lub npe ntawm tus kheej =”java.vm.vendor” tus nqi =”Oracle Corporation”/><lub npe ntawm tus kheej =”java.runtime.name” tus nqi =”Java(QHIA NTXIV TXOG) SE Runtime ib puag ncig”/><lub npe ntawm tus kheej =”Sun.java.command” tus nqi =”org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner com.home.junit.SampleAddTest filtertrace = haltOnError tseeb = haltOnFailure cuav = tseeb formatter=org.apache.tools.ant.taskdefs.optional.junit.SummaryJUnitResultFormatter showoutput = outputtoformatters cuav = tiag logfailedtests = logtestlistenerevents tiag = formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter cuav,F:\WorkRnDSpaceJunittestreportTEST-com.Home.junit.SampleAddTest.xml crashfile = F:\WorkRnDSpaceJunitjunitvmwatcher6288340937110531134.properties propsfile = F:\WorkRnDSpaceJunitjunit7583515827572177542.properties”/><lub npe ntawm tus kheej =”java.class.path” tus nqi =”F:\WorkRnDSpaceJunitlibjunit-4.11.jar;F:\WorkRnDSpaceJunitlibhamcrest-Core-1.3.jar;F:\WorkRnDSpaceJunitbin;F:\WorkRnDSpaceJunitbintests;F:\WorkRnDSpaceJunit;C:\Qhov kev pab cuam FilesJavajdk1.6.0_10jrelibrt.jar;F:\UtpalSoftsSoftseclipse-java-indigo-win32eclipsepluginsorg.apache.ant_1.8.2.v20110505-1300libant-launcher.jar;F:\UtpalSoftsSoftseclipse-java-indigo-win32eclipsepluginsorg.apache.ant_1.8.2.v20110505-1300libant.jar;F:\UtpalSoftsSoftseclipse-java-indigo-win32eclipsepluginsorg.apache.ant_1.8.2.v20110505-1300libant-junit.jar;F:\UtpalSoftsSoftseclipse-java-indigo-win32eclipsepluginsorg.apache.ant_1.8.2.v20110505-1300libant-junit4.jar”/><lub npe ntawm tus kheej =”ant.Version” tus nqi =”Apache ntsaum(QHIA NTXIV TXOG) Version 1.8.2 compiled rau hlis ntuj nqeg 20 2010″/><lub npe ntawm tus kheej =”java.vm.specification.name” tus nqi =”Java tshuab Virtual Specification”/><lub npe ntawm tus kheej =”java.vm.specification.Version” tus nqi =”1.7″/><lub npe ntawm tus kheej =”Sun.cpu.endian” tus nqi =”me ntsis”/><lub npe ntawm tus kheej =”Sun.os.patch.level” tus nqi =”Service pob 1″/><lub npe ntawm tus kheej =”eclipse.pdebuild.Home” tus nqi =”/F:/Utpal/Softs/Softs/eclipse-java-indigo-win32/eclipse/plugins/org.eclipse.pde.build_3.7.0.v20110512-1320/./”/><lub npe ntawm tus kheej =”java.io.tmpdir” tus nqi =”C:\UsersutpalbAppDataLocalTemp”/><lub npe ntawm tus kheej =”java.vendor.url.bug” tus nqi =”http://bugreport.Sun.com/bugreport/”/><lub npe ntawm tus kheej =”os.Arch” tus nqi =”x 86″/><lub npe ntawm tus kheej =”java.awt.graphicsenv” tus nqi =”sun.awt.Win32GraphicsEnvironment”/><lub npe ntawm tus kheej =”java.Ext.dirs” tus nqi =”C:\Qhov kev pab cuam FilesJavajre7libext;C:\WindowsSunJavalibext”/><lub npe ntawm tus kheej =”user.dir” tus nqi =”F:\WorkRnDSpaceJunitbuild”/><lub npe ntawm tus kheej =”build.test.dir” tus nqi =”F:\WorkRnDSpaceJunitbintests”/><lub npe ntawm tus kheej =”line.separator” tus nqi =” “/><lub npe ntawm tus kheej =”java.vm.name” tus nqi =”Java HotSpot(QHIA NTXIV TXOG) Nyob hauv kev pab VM”/><lub npe ntawm tus kheej =”basedir” tus nqi =”F:\WorkRnDSpaceJunit”/><lub npe ntawm tus kheej =”ant.java.Version” tus nqi =”1.7″/><lub npe ntawm tus kheej =”ant.Core.lib” tus nqi =”F:\UtpalSoftsSoftseclipse-java-indigo-win32eclipsepluginsorg.apache.ant_1.8.2.v20110505-1300libant.jar”/><lub npe ntawm tus kheej =”File.encoding” tus nqi =”Cp1252″/><lub npe ntawm tus kheej =”java.specification.Version” tus nqi =”1.7″/><lub npe ntawm tus kheej =”src.dir” tus nqi =”F:\WorkRnDSpaceJunitsrc”/><lub npe ntawm tus kheej =”ant.Project.invoked-le lub hom phaj” tus nqi =”ntsiab”/></khoom><lub sij hawm testcase =”0.003″ lub npe =”testAdd” classname =”com.home.junit.SampleAddTest”/>-<lawv tawm>

<![CDATA[]]>

</lawv tawm>-<ua yuam kev lawv>

<![CDATA[]]>

</ua yuam kev lawv></testsuite>

[/Chaws]

Xaus:

  • NTSAUM APACHE ib java raws li cov dej siv los ntawm lub Java developers rau qhov laj thawj nram no
    • Yuav ua kom muaj tus binaries ntawm lub qhov chaws
    • Meskas javadocs rau ntawm qhov chaws
    • Khiav JUNIT mus tus neeg mob nyob ib qhov chaws puag
  • NTSAUM nrog JUNIT, pab java developers raws nraim li lub xeem uas tau tsav Development vib this

 

Tagged: , ,
============================================= ============================================== Yuav zoo TechAlpine phau ntawv rau Amazon
============================================== ---------------------------------------------------------------- electrician ct chestnutelectric
error

Txaus siab rau qhov blog? Tshaj tawm lus thov :)

Follow by Email
LinkedIn
LinkedIn
Share