作者: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。如果没有,可以使用包管理器 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):使用你的 shell 配置 文件(例如
~/.bash_profile
),将 Mavenbin
文件夹直接添加到你的路径中。- 将
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 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(不过我希望将来添加更多内容,因为我觉得资源有点分散),所以这里有一些有用的文章
- Maven 生命周期(对 clean、package、install 等目标的解释)