Scala 與 Maven

語言

作者 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。如果你沒有,可以使用套件管理員 MacPortsHomebrewFink 取得。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/binmv 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 函式庫(如上所述)、JUnitScalaTestSpecs2(後三者為測試架構;原型包含範例「Hello world」程式,並使用每個架構進行測試)。

說明此原型

在專案根目錄中,您會看到 pom.xmlsrc 資料夾和 target 資料夾(target 資料夾僅在建置後才會出現)。請注意:此原型還包含 .gitignore

src 資料夾中,您會看到 maintestmain 包含您的應用程式程式碼,test 包含您的測試套件。在每個資料夾中,您會找到 scala 資料夾,後面接著您的套件結構(實際上,test/scala 包含範例套件,但您應該用您自己的套件和測試取代它)。如果您想混合 Scala 和 Java 原始碼,只需在 maintest 中新增 java 資料夾即可。

target 包含已產生/建置的檔案,例如 .class.jar 檔案。您可以在 Maven 網頁 閱讀有關 pom.xml 的資訊。

範例結構

  • pom.xml
  • src
    • main
      • scala
        • com/my-package/… *.scala
      • java
        • com/my-package/… *.java
    • test
      • scala
        • com/my-package/… *.scala
      • java
        • com/my-package/… *.java
  • 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(儘管我希望未來能加入更多,因為我確實覺得這些資源有點分散),因此以下是一些有用的文章

此頁面的貢獻者