天天看點

在 Eclipse 中使用 Maven

Maven 将作為一個普通的建構系統,被人們重新認識,并且它将超越 Java™ 技術。本文不打算成為一篇 Maven 教程,而是将 Maven 與其他技術進行比較,讓您洞察 Maven 與 Eclipse 相适應的地方,以及如何使這些工具互相協作。

在過去幾年中,Maven 已經不僅僅是 Java 世界的一個時髦話題。自 2001 年起,Maven 已經成為建構工具領域的先驅。最近幾年,人們常拿它與 Ant 比較。因為 Maven 與 Ant 有一些顯而易見的相似之處,是以拿它們倆作比較似乎是很自然的事。比如說,在兩種情況下,XML 腳本都是可用的;兩種工具都可以生産工件;它們還可以共享相同的分類法和概念,比如 項目(project)、目标(target)與 目标(goal),以及 依賴關系(depends) 和 先決條件(prereqs)。但它們實質上有很大的差别。Ant 隻是一個 XML 腳本工具,而 Maven 是一個普通的建構工具,它關注的重點是一個叫做項目對象模型(POM)的概念。POM 暴露的是粗粒度的、面向建構的任務,這些任務被稱為目标,它們提供了一些準則,幫助您開發建構方法和實作最佳實踐。

在某些方面,Maven 屬于軟體工廠 工具家族(參閱 參考資料),盡管目前它仍在外圍。更确切地說,諸如 Maven 之類的建構工具是軟體工廠領域中必不可少的。

軟體工廠

通過顯著提高自動開發的級别,軟體工廠提供了一個花費更少、更靈活的應用程式開發方法。根據 Software Factories Web 站點的說法,“軟體工廠是一個軟體産品線,它根據建構特殊種類的應用程式的方法,配置一些可擴充的開發工具……提供打包的内容……以及指導”(參閱 參考資料)。軟體工廠涉及三個主要概念:

  • 模式,提供了一些中繼資料,描述組成應用程式的不同工件的結構,以及它們是如何互動的。
  • 一個或多個模闆,提供了啟動程式工具箱,以及建構應用程式所需的其他任何東西。
  • 可擴充的開發環境,用于配置、定制和裝配元件。

如今,這類工具已經逐漸引起了認識到它們的價值的那些工具制造人員、工具開發人員和軟體編輯的注意。這些工具促進了軟體開發過程的工業化,降低了投入市場的成本和時間,同時還提高了生産率,加快了對進化需求的反應。

仔細檢視一下 Maven 的主要特性,您就會認識到 Maven 與軟體工廠之間的相似之處:Maven 使用 POM 作為中繼資料來描述項目結構,并通過通用應用程式插件來獲得可擴充的項目模闆。因為 Maven 非常靈活并且是開放源碼的,是以很容易推斷和設想 Maven 是軟體工廠平台中的一個核心元件。但是,還有另一種說法。上述類比并不完全,因為目前的 Maven 缺乏專用的開發環境,而這類環境有助于建立特定于域或特定于企業的插件和模闆,并允許您輕松地配置項目或定制行為。

不過,Maven 的主要目标是标準化建構過程,并保證代碼建構-測試-部署(CBTD)循環中的品質和易再現性(easy reproducibility)。它還可以制定度量标準,幫助您了解開發狀态。CBTD 本體論在軟體工程領域已經不再新鮮,但 Maven 可以使您标準化這種本體論,并通過抽象這種理論,将它想像成一個完整的實體。考慮到不斷增長的項目的複雜性,标準化成為一種迫切需要。擴建 的概念,我們稱之為元建構,因為其無可估量的價值以及保證下一級品質的特性,正逐漸被人們認識。持續內建(continuous integration)就是建立在這個概念的基礎之上,但它也應用了在 IDE 上下文之外的地方進行建構的能力。

模糊的界限

使用過 Java 技術的人應該都聽說過 Eclipse。2001 年年中的時候,Eclipse 推出了它的第一個版本,标志其成熟的是它為內建開發環境(IDE)提供了一個機會,特别是為 Java 開發人員(不嚴謹地說)提供了一個機會。Eclipse 是一種開放的、以語言為中心的平台,也可以将它用作教育性項目和研究項目的基礎平台,其中一些平台捐贈給了 Eclipse 團體( 請參閱 參考資料)。就像 Microsoft® 已經采用軟體工廠方法一樣,Eclipse 也開始轉向模型驅動開發(MDD)方向,并且最近已經公布了一個新的項目提議 —— 模型驅動的開發內建(MDDi)。根據該提議,“Eclipse MDDi 項目專用于平台的實作……其設計目标是支援各種模組化語言(統一模組化語言或特定于域的語言)和模型驅動的技術。”

漸漸地,一些工具開始假定某些特性可以完全并且順利地內建在一起,Maven 和 Eclipse(即使作為一個簡單的 IDE)也不例外。是以,從建構的角度來看,二者似乎出現了重疊,如圖 1 所示。

圖 1. 擴建的概念

在 Eclipse 中使用 Maven

圖 1 描述的實際上是以前讨論的擴建概念。正如以前定義的那樣,整個擴建過程包括幾個任務,同時還表示了一個元建構執行個體。任務可以是以下兩種類型之一:原子任務是細粒度的,并且是上下文不明确的,這種任務的兩個執行個體幾乎是相同的;宏觀任務是複合任務,它充當微觀任務的容器。

建構,從擴充的意義上說,隻處理宏觀任務;原子任務的觸發取決于配置。這意味着使用者對系統有着較高層次的看法,這使得系統更易于維護和發展。

此外,Maven 和 Eclipse 都是開放的,并且很容易通過插件擴充它們,使其滿足您的需要。但是,因為它們針對的閱聽人不同,是以它們之間的相似性也到此為止:多數 Eclipse 最終使用者是一些開發人員;而 Maven 主要針對的是一些建構管理人員。盡管如此,Maven 仍然是一個指令行工具。雖然圖形使用者界面(GUI)是按照 Jason Van Zyl(Maven 的制造者和架構師)訓示的方向開發的,但 Maven 目前仍然沒有幫助使用者執行特殊任務的特定 GUI,比如建立或更新配置,或者隻用一個滑鼠單擊發起建構。

上面描述的典型建構順序在 Eclipse 中不像在 Maven 中那麼順利。Eclipse 的特性之一是開發 環境造成建構過程不連續,這要歸因于一些人為因素:并不是每次成功編譯之後都進行測試、所有測試沒必要一次運作、可以跳過一些微觀任務,等等。各種因素都會導緻産生差異,這就是為什麼開發人員每天至少必須運作一次完整的建構過程,以确信他們沒有破壞什麼的原因。

不過,因為 Eclipse 是一個可擴充平台,是以它受到許多使用者社群的支援,這使它成為駐留 Maven 驅動的開發、允許開發人員和建構管理人員以某種簡單的方式進行協作的理想之地。

将 Maven 內建到 Eclipse 中

Mevenide 是 Codehaus 主辦的一個項目,旨在通過将 Maven 內建到 IDE 中,簡化 Maven 的使用(參閱 參考資料)。現在,Borland Software 的 JBuilder、NetBeans 和 Eclipse 都受到支援。其他一些項目也部分地将 Maven 內建到 Eclipse 中,這樣,就可以與 Mevenide(如 Maven Workshop)共享一些特性。除了增加 Maven 的易用性之外,為什麼需要這種插件?

通過提供一些工具和視圖,讓您了解 Maven 隐藏的複雜性并改進團隊環境中的協作,Mevenide for Eclipse 提高了生産率。從協作的角度來看,假如建構已經被 Maven 化了,那麼最有用的特性就是 Eclipse 項目中繼資料與 Maven 中繼資料之間的雙向同步。如果開發人員忘記在向 Eclipse 中添加一個依賴關系之後更新 POM,那麼該怎麼辦?如果重構無法傳播到 Maven,該怎麼辦?建構可能會中斷,或者一些單元測試可能被拒絕,是以,真的需要使 Eclipse 中繼資料和 Maven 中繼資料保持同步。Mevenide 監聽中繼資料的變化,并使您能夠很容易地确定中繼資料不比對的地方,這可以防止進行被嚴重破壞的建構。

但 POM 并不隻是關于依賴關系和項目布局的。它還包含一些不用于結構上的項目管理資訊,比如版本号、名稱、ID 和源儲存庫的位置。Eclipse 中繼資料并不總是反映所有這些資訊。是以,需要另一個編輯這些資訊的方法。為此,Mevenide 提供了一個圖形編輯器,該編輯器使 POM 的維護變得更容易,并允許您避開一些煩瑣的、容易出錯的原始 XML 手工編輯。每個 POM 語義部分都被表示為一個編輯器頁,這增強了模型的整體可靠性。此外,為了最大限度地減少建立 POM 的無聊過程,Mevenide 提供了一個相當簡單的、可擴充的 POM 模闆機制。

阻止 Maven 在 Eclipse 之外的地方運作的能力是從類似 Mevenide 的插件中最容易獲得的一項功能。您可以選擇某些執行任務(用 Maven 的術語來講是 目标),這些任務可以是通過 Maven 插件全局定義的任務,也可以是依賴于項目的任務,或者,您可以通過定義建構敏感的變量來定制建構。Eclipse 控制台上隻顯示了一些相關的選項(即在 IDE 的上下文中相關),對于其他任何插件,控制台上隻輸出建構日志。這一特性非常重要,因為它避免了在控制台與 Eclipse 之間不停地來回奔波。

Mevenide 還內建了其他許多幫助方法特性,但它們不是很重要。例如,您可以定義給定目标與檔案模式之間的關系,這樣,就可以根據工作空間增加的增量來激活那些任務。您還可以浏覽工件儲存庫,或者根據名稱搜尋某個給定的工件(一個工件 就是一個建構結果,它可以是 JAR 檔案、可執行檔案或者是一個完整的 Web 站點)。然後,可以重定向到 Mevenide 站點,獲得完整的特性清單。

不過,仍然還有一個問題:即使 Mevenide 增強了生産率和易用性,但您仍然必須認識到哪些工具可以在特殊環境中滿足您的需要。通過 Maven Console 運作 Maven 會話可能非常耗時,是以,為了獲得較高的生産率,在對會話進行編碼期間,應該改為使用 JUnit 內建的 Eclipse 支援來運作測試,并依賴于 Eclipse 的内部編譯器來生成可執行的檔案。但在向源代碼儲存庫送出任何東西之前,應該確定 POM 是同步的,并復原所有不需要的 .classpath 或 .project 修改 —— 也就是說,假設這些檔案都是在源代碼控制之下,這可能是有争議的。這個話題在 Martin Van den Bemt 的 blog 中讨論過(參閱 參考資料)。

結束語

盡管 Maven 和 Eclipse 具有不同的特性,但從建構的角度看,它們在某些地方可能出現重疊。它們之間存在的對立似乎也相當多,但我們很容易克服這些,通過努力最終使它們互相協作,共創一片沃土。諸如 Mevenide 之類的工具可以使 Maven 和 Eclipse 順利合作,并使它們保持同步,但您必須認識到,在某一個給定的開發階段,哪種工具最能滿足您的需要。

盡管 Maven 作為品質保證過程中的一個重要因素,正逐漸被人們所認可,但在将它內建到開發環境(尤其是 Eclipse)中,使 Maven 成為一等 IDE 公民這一點上,還有待提高。到那時,我們就可以考慮其他的 Maven 用例,比如說,更進一步地将它內建到全局開發過程中,以及像 Eclipse 這樣的可擴充環境如何幫助實作這些內建。

本系列的下一部分将更詳細地檢視 Mevenide 的能力,以及如何使用該工具實作最佳實踐,并從 Maven 和 Eclipse 中獲得最大好處。

參考資料

  • 您可以參閱本文在 developerWorks 全球站點上的 英文原文。
  • Apache 中有許多參考文獻和許多關于 Maven 入門的資訊。那裡還提供了一些最佳實踐。
  • Software Factories: Assembling Applications with Patterns, Frameworks, Models and Tools 一文由 Jack Greenfield 等人撰寫,這篇文章深入檢視了軟體工廠,并描述了支援這些技術的一些關鍵元素。
  • Software factories Web site 為軟體工廠提供了理論基礎。
  • Eclipse.org 主辦了 Eclipse 平台項目以及其他一些技術項目。
  • First Experiments with a ModelWeaver 一文由 Jean Bezivin 等人撰寫,文中提供了由 ATLAS 團隊開發的 Model Weaver 的原型。
  • Eclipse Model Driven Development Integration (MDDi) project 專用于實作提供應用模型驅動的開發(MDD)方法所需的那些工具的平台。
  • 下載下傳 Mevenide Eclipse 插件和其他有關的 Maven 插件。
  • Maven Workshop 是一個簡單的 Eclipse 插件項目,它與 Mevenide 共享一些特性。
  • 在 Martin Van den Bemt 的 blog 中,讨論了團隊環境中的 .project/.classpath 問題。
  • “Eclipse 平台入門”(developerWorks, 2002 年 11 月)提供了 Eclipse 的曆史和概述,其中包括如何安裝 Eclipse 及其插件的細節。
  • Eclipse in Action: A Guide for Java Developers (Independent Publishers Group, 2003)是使用 Eclipse 的 Java 開發人員的必讀之物。
  • 從 DB®、Lotus®、Rational®、Tivoli® 和 WebSphere® 獲得一些評價較高的産品,然後開始建構應用程式,并在 IBM 中間件上部署它們。請選擇 Linux® 或 Windows® 版本的免費的 Software Evaluation Kit (SEK)。
  • 請參閱 developerWorks 的 開放源碼專區,從中獲得大量 how-to 資訊、工具和項目更新,幫助您使用開放源碼技術進行開發,并将這些用于 IBM 的産品。
  • 使用 IBM 試用軟體 改進您的下一個開放源碼項目,可以通過下載下傳或從 DVD 上獲得這些軟體。
  • 在 Developer Bookstore 的開放源碼專區,可以找到數百本 打折出售的關于開放源碼主題 的書籍,其中包括許多 關于 Eclipse 的書籍。
  • 通過參與 developerWorks blogs 加入 developerWorks 社群。