使用 Maven 的 Scala

语言

作者: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 项目的主导插件。注意:该插件包含来自中央存储库的 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):使用你的 shell 配置 文件(例如 ~/.bash_profile),将 Maven bin 文件夹直接添加到你的路径中。
    • 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 Assembly 插件 添加到我的 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(不过我希望将来添加更多内容,因为我觉得资源有点分散),所以这里有一些有用的文章

此页面的贡献者