Scala 项目看家的构建工具当然是 SBT, 假如我们已习惯于 Maven, 想要用 Maven 来构建 Scala 项目该如何做呢?那首先要找到一个 Maven Scala 相应的 Archetype, 然后用命令 mvn archetype:generate
或是在 IntelliJ IDEA 使用 Maven 项目创建向导来选择一个 Maven Scala Archetype。这里主要介绍 IntelliJ IDEA 中 Maven 向导创建 Scala 项目的方式。
首先确保我们已安装了 IntelliJ IDEA 的 Maven 和 Scala 插件。插件中自带了 org.scala-tools.archetypes:scala-archetype-simple:1.2 的 Maven archetype, 这是一个貌视 Scala 官方的 archetype。我们可以尝试基于它来创建一个 Maven Scala 项目。通过 IntelliJ IDEA 的菜单 File/New/Project...
, 在弹出的窗口中选择 Maven/Create from archetype, 然后找到 scala-archetype-simple, 自带版本为 1.2, 当前最新版也不过 1.3, 那还是 2010 年建立,别提有多老了。
创建出来项目的 pom.xml 也不出所料
1 2 3 4 5 6 |
<properties> <maven.compiler.source>1.5</maven.compiler.source> <maven.compiler.target>1.5</maven.compiler.target> <encoding>UTF-8</encoding> <scala.version>2.8.0</scala.version> </properties> |
一切都太老了,实际上在当今的 IntelliJ IDEA(2017.2.6) 中该项目也无法运行。
所以我们需寻求更新的 Maven Scala Archetype,于是找到了 net.alchim31.maven:scala-archetype-simple:1.6, 它的版本号是 1.4, 1.5, 1.6,看来是来给官方的 scala-archetype-simple 续命来的,它的项目在 github 上可以找到 davidB/scala-archetype-simple。
我们需要在创建项目时把该 archetype 添加到 IntelliJ IDEA 中来,还是同样的创建 Maven 项目的向导,只是这时候我们要点击 Add Archetype...
按钮,在窗口中输入相应的
GroupId: net.alchim31.maven
ArtifactId: scala-archetype-simple
Version: 1.6
添加完后,我们选择该 Maven Archetype 来创建项目,输入自己项目的 GroupId, ArtifactId 等信息,生成项目后,我们可以查看一个 pom.xml 文件
1 2 3 4 5 6 7 |
<properties> <maven.compiler.source>1.6</maven.compiler.source> <maven.compiler.target>1.6</maven.compiler.target> <encoding>UTF-8</encoding> <scala.version>2.11.5</scala.version> <scala.compat.version>2.11</scala.compat.version> </properties> |
好像还不怎么新,可以自己把 Java 的改为 1.8, 或 Scala 的版本改为 2.12.* 的版本,改完了需作测试。
基于原始状态,我试着运行该项目的 App.scala, 报出错误
Error:scalac: bad option: '-make:transitive'
把 pom.xml 中的
<arg>-make:transitive</arg>
删掉,再运行,错误是
Error:(18, 18) not found: type JUnitRunner
@RunWith(classOf[JUnitRunner])
需要引入依赖
1 2 3 4 5 6 |
<dependency> <groupId>org.specs2</groupId> <artifactId>specs2-junit_${scala.compat.version}</artifactId> <version>3.7.2</version> <scope>test</scope> </dependency> |
并且在 specs.scala 测试类中引入 JUnitRunner
import org.specs2.runner.JUnitRunner
下面是我修复后的完整的 pom.xml 内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cc.unmi</groupId> <artifactId>spark-test</artifactId> <version>1.0-SNAPSHOT</version> <name>${project.artifactId}</name> <description>My wonderfull scala app</description> <inceptionYear>2015</inceptionYear> <licenses> <license> <name>My License</name> <url>http://....</url> <distribution>repo</distribution> </license> </licenses> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <encoding>UTF-8</encoding> <scala.version>2.11.7</scala.version> <scala.compat.version>2.11</scala.compat.version> </properties> <dependencies> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> <version>${scala.version}</version> </dependency> <!-- Test --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.specs2</groupId> <artifactId>specs2-core_${scala.compat.version}</artifactId> <version>3.7.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.specs2</groupId> <artifactId>specs2-junit_${scala.compat.version}</artifactId> <version>3.7.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.scalatest</groupId> <artifactId>scalatest_${scala.compat.version}</artifactId> <version>3.0.4</version> <scope>test</scope> </dependency> </dependencies> <build> <sourceDirectory>src/main/scala</sourceDirectory> <testSourceDirectory>src/test/scala</testSourceDirectory> <plugins> <plugin> <!-- see http://davidb.github.com/scala-maven-plugin --> <groupId>net.alchim31.maven</groupId> <artifactId>scala-maven-plugin</artifactId> <version>3.3.1</version> <executions> <execution> <goals> <goal>compile</goal> <goal>testCompile</goal> </goals> <configuration> <args> <arg>-dependencyfile</arg> <arg>${project.build.directory}/.scala_dependencies</arg> </args> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.20.1</version> <configuration> <useFile>false</useFile> <disableXmlReport>true</disableXmlReport> <!-- If you have classpath issue like NoDefClassError,... --> <!-- useManifestOnlyJar>false</useManifestOnlyJar --> <includes> <include>**/*Test.*</include> <include>**/*Suite.*</include> </includes> </configuration> </plugin> </plugins> </build> </project> |
下一步,将会把这个修复好的项目作为一个 g8 的项目模板。
Dec 8, 2017: 做成了一个 giter8(g8) 的 Maven Scala 2.11 项目模板,之所以特定于 Scala 2.11.x, 是因为换成 Scala 2.12.x 后其他的依赖也改动很大,目前主流上像 Spark(当前版本 2.2) 还是只支持 Scala 2.11.
如果安装了 giter8 的话,只需要输入一行命令
1 2 3 4 5 6 7 8 9 |
$ g8 yabqiu/maven-scala2.11-archetype Maven Scala 2.11 project template name [Maven Scala Project]: My Scala Test package [cc.unmi]: version [1.0-SNAPSHOT]: Template applied in /Users/yanbin/Workspaces/./my-scala-test |
再回答三个关于项目名,包名,版本的问题,一个基本的 Maven Scala 2.11 的项目便立马呈现在了你的面前。
关于 giter8(g8) 的使用请参考我一年多前的一篇日志:Giter8 -- 把项目布局模板放到 GitHub 上
链接:
- Creating a Scala Project with Maven Dependency Management for Gatling Testing in IntelliJ IDEA
- spark-in-action/scala-archetype-sparkinaction
- SCALA WITH MAVEN