国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

企業(yè)應(yīng)用級(jí)別的Ant模組編譯環(huán)境

2019-11-18 12:53:47
字體:
供稿:網(wǎng)友

  編譯環(huán)境對(duì)于今日的java企業(yè)級(jí)應(yīng)用程序來說,越來越難于治理了。堆積如山的代碼,配置文件,以及對(duì)第三方的依靠(third-party dependencies)都使得治理編譯環(huán)境變得困難。
  
  簡(jiǎn)而言之,我們勉強(qiáng)接受那種把所有的源代碼放在一個(gè)根目錄下,所有的配置文件放在另一個(gè)根目錄下,而第三方類庫也這樣處理的做法。但是企業(yè)級(jí)編譯環(huán)境很少這么做。今日的企業(yè)級(jí)Java項(xiàng)目,在結(jié)構(gòu),功能,以及組織上都很復(fù)雜。它們通常都有大量的源代碼和支持資源(屬性文件,圖片,等等。編者注:原文為supporting artifacts,直譯為支持物件,但這里根據(jù)上下文意譯為支持資源較妥)要去治理。有這么多的東西去治理,當(dāng)一個(gè)開發(fā)團(tuán)隊(duì)試圖去建立一個(gè)優(yōu)化的編譯方案時(shí),他們經(jīng)常感到困惑和挫敗。
  
  假如,不管這個(gè)項(xiàng)目有多大,我們的編譯環(huán)境都能夠在統(tǒng)一的構(gòu)架中簡(jiǎn)潔地處理我們所有的源代碼,事情是不是會(huì)變得好一些呢?本文將展示一個(gè)Ant編譯環(huán)境的例子,它來自我對(duì)多年來的多個(gè)項(xiàng)目的經(jīng)驗(yàn)的修改。此時(shí)此地,它或許不是最好的方案,但是它的確經(jīng)歷了時(shí)間的考驗(yàn),也一定會(huì)幫助你建立并運(yùn)行在大多數(shù)項(xiàng)目上,不管是大是小。
  
  警告
  
  先就一些問題說明一下,這樣你就不會(huì)讀完了這篇文章才發(fā)現(xiàn)它對(duì)你沒有任何價(jià)值:
  
  · 本文基于對(duì)Ant的了解。它是針對(duì)那些會(huì)用并喜歡Ant的讀者的。
  
  · 這里所說的編譯環(huán)境是指模組(modular)和模塊(module),而模塊又是由目錄和子目錄來定義的。(譯者注:模組modular是模塊module的集合。它由多個(gè)獨(dú)立的模塊構(gòu)成。)這意味著文件和源代碼被存放在許多不同的目錄中。因此,假如你使用類似Eclipse或IntelliJ Idea這種可以幫你治理類和文件的位置的IDE工具的話,本文對(duì)你會(huì)更加有益。當(dāng)然,你也可以使用文本編譯器,但是恐怕你會(huì)發(fā)現(xiàn)你頻頻地在多棵“目錄樹”上爬上爬下。
  
  概念
  
  首先,讓我們來談及掉隱藏在編譯環(huán)境之后的幾個(gè)核心概念。它們是模組,層級(jí)結(jié)構(gòu)(hierarchical),和資源驅(qū)動(dòng)(artifact-driven)。它們確切的含義又是什么呢?
  
  模組
  
  模組編譯是指圍繞軟件模塊來進(jìn)行組織的一種編譯方式。一個(gè)模塊是一個(gè)邏輯的,集合的,功能性單元,對(duì)應(yīng)于系統(tǒng)中的一個(gè)特性。對(duì)于編譯環(huán)境而言,一個(gè)模塊表現(xiàn)為源代碼和配置文件的一個(gè)自我包含集合(self-contained collection),這些源代碼和配置文件用來構(gòu)建表現(xiàn)了模塊所對(duì)應(yīng)的那個(gè)命名特性的軟件。它幾乎和你修訂控制系統(tǒng)(RCS:Revision Control System)(例如CVS或者Subversion)中的目錄樹是一一對(duì)應(yīng)的。舉幾個(gè)例子:security, administration, wiki, email都可以是一個(gè)模塊。
  
  層級(jí)結(jié)構(gòu)
  
  層級(jí)結(jié)構(gòu)編譯是指含有分層模塊的編譯方式。也就是,對(duì)于一個(gè)模塊,它可能是由更小的,更特定的子模塊(submodule)來構(gòu)成的。
  
  假如一個(gè)模塊含有子模塊,那么它有責(zé)任保證那些子模塊以合適的方式被編譯。
  
  隨后,我們會(huì)討論例子是如何應(yīng)用層級(jí)結(jié)構(gòu)的概念來建立編譯環(huán)境的。
  
  物件驅(qū)動(dòng)
  
  物件驅(qū)動(dòng)編譯是指每個(gè)存在的模塊(module)或子模塊(submodule),都是為了產(chǎn)生一個(gè)單獨(dú)的,可部署的物件。在Java項(xiàng)目中,這些物件主要是.jar,.war,或.ear文件。在其他類型的編譯中,它們通常是二進(jìn)制可執(zhí)行文件或動(dòng)態(tài)連接庫(.dll或.so)。
  
  編譯環(huán)境的例子也是物件驅(qū)動(dòng)的,我們將會(huì)討論它是如何創(chuàng)建可部署的物件的。
  
  盡管這三個(gè)概念都很輕易理解,但結(jié)合起來用在編譯環(huán)境中的話,它們會(huì)變得非常強(qiáng)大。
  
  現(xiàn)在讓我們來看看編譯環(huán)境是如何組織的。
  
  模組結(jié)構(gòu)
  
  當(dāng)有很多要去實(shí)現(xiàn)的時(shí)候,把問題分解為若干個(gè)小的部分是個(gè)很有效的方法。我們需要一個(gè)好的分而治之(divide-and-conquer)的技術(shù)來幫助我們來治理大量的源碼。在編譯環(huán)境中創(chuàng)建編譯模塊是個(gè)好方法。
  
  我們通過在應(yīng)用程序的根目錄下創(chuàng)建一個(gè)目錄來創(chuàng)建一個(gè)模塊。這個(gè)新的目錄成為這個(gè)模塊的基礎(chǔ)。在每個(gè)模塊目錄下,我們存放與其相關(guān)的文件和源碼。
  
  這是一個(gè)示例程序的編譯環(huán)境,按照模塊來組織:
  
  appname/
  -- admin/
  -- core/
  -- db/
  -- lib/
  -- ordermgt/
  -- reports/
  -- web/
  -- build.xml
  
  下面是每個(gè)節(jié)點(diǎn)的含義:
  
  · 除了lib/ 以外的每個(gè)目錄都是一個(gè)模塊。在這個(gè)例子中,admin模塊提供了POJO的實(shí)現(xiàn),它容許某人來治理應(yīng)用(例如,創(chuàng)建用戶,授權(quán)等等)。同樣的,reports模塊中,有能夠產(chǎn)生報(bào)告的組件的實(shí)現(xiàn)。而core 模塊中是那些在很多或全部模塊中都用到的組件,它們不是真正地和系統(tǒng)的某個(gè)功能相聯(lián)系。(例如,StringUtil 類)通常,其他地所有模塊都會(huì)依靠核心(core)模塊。
  
  其他模塊與admin, reports, 及core模塊一樣:他們有著各自的自包含的系統(tǒng)功能,并與其他模塊區(qū)別開來。此外,由于我們的范例應(yīng)用可以支持基于web的交互,我們還可以有一個(gè)web模塊,包含了用以創(chuàng)建一個(gè).war文件所需要的一切內(nèi)容。
  
  · lib/ 目錄比較非凡。它含有應(yīng)用程序編譯或運(yùn)行所需地所有第三方.jars文件。我們把其他模塊所需的所有第三方.jars文件放在這個(gè)目錄中,而不是它們自己的模塊中。原因如下:
  
  1. 在一個(gè)地方更便于治理對(duì)第三方的依靠(third-party dependencies)。可以在一個(gè)模塊的build.xml 文件中,利用Ant的<path> 語句來定義改模塊是否使用這些庫文件。
  
  2. 通過排除重復(fù).jars文件的可能性,從而避免了裝載類或API的版本沖突。假如有不止一個(gè)模塊使用了一個(gè)負(fù)責(zé)存儲(chǔ)commons-logging.jar文件的Jakarta Commons Logging模塊,會(huì)發(fā)生什么情況?假設(shè)每個(gè)模塊都持有Jakarta Commons Logging模塊的備份,這樣就會(huì)有一個(gè)潛在的問題――一個(gè)模塊所持有的備份和另外一個(gè)模塊所持有的版本不同。當(dāng)應(yīng)用程序開始運(yùn)行,只有第一個(gè)在classpath上找到的.jar文件被載入以滿足所需,這就潛在地引起了與其他模塊的沖突。我們通過在根目錄下只持有一個(gè).jar文件來避免這種沖突。
  
  3. 對(duì)第三方的依靠隨你的源碼改變版本。瀏覽很多項(xiàng)目,會(huì)發(fā)現(xiàn),這是你想把你所依靠的庫文件放在CVS上的最重要原因。通過這樣做,你能確保,無論你從CVS上導(dǎo)出的是那個(gè)版本或那個(gè)分支的軟件,你都能找到第三方類庫的合適版本來支持你的軟件的特定版本。
  
  · 根build.xml 文件是主要的治理文件。它知道為了編譯每個(gè)模塊,什么文件和目標(biāo)(target:譯者注,應(yīng)該是<target>,是Ant中的一個(gè)語句)是必須的。然后,由模塊來保證這些物件(artifact)被正確的編譯。
  
  例如,假設(shè)一個(gè)項(xiàng)目正在編譯,現(xiàn)在是編譯ordermgt 模塊的時(shí)候了,根編譯文件(root build file)應(yīng)該知道,去調(diào)用ordermgt/build.xml 文件中一個(gè)Ant任務(wù)來完成這編譯。而ordermgt/build.xml 文件應(yīng)該確切的知道要編譯生成ordermgt .jar 文件需要些什么。而且,假如整個(gè)項(xiàng)目被編譯并合并入一個(gè).ear文件,這個(gè)根build.xml 文件應(yīng)該知道如何去構(gòu)建。
  
  根build.xml 文件是怎么知道要去編譯一個(gè)模塊并且以何種順序來編譯的呢?下面是一個(gè)Ant XML文件的一部分,它顯示了build.xml文件是如何完成設(shè)定的目標(biāo)的:
  
  <!-- =========================================   Template target. Never called eXPlicitly,   only used to pass calls to underlying   children modules.   ========================================= --> <target name="template" depends="init">  <-- Define the modules and the order in which     they are executed for any given target.     This means _order matters_. Any     dependencies that are to be satisfied by    one module for another must be declared     in the order the dependencies occur. -->  <echo>Executing "${target}" /       target for the core module...</echo>  <ant target="${target}" dir="core"/>  <echo>Executing "${target}" /      target for the admin module...</echo>  <ant target="${target}" dir="admin"/>  ...</target>
  
  無論根build.xml 文件調(diào)用了哪個(gè)編譯目標(biāo),都由這個(gè)template 目標(biāo)負(fù)責(zé)以一定的順序傳遞給相應(yīng)的子模塊。例如,假如我們想要清理整個(gè)工程,我們應(yīng)該只需在工程的根部調(diào)用clean 目標(biāo)即可,然后下面的任務(wù)將被執(zhí)行:
  
  <!-- =========================================   Clean all modules.   ========================================= --><target name="clean" depends="init">  <echo>Cleaning all builds"</echo>  <antcall target="template">    <param name="target" value="clean"/>  </antcall></target>
  
  根build.xml 文件通過直接調(diào)用template 目標(biāo)來間接地實(shí)現(xiàn)調(diào)用clean 目標(biāo),從而保證了所有模塊都被清理。
  
  上面的模塊組織和相關(guān)的編譯目標(biāo)真地使治理源碼和編譯變得更輕易了。這種結(jié)構(gòu)有助于你更快,更輕易地找到你想要的源碼。而template 目標(biāo)負(fù)責(zé)治理任務(wù)是如何執(zhí)行的。
  
  但模塊結(jié)構(gòu)最出色的部分是這里:
  
  在完成了整個(gè)工程的完整編譯后,可以對(duì)任何模塊進(jìn)行獨(dú)立的編譯。只要在命令行中切換到該模塊目錄下,并執(zhí)行:
  
  > ant target

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 长宁区| 中江县| 黎川县| 定边县| 兴城市| 张家界市| 尚义县| 墨竹工卡县| 自治县| 老河口市| 南城县| 来宾市| 丹寨县| 南澳县| 内黄县| 敦化市| 绍兴市| 扶沟县| 天台县| 广昌县| 马龙县| 乌拉特前旗| 读书| 龙游县| 邹城市| 江孜县| 上杭县| 松潘县| 久治县| 江源县| 南投县| 定边县| 舞钢市| 拉萨市| 龙陵县| 沁水县| 伊川县| 金溪县| 临江市| 赣州市| 南郑县|