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

Weitere ähnliche Inhalte

Was ist angesagt?

Composer 套件管理
Composer 套件管理Composer 套件管理
Composer 套件管理Shengyou Fan
 
Laravel - 系統全攻略(續)
Laravel - 系統全攻略(續)Laravel - 系統全攻略(續)
Laravel - 系統全攻略(續)Vincent Chi
 
應用程式佈署
應用程式佈署應用程式佈署
應用程式佈署Shengyou Fan
 
Package安裝與使用
Package安裝與使用Package安裝與使用
Package安裝與使用Shengyou Fan
 
應用程式部署
應用程式部署應用程式部署
應用程式部署Shengyou Fan
 
開發工具與環境建置
開發工具與環境建置開發工具與環境建置
開發工具與環境建置Shengyou Fan
 
專案啟動與設定
專案啟動與設定專案啟動與設定
專案啟動與設定Shengyou Fan
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎Shengyou Fan
 
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩Wen-Tien Chang
 
Migrations 與 Schema 操作
Migrations 與 Schema 操作Migrations 與 Schema 操作
Migrations 與 Schema 操作Shengyou Fan
 
給你一個使用 Laravel 的理由
給你一個使用 Laravel 的理由給你一個使用 Laravel 的理由
給你一個使用 Laravel 的理由Shengyou Fan
 
PHP 語法基礎與物件導向
PHP 語法基礎與物件導向PHP 語法基礎與物件導向
PHP 語法基礎與物件導向Shengyou Fan
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎Shengyou Fan
 
專案啟動與環境設定
專案啟動與環境設定專案啟動與環境設定
專案啟動與環境設定Shengyou Fan
 
開發環境建置
開發環境建置開發環境建置
開發環境建置Shengyou Fan
 
Model & Seeding整合
Model & Seeding整合Model & Seeding整合
Model & Seeding整合Shengyou Fan
 

Was ist angesagt? (20)

Composer 套件管理
Composer 套件管理Composer 套件管理
Composer 套件管理
 
Laravel - 系統全攻略(續)
Laravel - 系統全攻略(續)Laravel - 系統全攻略(續)
Laravel - 系統全攻略(續)
 
應用程式佈署
應用程式佈署應用程式佈署
應用程式佈署
 
Package安裝與使用
Package安裝與使用Package安裝與使用
Package安裝與使用
 
應用程式部署
應用程式部署應用程式部署
應用程式部署
 
開發工具與環境建置
開發工具與環境建置開發工具與環境建置
開發工具與環境建置
 
使用者認證
使用者認證使用者認證
使用者認證
 
專案啟動與設定
專案啟動與設定專案啟動與設定
專案啟動與設定
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎
 
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
A brief introduction to Vagrant – 原來 VirtualBox 可以這樣玩
 
Migrations 與 Schema 操作
Migrations 與 Schema 操作Migrations 與 Schema 操作
Migrations 與 Schema 操作
 
CRUD 綜合應用
CRUD 綜合應用CRUD 綜合應用
CRUD 綜合應用
 
CRUD 綜合運用
CRUD 綜合運用CRUD 綜合運用
CRUD 綜合運用
 
給你一個使用 Laravel 的理由
給你一個使用 Laravel 的理由給你一個使用 Laravel 的理由
給你一個使用 Laravel 的理由
 
PHP 語法基礎與物件導向
PHP 語法基礎與物件導向PHP 語法基礎與物件導向
PHP 語法基礎與物件導向
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎
 
專案啟動與環境設定
專案啟動與環境設定專案啟動與環境設定
專案啟動與環境設定
 
開發環境建置
開發環境建置開發環境建置
開發環境建置
 
CRUD 綜合運用
CRUD 綜合運用CRUD 綜合運用
CRUD 綜合運用
 
Model & Seeding整合
Model & Seeding整合Model & Seeding整合
Model & Seeding整合
 

Andere mochten auch

Java Builds with Maven and Ant
Java Builds with Maven and AntJava Builds with Maven and Ant
Java Builds with Maven and AntDavid Noble
 
Printii proposal for Convenient Store
Printii proposal for Convenient StorePrintii proposal for Convenient Store
Printii proposal for Convenient StoreJohnson Wang
 
Printii Biz Thinking
Printii Biz ThinkingPrintii Biz Thinking
Printii Biz ThinkingJohnson Wang
 
Java build tool_comparison
Java build tool_comparisonJava build tool_comparison
Java build tool_comparisonManav Prasad
 
2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(3)-フォルダ構造、マネージャツール
2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(3)-フォルダ構造、マネージャツール2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(3)-フォルダ構造、マネージャツール
2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(3)-フォルダ構造、マネージャツールEnpel
 
Infrastructure Automation with Chef
Infrastructure Automation with ChefInfrastructure Automation with Chef
Infrastructure Automation with ChefJonathan Weiss
 
JBoss Application Server 7
JBoss Application Server 7JBoss Application Server 7
JBoss Application Server 7Ray Ploski
 
WebLogic Deployment Plan Example
WebLogic Deployment Plan ExampleWebLogic Deployment Plan Example
WebLogic Deployment Plan ExampleJames Bayer
 
Weblogic configuration & administration
Weblogic   configuration & administrationWeblogic   configuration & administration
Weblogic configuration & administrationMuhammad Mansoor
 
Where and when to use the Oracle Service Bus (OSB)
Where and when to use the Oracle Service Bus (OSB)Where and when to use the Oracle Service Bus (OSB)
Where and when to use the Oracle Service Bus (OSB)Guido Schmutz
 
Oracle SOA Suite 11g Mediator vs. Oracle Service Bus (OSB)
Oracle SOA Suite 11g Mediator vs. Oracle Service Bus (OSB)Oracle SOA Suite 11g Mediator vs. Oracle Service Bus (OSB)
Oracle SOA Suite 11g Mediator vs. Oracle Service Bus (OSB)Guido Schmutz
 
WebSphere App Server vs JBoss vs WebLogic vs Tomcat (InterConnect 2016)
WebSphere App Server vs JBoss vs WebLogic vs Tomcat (InterConnect 2016)WebSphere App Server vs JBoss vs WebLogic vs Tomcat (InterConnect 2016)
WebSphere App Server vs JBoss vs WebLogic vs Tomcat (InterConnect 2016)Roman Kharkovski
 
Tomcat and apache httpd training
Tomcat and apache httpd trainingTomcat and apache httpd training
Tomcat and apache httpd trainingFranck SIMON
 

Andere mochten auch (20)

Java Builds with Maven and Ant
Java Builds with Maven and AntJava Builds with Maven and Ant
Java Builds with Maven and Ant
 
Printii proposal for Convenient Store
Printii proposal for Convenient StorePrintii proposal for Convenient Store
Printii proposal for Convenient Store
 
Printii Biz Thinking
Printii Biz ThinkingPrintii Biz Thinking
Printii Biz Thinking
 
Releasing Projects Using Maven
Releasing Projects Using MavenReleasing Projects Using Maven
Releasing Projects Using Maven
 
Java build tool_comparison
Java build tool_comparisonJava build tool_comparison
Java build tool_comparison
 
Tomcat tutorail
Tomcat tutorailTomcat tutorail
Tomcat tutorail
 
Building java projects with maven
Building java projects with mavenBuilding java projects with maven
Building java projects with maven
 
2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(3)-フォルダ構造、マネージャツール
2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(3)-フォルダ構造、マネージャツール2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(3)-フォルダ構造、マネージャツール
2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(3)-フォルダ構造、マネージャツール
 
Manen Ant SVN
Manen Ant SVNManen Ant SVN
Manen Ant SVN
 
Infrastructure Automation with Chef
Infrastructure Automation with ChefInfrastructure Automation with Chef
Infrastructure Automation with Chef
 
Jboss Tutorial Basics
Jboss Tutorial BasicsJboss Tutorial Basics
Jboss Tutorial Basics
 
JEE Programming - 07 EJB Programming
JEE Programming - 07 EJB ProgrammingJEE Programming - 07 EJB Programming
JEE Programming - 07 EJB Programming
 
JBoss Application Server 7
JBoss Application Server 7JBoss Application Server 7
JBoss Application Server 7
 
WebLogic Deployment Plan Example
WebLogic Deployment Plan ExampleWebLogic Deployment Plan Example
WebLogic Deployment Plan Example
 
Weblogic configuration & administration
Weblogic   configuration & administrationWeblogic   configuration & administration
Weblogic configuration & administration
 
Oracle Web Logic server
Oracle Web Logic serverOracle Web Logic server
Oracle Web Logic server
 
Where and when to use the Oracle Service Bus (OSB)
Where and when to use the Oracle Service Bus (OSB)Where and when to use the Oracle Service Bus (OSB)
Where and when to use the Oracle Service Bus (OSB)
 
Oracle SOA Suite 11g Mediator vs. Oracle Service Bus (OSB)
Oracle SOA Suite 11g Mediator vs. Oracle Service Bus (OSB)Oracle SOA Suite 11g Mediator vs. Oracle Service Bus (OSB)
Oracle SOA Suite 11g Mediator vs. Oracle Service Bus (OSB)
 
WebSphere App Server vs JBoss vs WebLogic vs Tomcat (InterConnect 2016)
WebSphere App Server vs JBoss vs WebLogic vs Tomcat (InterConnect 2016)WebSphere App Server vs JBoss vs WebLogic vs Tomcat (InterConnect 2016)
WebSphere App Server vs JBoss vs WebLogic vs Tomcat (InterConnect 2016)
 
Tomcat and apache httpd training
Tomcat and apache httpd trainingTomcat and apache httpd training
Tomcat and apache httpd training
 

Ähnlich wie Java Build Tool course in 2011

GNU Autoconf / Automake #4
GNU Autoconf / Automake #4GNU Autoconf / Automake #4
GNU Autoconf / Automake #4imacat .
 
ASP.NET MVC 6 新功能探索
ASP.NET MVC 6 新功能探索ASP.NET MVC 6 新功能探索
ASP.NET MVC 6 新功能探索Will Huang
 
使用 laravel 的前與後
使用 laravel 的前與後使用 laravel 的前與後
使用 laravel 的前與後Shengyou Fan
 
Docker 最佳实践
Docker 最佳实践Docker 最佳实践
Docker 最佳实践YuLing Liu
 
從頭打造 C#、.NET 與 ASP.NET Core 開發環境
從頭打造 C#、.NET 與 ASP.NET Core 開發環境從頭打造 C#、.NET 與 ASP.NET Core 開發環境
從頭打造 C#、.NET 與 ASP.NET Core 開發環境Will Huang
 
給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發Weizhong Yang
 
從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用謝 宗穎
 
Android gradle 从入门到gg 0
Android gradle 从入门到gg 0Android gradle 从入门到gg 0
Android gradle 从入门到gg 0Jun Liu
 
Docker tutorial
Docker tutorialDocker tutorial
Docker tutorialazole Lai
 
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛Edward Kuo
 
Clojure cnclojure-meetup
Clojure cnclojure-meetupClojure cnclojure-meetup
Clojure cnclojure-meetupsunng87
 
淺談 Groovy 與 Gradle
淺談 Groovy 與 Gradle淺談 Groovy 與 Gradle
淺談 Groovy 與 GradleJustin Lin
 
Maven初级培训
Maven初级培训Maven初级培训
Maven初级培训Cody Zhang
 
02.python.开发最佳实践
02.python.开发最佳实践02.python.开发最佳实践
02.python.开发最佳实践Na Lee
 
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例Will Huang
 
Flutter 踩雷心得
Flutter 踩雷心得Flutter 踩雷心得
Flutter 踩雷心得Weizhong Yang
 
构建可维护的Javascript 小米网
构建可维护的Javascript 小米网构建可维护的Javascript 小米网
构建可维护的Javascript 小米网yang alex
 
OpenEJB - 另一個選擇
OpenEJB - 另一個選擇OpenEJB - 另一個選擇
OpenEJB - 另一個選擇Justin Lin
 

Ähnlich wie Java Build Tool course in 2011 (20)

GNU Autoconf / Automake #4
GNU Autoconf / Automake #4GNU Autoconf / Automake #4
GNU Autoconf / Automake #4
 
ASP.NET MVC 6 新功能探索
ASP.NET MVC 6 新功能探索ASP.NET MVC 6 新功能探索
ASP.NET MVC 6 新功能探索
 
使用 laravel 的前與後
使用 laravel 的前與後使用 laravel 的前與後
使用 laravel 的前與後
 
Docker 最佳实践
Docker 最佳实践Docker 最佳实践
Docker 最佳实践
 
從頭打造 C#、.NET 與 ASP.NET Core 開發環境
從頭打造 C#、.NET 與 ASP.NET Core 開發環境從頭打造 C#、.NET 與 ASP.NET Core 開發環境
從頭打造 C#、.NET 與 ASP.NET Core 開發環境
 
Ant
AntAnt
Ant
 
給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發
 
從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用
 
Android gradle 从入门到gg 0
Android gradle 从入门到gg 0Android gradle 从入门到gg 0
Android gradle 从入门到gg 0
 
Docker tutorial
Docker tutorialDocker tutorial
Docker tutorial
 
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
[2020 .NET Conf] 企業Azure DevOps Service 實際應用架構與秘辛
 
Clojure cnclojure-meetup
Clojure cnclojure-meetupClojure cnclojure-meetup
Clojure cnclojure-meetup
 
淺談 Groovy 與 Gradle
淺談 Groovy 與 Gradle淺談 Groovy 與 Gradle
淺談 Groovy 與 Gradle
 
Android JNI
Android JNIAndroid JNI
Android JNI
 
Maven初级培训
Maven初级培训Maven初级培训
Maven初级培训
 
02.python.开发最佳实践
02.python.开发最佳实践02.python.开发最佳实践
02.python.开发最佳实践
 
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
 
Flutter 踩雷心得
Flutter 踩雷心得Flutter 踩雷心得
Flutter 踩雷心得
 
构建可维护的Javascript 小米网
构建可维护的Javascript 小米网构建可维护的Javascript 小米网
构建可维护的Javascript 小米网
 
OpenEJB - 另一個選擇
OpenEJB - 另一個選擇OpenEJB - 另一個選擇
OpenEJB - 另一個選擇
 

Mehr von Ching Yi Chan

JCConf2016 Jenkins Pipeline
JCConf2016 Jenkins PipelineJCConf2016 Jenkins Pipeline
JCConf2016 Jenkins PipelineChing Yi Chan
 
JCConf2015: groovy to gradle
 JCConf2015: groovy to gradle JCConf2015: groovy to gradle
JCConf2015: groovy to gradleChing Yi Chan
 
using Queue Server for batch processing
using Queue Server for batch processingusing Queue Server for batch processing
using Queue Server for batch processingChing Yi Chan
 
idea: talk about the Active Cache
idea: talk about the Active Cacheidea: talk about the Active Cache
idea: talk about the Active CacheChing Yi Chan
 
Java web programming
Java web programmingJava web programming
Java web programmingChing Yi Chan
 
Android NDK (JUG@TW 2011, Oct.)
Android NDK (JUG@TW 2011, Oct.)Android NDK (JUG@TW 2011, Oct.)
Android NDK (JUG@TW 2011, Oct.)Ching Yi Chan
 

Mehr von Ching Yi Chan (12)

JCConf2016 Jenkins Pipeline
JCConf2016 Jenkins PipelineJCConf2016 Jenkins Pipeline
JCConf2016 Jenkins Pipeline
 
JCConf2015: groovy to gradle
 JCConf2015: groovy to gradle JCConf2015: groovy to gradle
JCConf2015: groovy to gradle
 
Linking error
Linking errorLinking error
Linking error
 
老舊web上雲端
老舊web上雲端老舊web上雲端
老舊web上雲端
 
using Queue Server for batch processing
using Queue Server for batch processingusing Queue Server for batch processing
using Queue Server for batch processing
 
idea: talk about the Active Cache
idea: talk about the Active Cacheidea: talk about the Active Cache
idea: talk about the Active Cache
 
Talk about fabric
Talk about fabricTalk about fabric
Talk about fabric
 
Java web programming
Java web programmingJava web programming
Java web programming
 
Android NDK (JUG@TW 2011, Oct.)
Android NDK (JUG@TW 2011, Oct.)Android NDK (JUG@TW 2011, Oct.)
Android NDK (JUG@TW 2011, Oct.)
 
Unit Testing
Unit TestingUnit Testing
Unit Testing
 
OSGi Small Lab
OSGi Small LabOSGi Small Lab
OSGi Small Lab
 
Osgi Intro
Osgi IntroOsgi Intro
Osgi Intro
 

Java Build Tool course in 2011

  • 1. Java Build ToolsJava Build Tools Ant & MavenAnt & Maven 2011, qrtt12011, qrtt1
  • 3. 關於軟體開發 • 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
  • 7. Build Tool • 建構工具 – 對每一個軟體專案來說,我們期待不管歷經多久,轉換過哪些 開發者。最新一批的維護者,將原始碼由版本控制系統取提出 來後,有辦法輕鬆地建構它。
  • 8. Build Tool • 建構工具 – 以事先準備的編譯腳本編譯 – 編譯條件、參數保存於檔案,即使換人來做也能有一致的結果 – Ant 與 Maven 是 Java 軟體開發最常用的 Build Tool
  • 9. Ant • Apache Ant – http://ant.apache.org – Java 專案中最廣泛使用的建構工具 – 能透過簡單的 XML 撰寫編譯腳本
  • 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 的時間
  • 15. Ant 手冊導覽 編譯用的相關 Task ,其中 Javac 是我們最常用的
  • 16. Ant 手冊導覽 每一個 Task 進去都會有詳細的說明
  • 17. Ant 手冊導覽 • Task 說明頁也包含完整的參數列表、是否為必要項目、 預設值是什麼
  • 18. Ant 手冊導覽 • 多數的 Task 會包含使用範例。這是我們使用、學習 Task 用法的重要參考資料:
  • 19. Ant In Daily • AntInDaily 專案的主要功能為 ConfigurationManager 。這是許多專 案開發時都會提供的類別,功能只有 負責讀入設定檔,並將它轉成物件。
  • 20. Ant In Daily • ConfigurationManager 會讀入 config.properties ,並提供 getDatabaseInfo() 方法,將部分的 參數集合成 DatabaseInfo 物件。
  • 21. Ant In Daily • 專案內有個 config 目錄,並且包含 二個子目錄 – dev – prod • 我們期望一般開發時,程式編譯是使 用 dev 目錄內的設定檔;當要編譯 正式環境版本時,要改用 prod 目錄 的設定檔
  • 22. Ant In Daily • IDE 能輔助開發,並且在程式語法完 整、正確時,替您編譯出最新的 .class 檔。
  • 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 + / ( 或自定不同的組合 )
  • 29. 撰寫 Build Script for Ant 將樣本多餘的部分刪除,留下一個 <target> 輸入 <jav 並使用撰碼提示
  • 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
  • 32. 撰寫 Build Script for Ant <mkdir> • 使用 <mkdir> 建立缺少的 build 目錄
  • 33. 撰寫 Build Script for Ant <mkdir>
  • 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
  • 37. Script For AntInDaily • 觀察看看: – 有哪些 XML Tag 或 Attribute 是新出現的呢?
  • 38. Script For AntInDaily • 參數獨立於設定檔
  • 39. Script For AntInDaily prepare compile package clean default
  • 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> 也許需知道哪些檔案該包進去
  • 48. <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>
  • 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
  • 62. 在 IDE 外執行 Ant • 開啟命令列,測試 Ant 安裝是否正確
  • 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 排程即可完成週期性任務
  • 66. Maven • Maven 的設計哲學: 使用慣例優先於組態設定 • Ant 沒有使用慣例的設計:任何專案都能由無到有地寫 出 Build Script 。使用上極為彈性,能做出 Build Tool 之外的應用。
  • 67. Maven • 專案結構上的慣例 – ${basedir} • src – main » java » resource – test » java » resource • target – classes
  • 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
  • 83. 安裝 Maven Command Tool • 設定 m2eclipse 增加新安裝的 Maven 目錄
  • 84. Maven Project • 安裝 m2eclipse 後, Eclipse 就能建立 Maven Project
  • 86. Maven Project • 選擇專案樣本: maven-archetype-quickstart
  • 87. Maven Project • 每個 Maven Project 必需有 – groupId – artificatId – version
  • 90. 在 IDE 中操作 Maven • Maven 設定管理功能表
  • 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 專案流程
  • 109. • 當專案開發已經進入一個階段,我們會將目前的專案發 佈至 Private Repository 供其他開發者使用。 – 修改 pom.xml 確定有發佈目標設定 – 修改 settings.xml 設定具有發佈權限的使用者帳號 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 專案流程