Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Java Build Tool course in 2011

Java Build Tool course in 2011

Ching Yi Chan

August 08, 2011
Tweet

More Decks by Ching Yi Chan

Other Decks in How-to & DIY

Transcript

  1. Java Build Tools Java Build Tools Ant & Maven Ant

    & Maven 2011, qrtt1 2011, qrtt1
  2. 關於軟體開發 • Top Down 由上至下的開發模式 – 先定義總體流程及主要類別 – 各流程的接合界面有哪些 –

    模擬整合後的運作情形 – 由整體需求出發,較不會開發出多餘的功能。 • Bottom Up 由下至上的開發模式 – 先實作可能需要用到的元件 – 依功能模組責任分工 – 最後試著整合看看 – 以功能導向出發,較易開發出精緻的功能。
  3. 關於軟體開發 • Top Down 由上至下的開發模式較適用於專案開發。對 專案來說最容易拖延進度是在最後整合的階段, Top Down 的模式,使得整合的模型在最初就形成,並且能 利用持續性整合的方式,針對每一批新增的功能做總體

    的測試,對需求而變更實作的彈性較高。 • Bottom Up 由下至上的開發模式較適於獨立的公用程式。 此種開發模式優點在於針對特定功能定義明確,往往能 發展出較精確的測試案例。 • 無論專案以何種模式進行,測試案例與測試工具的使用 都能輔助您提昇開發品質。
  4. 關於程式編譯 • 使用 IDE 編譯程式 – 便利性佳,有顯眼的錯誤、警告提醒 – 即使方便,但無法進行自動化編譯 •

    手動呼叫 Java Compiler – 使用上較為不便 – 手工處理 CLASSPATH 較易出錯 – 實務上會寫成 Script • Linux : Shell Script • Windows : .BAT
  5. Build Tool Developer OR Build Server check out build document

    library application auto testing Build Tool Version Control commit
  6. Why Ant • 因 JVM 在各平台的普及性, Java 開發者選擇的開發 平台也顯得多元化。既有的 build

    tool 多為各平台相依 的: – Linux 平台以 GNU Make 為大宗 – Windows 平台以 NMake 等 Windows SDK 提供的工具為大 宗 • 除工具的不同,還得考慮平台差異 – CLASSPATH 分隔字元: • Windows 『 ; 』 • Linux 『 : 』 – Shell/DOS 指令差異 • 刪除檔案 rm  del • Write once, run anywhere  JVM + Bytecode – 若是沒有替 Java 設計統一的編譯工具,編譯的流程難以達到 『一寫通用』
  7. Ant 的設計哲學 • 提供一個可移植性高的編譯與部署工具 – 設計必需簡單易學 • Ant 的核心模型概念只有三個:專案、執行目標、任務 –

    使用者能輕易讀懂編譯腳本 • Ant 使用已廣為人知道 XML 作為腳本語言 – 工具必需能夠讓使用者擴充 • Ant 提供擴充 API 讓進階使用者能擴充新功能
  8. Ant build file = 1 個專案的 Build Script <project> <target

    1> <target 2> <target N> Task Task Task Task Task Task
  9. Ant 的學習技巧 • Ant 是一個指令工具 – 初學時,多瀏覽 Ant 手冊與常用 Task

    • http://ant.apache.org/manual/ – 將常用的指令參數,使用慣例寫成 CheatSheet ( 小抄 ) – 蒐集工作上常用的 Task 範例 • <javac> • <jar> • <ftp> • <cvs> – 使用 IDE 輔助學習 • Eclipse 或 NetBeans 都能加速您編寫 Build Script 的時間
  10. Ant In Daily • 專案內有個 config 目錄,並且包含 二個子目錄 – dev

    – prod • 我們期望一般開發時,程式編譯是使 用 dev 目錄內的設定檔;當要編譯 正式環境版本時,要改用 prod 目錄 的設定檔
  11. Ant In Daily • IDE 難以切換不同情境的編譯: – 正式環境版本 – 開發環境版本

    • 依賴『手工』容易出錯 – 複製檔案 – 改寫設定檔 • 『在我的電腦上,跑起來沒問題啊!』 • 『一定是你的電腦怪怪的!』 正式版 開發版
  12. Ant In Daily • IDE 難以選用不同的 Library 版本 – 依賴人工操作

    UI 來替換不同的 Library – 使用 Ant 能透過參數化,在編譯時決定要 使用的版本。 • 在某些情況,我們希望使用完全不同的 版本進行編譯,並且打包成一個 Fat JAR
  13. 撰寫 Ant Build Script In Eclipse • 工欲善其事,必先利其器 – 熟悉

    Eclipse 撰碼提示功能 – 熟悉 Ant Editor 的提示 • 學習目標: – 正式進入 Ant In Daily 實作前,以利用一個較簡單的 MyProject 從無到有寫出 Ant Build Script – 熟悉 Ant 手冊的形式,加速對手冊的閱讀及範例使用
  14. 撰寫 Build Script for Ant • 新增 build.xml – Ant

    預設的 Script File 名稱為 build.xml – Eclipse 開啟 build.xml 時,會自動選用 Ant Script Editor – 使用撰碼提示功能,快速產生 Build Script 樣版
  15. 撰寫 Build Script for Ant • 要使用撰碼提示 (Content Assist) 功能,您可以:

    – Edit 功能表  Content Assist – 使用熱鍵 Alt + / • 右邊的圖例,撰碼提示的熱鍵顯示 為 Ctrl + Space 。這是正確的,因 為 Eclipse 同一個功能可能有多組 設定,而 Ctrl + Space 恰為開啟 中文輸入法的熱鍵,我們只能改用 Alt + / ( 或自定不同的組合 )
  16. 撰寫 Build Script for Ant Run Ant Script from Eclipse

    • 在 build.xml 開啟右鍵選單,執行 Run  Ant Build C:\workspace2\MyProject\build.xml:8: destination directory "C:\workspace2\MyProject\build" does not exist or is not a directory
  17. Build Process • 到目前為止,已經撰寫出將 src 資料夾內的原始碼編譯的 Ant Script : •

    思考: IDE 除了編譯 .java ,還做了些什麼? • 接下來,我們打算讓 Ant 替我們做些什麼? <?xml version="1.0" encoding="UTF-8"?> <project name="my_project" default="package"> <description> 練習使用 Ant 編譯我的專案 </description> <target name="package" description="packaging my project"> <mkdir dir="build"/> <javac srcdir="src" destdir="build" /> </target> </project>
  18. Prepare Environment Compile Source Code Copy Resources Prepare Test Environment

    Compile Test Source Code Copy Test Resources Generate Document Generate Report Generate Library Release Library Deploy Library Execute App Build Process
  19. Prepare Environment Compile Source Code Copy Resources Prepare Test Environment

    Compile Test Source Code Copy Test Resources Generate Document Generate Report Generate Library Release Library Deploy Library Execute App Build Process mkdir copy javac mkdir copy javac junit javadoc jar war ftp ftp copy java exec
  20. Script For AntInDaily • Prepare – 建立編譯時所需的目錄 – 複製需要的檔案,並依情況選用 dev/prod

    的設定檔 <target name="prepare" depends="clean"> <mkdir dir="${build.dir}" /> <mkdir dir="${dist.dir}" /> <copy todir="${build.dir}"> <fileset dir="${src.dir}"> <include name="**/*.properties" /> </fileset> </copy> <copy todir="${build.dir}" overwrite="true"> <fileset dir="${config.dir}"> <include name="**/*.properties" /> </fileset> </copy> </target>
  21. Script For AntInDaily • Compile – 編譯原始碼 • Ant 是專為

    java 專案設計的,處理 CLASSPATH 相 當便利 <target name="compile" depends="prepare"> <javac srcdir="${src.dir}" destdir="${build.dir}"> <classpath refid="classpath" /> </javac> </target>
  22. Script For AntInDaily • Package – 打包成 JAR <target name="package"

    depends="compile"> <jar destfile="${dist.dir}/${library.name}"> <fileset dir="${build.dir}"> <include name="**/*.*" /> </fileset> </jar> </target>
  23. Ant – Property & DataType • Project 、 Target 、

    Task 是撰寫 Ant Script 的重要成 份。 • Property 與 DataType 則是 Ant 重要的基礎設施,如 同一個程式語言要有內建類別一樣。
  24. Ant – Property • Property – 透過 property 將參數轉換成變數,這使得您的專案更加有彈 性。

    – 它也能透過在參數列指定 • ant -Dfoo.library=my_foo_library.jar
  25. Ant - DataType • 語法與型別是程式語言的基礎,而 Ant 提供了我們一些 基本的型別,讓我們處理編譯工作最常需要面對的 – 路徑

    – 檔案列表 • 複製 <copy> 免不了得處理路徑與檔案 • 編譯 <javac> 需要的 classpath 免不了得處理路徑與 檔案 • 執行 <java> 需要的 classpath 免不了得處理路徑與檔 案 • 打包 <jar> 也許需知道哪些檔案該包進去
  26. <fileset> <copy todir="${build.dir}"> <fileset dir="${src.dir}"> <include name="**/*.properties" /> </fileset> </copy>

    <jar destfile="${dist.dir}/${library.name}"> <fileset dir="${build.dir}"> <include name="**/*.*" /> </fileset> </jar>
  27. <fileset> 與 CLASSPATH <path id="classpath"> <fileset dir="${lib.dir}"> <include name="**/*.jar" />

    </fileset> </path> <javac srcdir="${src.dir}" destdir="${build.dir}"> <classpath refid="classpath" /> </javac> 思考:若是在命令列下自己打 javac –cp .;Foo.jar;Bar.jar .. 是多麼繁複呢?
  28. • 實作目標:完成 AntInDaily 的 build.xml • 實作摘要: – 完成 build.xml

    的 path reference 定義 – 完成 <javac> 內 classpath 引用上一步定義的 path reference • 環境準備 – 請匯入 Lab1 • 本教材假設您已在操作環境將 JDK 6.0 含以上版本安裝 完畢 Lab 1 撰寫 AntInDaily 的 build.xml
  29. Lab 1 撰寫 AntInDaily 的 build.xml • 當您開啟 build.xml 會看到定義專案的

    classpath 部分 是被註解的,請使用 <fileset> 選用在 ${lib.dir} 內的 JARs
  30. Lab 1 撰寫 AntInDaily 的 build.xml • 接著,您必需在 <javac> 內使用

    <classpath> 標籤, 並使用先前定義的 path reference :
  31. 擴充 Ant • Ant 替使用者預先準備日常開發工作所需的 Task 。您 仍可以另外下載額外的 Library 來擴充

    Ant 的功能。 • Ant 有提供一組擴充 Task 的 API ,所以加入新的 Task 就如同在 IDE 增加新的 Plugin 一般,使用 taskdef 標籤,宣告新的 Task 與它的 classpath : <taskdef resource="some_resource_file_in_3rd_tasks.properties" classpath="/path/to/other_3rd_task.jar"/>
  32. 擴充 Ant • 關於 taskdef 的自動的 classpath ,您可以將 JAR 放

    在 – ${user.home}/.ant/lib – ${ant.home}/lib • 也許有人會想要加在 CLASSPATH 環境變數,但這通 常是錯誤的開始。 Ant 建議您使用上述的位置放置 JARs ,或著將 JAR 跟著專案走,採用在專案內自訂的 classpath ( 如同 javac 那樣 ) <taskdef resource="some_resource_file_in_3rd_tasks.properties">
  33. Lab 2 替 Ant 新增 CheckStyle Task • 實作目標:增加 CheckStyle

    Task • 實作摘要: – 建立新的 path reference 指向 CheckStyle JAR – 建立 check Target 它會執行 CheckStyle – 在 check Target 內宣告 CheckStyle Task – 使用 <checkstyle> Task 對專案原始碼資料夾進行分析 • 檔案 – 請匯入 Lab2
  34. • Lab2 多出 lib.build 資料 夾,將只有 Build Tool 會 使用到的

    JARs 與相關設 定檔獨立放置是個好習慣 。 • 請建立一個新的 path reference 名為 classpath.build 指到這個 目錄 Lab 2 替 Ant 新增 CheckStyle Task
  35. • 建立 check Target 宣告 checkstyle Task ,並使用先前建好的 path reference

    呼叫 <checkstyle> 分析現有的原始碼目錄 Lab 2 替 Ant 新增 CheckStyle Task
  36. 在 IDE 外執行 Ant • 透過 IDE 學習 Ant Script

    的撰寫是相當方便的。對於 軟體開發者來說,讓工作更加自動化也是重要的。當您 學會在 IDE 之外使用 Ant 時,它能帶給您更多的便利 。 • 執行 Ant 的方法: – IDE • Run As Ant Build • Click Ant View Button – 命令列
  37. 在 IDE 外執行 Ant • 安裝 Ant 命令列工具 – 將在

    Ant 官網下載回來的壓縮檔解壓縮: • Ex. C:\app\apache-ant-1.8.2 – 設定環境變數 • ANT_HOME= C:\app\apache-ant-1.8.2 • 並在 PATH 變數再加上 %ANT_HOME%\bin
  38. 在 IDE 外執行 Ant • 當您在 IDE 內寫完 Ant Build

    Script 後,除了在 IDE 上測試,強烈建議您也使用外部的 Ant 程式執行看看。 • IDE 附的 Ant 版本往往比您後來下載的『舊』,多一 份用心,稍為測試一下。
  39. 在 IDE 外執行 Ant • 當 Ant 能在 IDE 外執行後,我們還可以:

    – 使用 Ant 來執行 Java 程式 • 利用 Ant 的功能,簡單處理 CLASSPATH – 使用 Ant 來輔助其他任務 • 在 Linux 下有方便的 Shell Script 。 Windows 的 .Bat 相較之下 是較陽春的。 • 將複雜的功能交給 Ant , .Bat 只要負責喚起 Ant Script 就行了 – <cvs> – <ftp> – <ssh> • .Bat 配合 Windows 排程即可完成週期性任務
  40. Maven • 專案結構上的慣例 – ${basedir} • src – main »

    java » resource – test » java » resource • target – classes
  41. Maven • 操作介面的慣例 • 透過指定 Build Phase 名稱來完成工作: – install

    – package – test – deploy – site • Ant 則提供給開發者彈性,自由選擇 Target 名稱。
  42. Maven • 建構流程上的慣例 – Maven 有固定的 Build lifecycle 。 •

    表格為 Default Build Lifecycle 包含的 Phase – 當執行 mvn package 時, mvn 會由 package 所屬的 Lifecycle ,由第一個 Phase 依序執行到 package validate initialize generate-sources process-sources generate-resources process-resources compile process-classes generate-test-sources process-test-sources generate-test-resources process-test-resources test-compile process-test-classes test prepare-package package pre-integration-test integration-test post-integration-test verify mvn package
  43. validate initialize generate-sources process-sources generate-resources process-resources compile process-classes generate-test-sources process-test-sources

    generate-test-resources process-test-resources test-compile process-test-classes test prepare-package package pre-integration-test integration-test post-integration-test verify install deploy mvn package resources:resource compiler:compile resources:testResource compiler:testCompile surefire:test jar:jar install:install deploy:deploy Bind Phase To Plugin’s Goal
  44. Maven Plugin • Maven Plugin 能類比為 Ant Task • 最初安裝的

    Maven 有許多功能都沒有,但有記錄能處 理該功能的 Plugin 名稱。 • 以 Maven Compiler Plugin 為例,它的名稱為: – org.apache.maven.plugins:maven-compiler-plugin – org.apache.maven.plugins 是 Group ID – maven-compiler-plugin 是 Artifact ID • 每個以 Maven 管理的專案都由 GroupID:ArtifactID 組 合成一個獨一無二的名稱。
  45. Maven Plugin • 每個以 Maven 透過 GroupID:ArtifactID 換算成 Maven Repository

    的檔案位置。 • Maven Plugin 會利用轉換出的 URL 進行下載。下載之 後, Maven 就獲得該 Plugin 的能力。
  46. Maven Dependency Management • Maven 是宣告式專案管理工具 – 使用 pom.xml 定義專案的

    • 相關 Plugin 設定 • 相依關係 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>maven.lab</groupId> <artifactId>hello.maven</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>hello.maven</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
  47. Maven Dependency Management • 相依套件的取得方式與 Maven Plugin 相同, Maven 能利用:

    junit:junit 至 Repository 取得檔案 – http://repo1.maven.org/maven2/junit/junit/ <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency>
  48. Maven In Eclipse • 以 Build Tool 的角度來看 Maven ,它是個具有一致操

    作方式的工具。只要會使用 Maven 的人,拿到使用 Maven 建立的專案,就會明白如何編譯它。 • 以專案管理工具的角度來看 Maven ,它是個相當方便 的『相依性』管理工具,任何程式套件的使用,只要 『宣告』即可。 • m2eclipse plugin 讓 Eclipse 具有建立 Maven 專案的 能力,並獲得相依管理的好處。
  49. 安裝 Maven Command Tool • Maven 與 Ant 一樣其實都是命令列工具。在安裝完 m2eclipse

    後,我們也一併安裝 Maven Command Tool 。 – 由 http://maven.apache.org/ 官網下載 maven – 將它解壓縮至 C:\app
  50. 安裝 Maven Command Tool • 設定環境變數 – 將 maven 的

    bin 路徑加入 PATH 內 • EX. C:\app\apache-maven-3.0.3\bin
  51. Maven 專案流程 開發者 Maven Project 建立 開發、實作 發佈 引用 Maven

    Project Maven Project Maven Project 引用 引用 引用
  52. Maven Repository • Central Repository – 定義在 Super POM 裡的

    Repository 站台 • Local Repository – 使用者目錄下的 .m2 目錄 • Private Repository – 使用 Maven Repository 工具架設的私有 Repository – 一般企業內部會自行架設,以放置屬於該公司智財部分的套件
  53. Lab 3 架設 Maven Repository • 實作目標:架設 Maven Repository •

    相關檔案: – Jetty Server(jetty-distribution-7.3.0.v20110203.zip) • 我們採用 Nexus War 架設 Nexus Repository ,為練習方便以 Jetty Server 作為 Web Server 是最簡單的。 – Nexus(nexus-webapp-1.9.0.2.war) • Nexus 有二種安裝方式,一種是使用它自己的 Web Server 。另一 種是安裝在既有的 Servlet/JSP Container 之上,例如: Tomcat 或 Jetty 都是常見的選擇。
  54. • 安裝 Nexus Repository – 將 nexus-webapp-1.9.0.2.war 複製一份改名為 nexus.war –

    改名後的 nexus.war 複製到 Jetty 安裝路徑下的 webapps – 最後,瀏覽網址 http://localhost:8080/nexus Lab 3 架設 Maven Repository
  55. • 設定 Nexus Repository – 由 Administrator  Server 找出

    Default HTTP Proxy Settings – 請設定適當的內容 Lab 3 架設 Maven Repository
  56. • 實作回顧 – 我們使用 Jetty Server 作為簡單的 Servlet/JSP Container 服

    務 Nexus Repository – 架設者適網路環境設定是否採用 Proxy 設定 • 其它注意事項 – 若您是負責架構 Nexus 負責人員,請注意 • 若內部使用,其實不需要有對外的 IP ,但 Nexus Repository 本身 要能抓取外部資料 • 刪除不必要的帳號,修改預設的管理者密碼 – 無論如何,管理人有責任詳細閱讀手冊,並瞭解安全注意事項 。 Lab 3 架設 Maven Repository
  57. Lab 4 架設 Maven 專案流程 • 實作目標:體驗 Maven 專案開發流程 •

    實作重點: – 設定 Maven 能 Private Repository • 設定 Maven Configuration : ${MAVEN}/conf/settings.xml • 設定專案的發佈位置: pom.xml – 將 Maven 專案發佈至 Private Repository • 使用 Deploy phase
  58. • 為了使安裝的 Maven 能透過 Private Repository 抓取 檔案,必需修改 settings.xml 。

    利用先前在 m2eclipse 設定過的 External Maven 。 點選 open file 它會開啟 XML Editor Lab 4 架設 Maven 專案流程
  59. • 在 <profiles> 標籤內增加一組 <profile> <profile> <id>nexus</id> <repositories> <repository> <id>central</id>

    <url>http://central</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>central</id> <url>http://central</url> <releases><enabled>true</enabled></releases> <snapshots><enabled>true</enabled></snapshots> </pluginRepository> </pluginRepositories> </profile> Lab 4 架設 Maven 專案流程
  60. • 在 <mirrors> 標籤內增加一組 <mirror> • 在 <activeProfiles> 標籤內增加一組 <activeProfile>

    <mirror> <id>nexus</id> <mirrorOf>*</mirrorOf> <url>http://localhost:8080/nexus/content/groups/public</url> </mirror> <activeProfiles> <activeProfile>nexus</activeProfile> </activeProfiles> Lab 4 架設 Maven 專案流程
  61. • Maven Global Configuration 設定摘要 – 在 settings.xml 設定 profile

    指定要新的一組 repository 與 plugin repository ,並且它的 id 為 nexus – 在 mirrors 對應裡,將所有的請求都指定給 Private Repository – 在 activeProfiles 內指定 nexus 的設定是啟用的狀態 Lab 4 架設 Maven 專案流程
  62. • 在專案的 <project> 下增加 <distributionManagement> 設定 <distributionManagement> <repository> <id>nexus.release</id> <name>public</name>

    <url>http://localhost:8080/nexus/content/repositories/releases</url> </repository> <snapshotRepository> <id>nexus.snapshot</id> <name>snapshots</name> <url>http://localhost:8080/nexus/content/repositories/snapshots</url> </snapshotRepository> </distributionManagement> Lab 4 架設 Maven 專案流程
  63. • 修改 settings.xml 在 <servers> 增加一組對應的帳號 、密碼: • 再次執行 deploy

    就能成功上傳至 Private Repository <server> <id>nexus.snapshot</id> <username>admin</username> <password>admin123</password> </server> Lab 4 架設 Maven 專案流程