Contenu connexe Similaire à Java Build Tool course in 2011 Similaire à Java Build Tool course in 2011 (20) Plus de Ching Yi Chan (12) Java Build Tool course in 20113. 關於軟體開發
• Top Down 由上至下的開發模式
– 先定義總體流程及主要類別
– 各流程的接合界面有哪些
– 模擬整合後的運作情形
– 由整體需求出發,較不會開發出多餘的功能。
• Bottom Up 由下至上的開發模式
– 先實作可能需要用到的元件
– 依功能模組責任分工
– 最後試著整合看看
– 以功能導向出發,較易開發出精緻的功能。
4. 關於軟體開發
• Top Down 由上至下的開發模式較適用於專案開發。對
專案來說最容易拖延進度是在最後整合的階段, Top
Down 的模式,使得整合的模型在最初就形成,並且能
利用持續性整合的方式,針對每一批新增的功能做總體
的測試,對需求而變更實作的彈性較高。
• Bottom Up 由下至上的開發模式較適於獨立的公用程式。
此種開發模式優點在於針對特定功能定義明確,往往能
發展出較精確的測試案例。
• 無論專案以何種模式進行,測試案例與測試工具的使用
都能輔助您提昇開發品質。
5. 關於程式編譯
• 使用 IDE 編譯程式
– 便利性佳,有顯眼的錯誤、警告提醒
– 即使方便,但無法進行自動化編譯
• 手動呼叫 Java Compiler
– 使用上較為不便
– 手工處理 CLASSPATH 較易出錯
– 實務上會寫成 Script
• Linux : Shell Script
• Windows : .BAT
6. Build Tool
Developer OR Build Server
check out
build
document
library
application
auto testing
Build Tool
Version Control
commit
8. Build Tool
• 建構工具
– 以事先準備的編譯腳本編譯
– 編譯條件、參數保存於檔案,即使換人來做也能有一致的結果
– Ant 與 Maven 是 Java 軟體開發最常用的 Build Tool
10. 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 設計統一的編譯工具,編譯的流程難以達到
『一寫通用』
11. Ant 的設計哲學
• 提供一個可移植性高的編譯與部署工具
– 設計必需簡單易學
• Ant 的核心模型概念只有三個:專案、執行目標、任務
– 使用者能輕易讀懂編譯腳本
• Ant 使用已廣為人知道 XML 作為腳本語言
– 工具必需能夠讓使用者擴充
• Ant 提供擴充 API 讓進階使用者能擴充新功能
12. Ant build file = 1 個專案的 Build Script
<project>
<target 1>
<target 2>
<target N>
Task
Task
Task
Task
Task
Task
13. Ant 的學習技巧
• Ant 是一個指令工具
– 初學時,多瀏覽 Ant 手冊與常用 Task
• http://ant.apache.org/manual/
– 將常用的指令參數,使用慣例寫成 CheatSheet ( 小抄 )
– 蒐集工作上常用的 Task 範例
• <javac>
• <jar>
• <ftp>
• <cvs>
– 使用 IDE 輔助學習
• Eclipse 或 NetBeans 都能加速您編寫 Build Script 的時間
19. Ant In Daily
• AntInDaily 專案的主要功能為
ConfigurationManager 。這是許多專
案開發時都會提供的類別,功能只有
負責讀入設定檔,並將它轉成物件。
20. Ant In Daily
• ConfigurationManager 會讀入
config.properties ,並提供
getDatabaseInfo() 方法,將部分的
參數集合成 DatabaseInfo 物件。
21. Ant In Daily
• 專案內有個 config 目錄,並且包含
二個子目錄
– dev
– prod
• 我們期望一般開發時,程式編譯是使
用 dev 目錄內的設定檔;當要編譯
正式環境版本時,要改用 prod 目錄
的設定檔
23. Ant In Daily
• IDE 難以切換不同情境的編譯:
– 正式環境版本
– 開發環境版本
• 依賴『手工』容易出錯
– 複製檔案
– 改寫設定檔
• 『在我的電腦上,跑起來沒問題啊!』
• 『一定是你的電腦怪怪的!』正式版
開發版
24. Ant In Daily
• IDE 難以選用不同的 Library 版本
– 依賴人工操作 UI 來替換不同的 Library
– 使用 Ant 能透過參數化,在編譯時決定要
使用的版本。
• 在某些情況,我們希望使用完全不同的
版本進行編譯,並且打包成一個 Fat
JAR
25. 撰寫 Ant Build Script In Eclipse
• 工欲善其事,必先利其器
– 熟悉 Eclipse 撰碼提示功能
– 熟悉 Ant Editor 的提示
• 學習目標:
– 正式進入 Ant In Daily 實作前,以利用一個較簡單的
MyProject 從無到有寫出 Ant Build Script
– 熟悉 Ant 手冊的形式,加速對手冊的閱讀及範例使用
26. 撰寫 Build Script for Ant
• 新增 build.xml
– Ant 預設的 Script File 名稱為 build.xml
– Eclipse 開啟 build.xml 時,會自動選用 Ant Script Editor
– 使用撰碼提示功能,快速產生 Build Script 樣版
27. 撰寫 Build Script for Ant
• 要使用撰碼提示 (Content Assist)
功能,您可以:
– Edit 功能表 Content Assist
– 使用熱鍵 Alt + /
• 右邊的圖例,撰碼提示的熱鍵顯示
為 Ctrl + Space 。這是正確的,因
為 Eclipse 同一個功能可能有多組
設定,而 Ctrl + Space 恰為開啟
中文輸入法的熱鍵,我們只能改用
Alt + / ( 或自定不同的組合 )
30. 撰寫 Build Script for Ant
<javac>
• 我們即將使用 <javac> 編譯專案,但是該如何使用呢?
– 參考手冊的範例
<javac srcdir="src" destdir="build" />
31. 撰寫 Build Script for Ant
Run Ant Script from Eclipse
• 在 build.xml 開啟右鍵選單,執行 Run Ant Build
C:workspace2MyProjectbuild.xml:8:
destination directory "C:workspace2MyProjectbuild"
does not exist or is not a directory
34. 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>
35. 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
36. 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
junitjavadoc
jar war
ftp
ftp copy
java exec
40. 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>
41. Script For AntInDaily
• Compile
– 編譯原始碼
• Ant 是專為 java 專案設計的,處理 CLASSPATH 相
當便利
<target name="compile" depends="prepare">
<javac srcdir="${src.dir}" destdir="${build.dir}">
<classpath refid="classpath" />
</javac>
</target>
42. 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>
43. Script For AntInDaily
• Clean
– 清除編譯的目錄
• 清除的動作是重要的,這樣可以保證每一次的結果是最
正確的。不會只有部分重新編譯而產生難以理解的結果
。
<target name="clean">
<delete dir="${build.dir}" />
</target>
44. Ant – Property & DataType
• Project 、 Target 、 Task 是撰寫 Ant Script 的重要成
份。
• Property 與 DataType 則是 Ant 重要的基礎設施,如
同一個程式語言要有內建類別一樣。
45. Ant – Property
• Property
– 透過 property 將參數轉換成變數,這使得您的專案更加有彈
性。
– 它也能透過在參數列指定
• ant -Dfoo.library=my_foo_library.jar
46. Ant - DataType
• 語法與型別是程式語言的基礎,而 Ant 提供了我們一些
基本的型別,讓我們處理編譯工作最常需要面對的
– 路徑
– 檔案列表
• 複製 <copy> 免不了得處理路徑與檔案
• 編譯 <javac> 需要的 classpath 免不了得處理路徑與
檔案
• 執行 <java> 需要的 classpath 免不了得處理路徑與檔
案
• 打包 <jar> 也許需知道哪些檔案該包進去
49. <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 .. 是多麼繁複呢?
50. • 實作目標:完成 AntInDaily 的 build.xml
• 實作摘要:
– 完成 build.xml 的 path reference 定義
– 完成 <javac> 內 classpath 引用上一步定義的 path
reference
• 環境準備
– 請匯入 Lab1
• 本教材假設您已在操作環境將 JDK 6.0 含以上版本安裝
完畢
Lab 1 撰寫 AntInDaily 的 build.xml
51. Lab 1 撰寫 AntInDaily 的 build.xml
• 當您開啟 build.xml 會看到定義專案的 classpath 部分
是被註解的,請使用 <fileset> 選用在 ${lib.dir} 內的
JARs
52. Lab 1 撰寫 AntInDaily 的 build.xml
• 接著,您必需在 <javac> 內使用 <classpath> 標籤,
並使用先前定義的 path reference :
53. 擴充 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"/>
54. 擴充 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">
55. 擴充 Ant
• CheckStyle 是一套程式碼靜態分析工具,它主要的功能
是輔助開發者,撰寫程式碼儘可能合乎建議的慣例。
• 利用 CheckStyle 工具提供的 Ant Task ,我們能輕鬆
地在 Build Process 順便回報目前專案程式碼的分析結
果:
56. Lab 2 替 Ant 新增 CheckStyle Task
• 實作目標:增加 CheckStyle Task
• 實作摘要:
– 建立新的 path reference 指向 CheckStyle JAR
– 建立 check Target 它會執行 CheckStyle
– 在 check Target 內宣告 CheckStyle Task
– 使用 <checkstyle> Task 對專案原始碼資料夾進行分析
• 檔案
– 請匯入 Lab2
57. • Lab2 多出 lib.build 資料
夾,將只有 Build Tool 會
使用到的 JARs 與相關設
定檔獨立放置是個好習慣
。
• 請建立一個新的 path
reference 名為
classpath.build 指到這個
目錄
Lab 2 替 Ant 新增 CheckStyle Task
58. • 使用 <path> 標籤建立 path reference
• 同樣的,保持將實際的目錄參數化的好習慣。
Lab 2 替 Ant 新增 CheckStyle Task
59. • 建立 check Target
宣告 checkstyle Task ,並使用先前建好的 path reference
呼叫 <checkstyle> 分析現有的原始碼目錄
Lab 2 替 Ant 新增 CheckStyle Task
60. 在 IDE 外執行 Ant
• 透過 IDE 學習 Ant Script 的撰寫是相當方便的。對於
軟體開發者來說,讓工作更加自動化也是重要的。當您
學會在 IDE 之外使用 Ant 時,它能帶給您更多的便利
。
• 執行 Ant 的方法:
– IDE
• Run As Ant Build
• Click Ant View Button
– 命令列
61. 在 IDE 外執行 Ant
• 安裝 Ant 命令列工具
– 將在 Ant 官網下載回來的壓縮檔解壓縮:
• Ex. C:appapache-ant-1.8.2
– 設定環境變數
• ANT_HOME= C:appapache-ant-1.8.2
• 並在 PATH 變數再加上 %ANT_HOME%bin
63. 在 IDE 外執行 Ant
• 您可以試著使用 Ant 編譯,先前在 IDE 編譯的專案:
64. 在 IDE 外執行 Ant
• 當您在 IDE 內寫完 Ant Build Script 後,除了在 IDE
上測試,強烈建議您也使用外部的 Ant 程式執行看看。
• IDE 附的 Ant 版本往往比您後來下載的『舊』,多一
份用心,稍為測試一下。
65. 在 IDE 外執行 Ant
• 當 Ant 能在 IDE 外執行後,我們還可以:
– 使用 Ant 來執行 Java 程式
• 利用 Ant 的功能,簡單處理 CLASSPATH
– 使用 Ant 來輔助其他任務
• 在 Linux 下有方便的 Shell Script 。 Windows 的 .Bat 相較之下
是較陽春的。
• 將複雜的功能交給 Ant , .Bat 只要負責喚起 Ant Script 就行了
– <cvs>
– <ftp>
– <ssh>
• .Bat 配合 Windows 排程即可完成週期性任務
68. Maven
• 操作介面的慣例
• 透過指定 Build Phase 名稱來完成工作:
– install
– package
– test
– deploy
– site
• Ant 則提供給開發者彈性,自由選擇 Target 名稱。
69. 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
71. 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 組
合成一個獨一無二的名稱。
72. Maven Plugin
• 每個以 Maven 透過 GroupID:ArtifactID 換算成
Maven Repository 的檔案位置。
• Maven Plugin 會利用轉換出的 URL 進行下載。下載之
後, Maven 就獲得該 Plugin 的能力。
73. 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>
74. 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>
75. Maven In Eclipse
• 以 Build Tool 的角度來看 Maven ,它是個具有一致操
作方式的工具。只要會使用 Maven 的人,拿到使用
Maven 建立的專案,就會明白如何編譯它。
• 以專案管理工具的角度來看 Maven ,它是個相當方便
的『相依性』管理工具,任何程式套件的使用,只要
『宣告』即可。
• m2eclipse plugin 讓 Eclipse 具有建立 Maven 專案的
能力,並獲得相依管理的好處。
76. 安裝 m2eclipse
• 使用 m2eclipse update site
– http://m2eclipse.sonatype.org/sites/m2e
81. 安裝 Maven Command Tool
• Maven 與 Ant 一樣其實都是命令列工具。在安裝完
m2eclipse 後,我們也一併安裝 Maven Command
Tool 。
– 由 http://maven.apache.org/ 官網下載 maven
– 將它解壓縮至 C:app
82. 安裝 Maven Command Tool
• 設定環境變數
– 將 maven 的 bin 路徑加入 PATH 內
• EX. C:appapache-maven-3.0.3bin
95. Maven Repository
• Central Repository
– 定義在 Super POM 裡的 Repository 站台
• Local Repository
– 使用者目錄下的 .m2 目錄
• Private Repository
– 使用 Maven Repository 工具架設的私有 Repository
– 一般企業內部會自行架設,以放置屬於該公司智財部分的套件
96. 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 都是常見的選擇。
97. • 在 Jetty 安裝目錄下,使用下列指令啟動 Server
– java -jar start.jar
Lab 3 架設 Maven Repository
99. • 安裝 Nexus Repository
– 將 nexus-webapp-1.9.0.2.war 複製一份改名為 nexus.war
– 改名後的 nexus.war 複製到 Jetty 安裝路徑下的 webapps
– 最後,瀏覽網址 http://localhost:8080/nexus
Lab 3 架設 Maven Repository
100. • 登入 Nexus Repository
– Nexus 預設的管理者帳號為 admin ,密碼 admin123
Lab 3 架設 Maven Repository
101. • 設定 Nexus Repository
– 由 Administrator Server 找出 Default HTTP Proxy
Settings
– 請設定適當的內容
Lab 3 架設 Maven Repository
102. • 實作回顧
– 我們使用 Jetty Server 作為簡單的 Servlet/JSP Container 服
務 Nexus Repository
– 架設者適網路環境設定是否採用 Proxy 設定
• 其它注意事項
– 若您是負責架構 Nexus 負責人員,請注意
• 若內部使用,其實不需要有對外的 IP ,但 Nexus Repository 本身
要能抓取外部資料
• 刪除不必要的帳號,修改預設的管理者密碼
– 無論如何,管理人有責任詳細閱讀手冊,並瞭解安全注意事項
。
Lab 3 架設 Maven Repository
103. Lab 4 架設 Maven 專案流程
• 實作目標:體驗 Maven 專案開發流程
• 實作重點:
– 設定 Maven 能 Private Repository
• 設定 Maven Configuration : ${MAVEN}/conf/settings.xml
• 設定專案的發佈位置: pom.xml
– 將 Maven 專案發佈至 Private Repository
• 使用 Deploy phase
104. • 為了使安裝的 Maven 能透過 Private Repository 抓取
檔案,必需修改 settings.xml 。
利用先前在 m2eclipse 設定過的 External Maven 。
點選 open file 它會開啟 XML Editor
Lab 4 架設 Maven 專案流程
105. • 在 <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 專案流程
106. • 在 <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 專案流程
107. • Maven Global Configuration 設定摘要
– 在 settings.xml 設定 profile 指定要新的一組 repository 與
plugin repository ,並且它的 id 為 nexus
– 在 mirrors 對應裡,將所有的請求都指定給 Private
Repository
– 在 activeProfiles 內指定 nexus 的設定是啟用的狀態
Lab 4 架設 Maven 專案流程
108. • 再次對 Maven 專案做 package 動作時,您會看到它
下載的位置有所變換:
Lab 4 架設 Maven 專案流程
110. • 在專案的 <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 專案流程
111. • 在專案若你試著執行 deploy 會發生錯誤,這是因為您還沒有
設定可供上傳用的帳號,因而被 Private Respository 拒絕。
Lab 4 架設 Maven 專案流程
112. • 修改 settings.xml 在 <servers> 增加一組對應的帳號
、密碼:
• 再次執行 deploy 就能成功上傳至 Private Repository
<server>
<id>nexus.snapshot</id>
<username>admin</username>
<password>admin123</password>
</server>
Lab 4 架設 Maven 專案流程