作者 Adrian Null
簡介
Maven 是一種建置/專案管理工具。它偏好「慣例優於設定」;它可以大幅簡化「標準」專案的建置,而且 Maven 使用者通常只要查看 pom.xml
(專案物件模型)就能了解其他 Maven 專案的結構。Maven 是一種基於外掛的架構,讓使用者可以輕鬆地將新的程式庫和模組新增到現有的專案中。例如,新增一個新的相依項通常只需要在 pom.xml
中新增 5 行額外的程式碼。這些「成品」會從存放庫(例如 中央存放庫)下載。
您也可以查看官方 範例專案,它使用我們在此處展示的 Scala 外掛。
跳到前面
如果您熟悉 Maven,您可以繼續使用 Scala Maven 外掛。
Scala Maven 外掛
我們將使用 Scala Maven 外掛程式(GitHub 儲存庫,網站)(以前稱為 maven-scala-plugin;重新命名以符合新的命名政策,其中只有 Maven 核心外掛程式會加上「maven」前綴),這是目前為止 Scala 專案最主要的 plugin。注意:此 plugin 包含了中央儲存庫中的 Scala,因此如果你使用 Maven 編譯,就不需要自己安裝。
取得 Maven
Linux (Debian)
在 Debian 和 Debian 的衍生版本中,Maven 通常可透過 apt-get
取得。只要執行 (sudo) apt-get install maven
即可開始使用。
OSX
10.9 (Mavericks) 之前的 OSX 內建 Maven 3。如果你沒有,可以使用套件管理員 MacPorts、Homebrew 或 Fink 取得。Scala Maven 外掛程式需要 Maven 3.0+。
手動(Red Hat Linux、OSX、Windows)
你可以從 Apache 主頁 下載 Maven。解壓縮後(tar -zxvf apache-maven-X.X.X-bin.tar.gz
,或使用類似 7-zip 的工具)到你的目錄(在 Linux 和 OSX 等類 Unix 系統中,我喜歡將它們放在 /opt/
。在 Windows 中,我可能會將它們放在 C:/
),你需要將 Maven 加入環境路徑變數。
- Linux/OSX(選項 1):建立一個指向
/usr/bin
的符號連結,它已經在你的路徑中。ln -s /usr/bin/mvn /opt/apache-maven-X.X.X/bin/mvn
- Linux/OSX(選項 2):直接將 Maven
bin
資料夾加入路徑,使用你的 shell 設定 檔案(例如~/.bash_profile
)。- 將
export PATH=$PATH:/opt/apache-maven-X.X.X/bin
加入.bash_profile
(或你使用的 shell 的設定檔)。 - 範例:
echo "export PATH=$PATH:/opt/apache-maven-X.X.X/bin" >> ~/.bash_profile
- 將
- Linux/OSX(選項 3):在現有的路徑位置中建立一個
mvn
shell 程式碼- 範例:您的路徑中包含
$HOME/bin
- 將您解壓縮的資料夾放入
$HOME/bin
(mv apache-maven-X.X.X "$HOME/bin/"
) - 在
$HOME/bin
中建立一個檔案mvn
- 將
"$HOME/bin/apache-maven-X.X.X/bin/mvn" $@
加入其中,並執行chmod u+x mvn
使其可執行 - 這可能是最不具侵入性的方式;
$HOME/bin
通常會預設加入使用者的路徑中,即使沒有,這也是一個有用的做法/功能。shell 程式碼只會呼叫 Maven 位置(位於其他位置)並傳遞引數
- 範例:您的路徑中包含
- Windows
- 按一下「開始」。在「我的電腦」上按一下滑鼠右鍵,然後移至「內容」
- 這會將您帶到「控制台 -> 系統和安全性 -> 系統」,提供電腦的概觀
- 在左側邊欄中應該有四個選項;按一下「進階系統設定」(第四個)
- 在「進階」標籤中,按一下右下角的「環境變數...」
- 注意:建議您建立/編輯使用者變數(頂端方塊)。您也可以對系統變數(底端方塊)執行相同的動作
- 建立一個名為「MAVEN3_HOME」的新變數。將此變數指向您的 Maven 資料夾(例如
C:\apache-maven-X.X.X
)。為安全起見,請使用反斜線,且不要包含尾斜線 - 建立一個名為「MAVEN3_BIN」的新變數,其值為:
%MAVEN3_HOME%\bin
- 編輯您的路徑變數:小心不要變更其他任何內容,將
;%MAVEN3_BIN%
附加在後面 - 您需要重新啟動 cmd 才能看到這些變更
建立您的第一個專案
建立新專案最簡單的方式是使用「“原型”」。原型是一種專案的通用架構結構或範本。回想一下「慣例優於組態」;在我們的案例中,Scala Maven 外掛程式提供一個適用於 scala 專案的原型。
您可以這樣執行原型外掛程式
mvn archetype:generate -DarchetypeGroupId=net.alchim31.maven -DarchetypeArtifactId=scala-archetype-simple
如果您是第一次執行,您會注意到 Maven 正在下載許多 jar 檔案。Maven 會解析相依關係並視需要下載(且僅下載一次)。目前,Maven 正在下載其核心外掛程式。
接下來,Maven 會要求您提供 groupId、artifactId 和 package。您可以閱讀 命名慣例指南,但簡而言之
- groupId:反向網域名稱(例如 com.my-organization)
- artifactId:專案名稱(例如 playground-project)
- version:任何您想要的,但我建議您閱讀並遵循 語意化版本控制 的準則(例如 0.0.1)
- package:預設值為 groupId,但您可以變更此設定(例如 com.my-organization)
groupId 和 artifactId 應共同用於專案的全球唯一識別碼
完成後,您應該會看到一個以 artifactId 命名的新資料夾。使用 cd
進入資料夾並執行
mvn package
您會看到 Maven 下載相依項,包括 Scala 函式庫(如上所述)、JUnit、ScalaTest 和 Specs2(後三者為測試架構;原型包含範例「Hello world」程式,並使用每個架構進行測試)。
說明此原型
在專案根目錄中,您會看到 pom.xml
、src
資料夾和 target
資料夾(target 資料夾僅在建置後才會出現)。請注意:此原型還包含 .gitignore
在 src
資料夾中,您會看到 main
和 test
;main
包含您的應用程式程式碼,test
包含您的測試套件。在每個資料夾中,您會找到 scala
資料夾,後面接著您的套件結構(實際上,test/scala
包含範例套件,但您應該用您自己的套件和測試取代它)。如果您想混合 Scala 和 Java 原始碼,只需在 main
或 test
中新增 java
資料夾即可。
target
包含已產生/建置的檔案,例如 .class
和 .jar
檔案。您可以在 Maven 網頁 閱讀有關 pom.xml
的資訊。
範例結構
- pom.xml
- src
- main
- scala
- com/my-package/… *.scala
- java
- com/my-package/… *.java
- scala
- test
- scala
- com/my-package/… *.scala
- java
- com/my-package/… *.java
- scala
- main
- target …
同樣地,您可以在其 網站 上閱讀更多有關 Scala Maven 外掛程式。
建立 Jar
預設情況下,Scala Maven 外掛程式建立的 jar 檔不會在清單中包含 Main-Class
屬性。我必須將 Maven 組合外掛程式 加入我的 pom.xml
,才能在清單中指定自訂屬性。您可以在 專案摘要 或 中央儲存庫 中查看此外掛程式的最新版本
<project ...>
<modelVersion>X.X.X</modelVersion>
...
<licenses>
...
</licenses>
<properties>
...
</properties>
<dependencies>
...
</dependencies>
<build>
...
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.your-package.MainClass</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
加入此外掛程式後,mvn package
也會在 target
下建立 [artifactId]-[version]-jar-with-dependencies.jar
。注意:這也會將 Scala 函式庫複製到您的 Jar 檔中。這是正常的。請注意,您的相依項使用相同版本的 Scala,否則您很快就會得到一個龐大的 Jar 檔。
有用的指令
mvn dependency:copy-dependencies
:將所有函式庫和相依項複製到target/dependency
資料夾mvn clean
mvn package
:編譯、執行測試,並建立 jar 檔
加入相依項
我做的第一件事是在專案頁面中尋找「Maven」。例如,Google 的 [Guava] 頁面包含 Maven Central 連結。正如您在先前連結中所見,中央儲存庫會在左側邊欄中包含您必須加入 pom.xml
的片段。
如果您在專案頁面中找不到 Maven 資訊,請嘗試使用 Google 搜尋「[專案名稱] maven」。有時,您仍然找不到任何資訊。對於 scopt(Scala 命令列選項剖析器),我無法從 Google 找到最新版本。不過,手動搜尋中央儲存庫可以
之後,執行
mvn package
會在封裝之前下載任何新的相依項
其他有用的閱讀資料
我不會在本教學中說明所有 Maven(儘管我希望未來能加入更多,因為我確實覺得這些資源有點分散),因此以下是一些有用的文章
- Maven 生命週期(說明目標,例如 clean、package、install)