用maven构build一个scala应用程序(有java源代码混合)

我有一个应用程序,我想混合使用Java和Scala源代码(实际上是将java应用程序迁移到scala–但是每次都是这样)。

我可以在IDE中做这个工作,很好,非常好。 但是我不知道如何用maven做这个 – scalac可以编译java和scala交织在一起,但是我怎样才能为这个模块设置maven呢?

此外,我的Scala源必须是一个不同的文件夹到Java?

使用maven scala插件,像下面这样的configuration可以用于混合了java和scala源代码的项目(scala源代码当然会在/ scala目录中,正如其他人所提到的那样)。

你可以运行运行mvn编译,testing等等,它将一切正常。 非常好(它会自动运行scalac)。

对于一个伟大的IDE,IntelliJ 8很好地工作:添加scala插件,然后添加一个scala facet,然后调整scala的编译设置,首先运行scalac(关键是如果你有scala和java源的循环依赖)。

<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>demo</groupId> <artifactId>scala-java-app</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>scala-java-app</name> <repositories> <repository> <id>scala-tools.org</id> <name>Scala-tools Maven2 Repository</name> <url>http://scala-tools.org/repo-releases</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>scala-tools.org</id> <name>Scala-tools Maven2 Repository</name> <url>http://scala-tools.org/repo-releases</url> </pluginRepository> </pluginRepositories> <build> <plugins> <plugin> <groupId>org.scala-tools</groupId> <artifactId>maven-scala-plugin</artifactId> <executions> <execution> <id>compile</id> <goals> <goal>compile</goal> </goals> <phase>compile</phase> </execution> <execution> <id>test-compile</id> <goals> <goal>testCompile</goal> </goals> <phase>test-compile</phase> </execution> <execution> <phase>process-resources</phase> <goals> <goal>compile</goal> </goals> </execution> </executions> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> <version>2.7.2</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> 

是的,Scala部分必须在一个单独的模块和src/main/scala目录中。 Maven把像这样的混合来源视为异端。

通过导入scala maven插件来启用scala编译。 “使用”页面就是一个很好的例子。

我曾经问过关于如何在Maven项目中包含非Java代码的非常类似的问题 。 答案的要点是在每个编程语言的src下有一个不同的目录,并且find/编写一个Maven插件,它可以知道如何处理每个插件。 例如:

 src/ |-- main | |-- bin | |-- sh | |-- sql | |-- scala | |-- java | `-- resources |-- site ... 

看看Sonatype Maven Cookbook 第3章Scala和Maven

我之前通过在Scala中编写一个Maven模块而另一个在Java中解决了这个问题。 但是由于Scala和Java可以相互依赖(Java – > Scala – > Java或其他方式),所以这是非常需要的,没有多模块项目。

解决这个问题的工作正在进行中,你可以在这里阅读一下,而且新版本的maven-scala-plugin将很快发布。

这是一个小的项目链接( https://github.com/mebinjacob/mongo-scala-java-maven-poc ),我使用了scala,java和mongo db。

请注意,在项目的pom.xml中,可以指定scala文件的源文件夹,它可以与java或src / main / scala等不同的文件夹相同。 scala类没有要求在一个单独的src文件夹。 我已经尝试了他们两个,他们都很好。 我所指的那个pom被剪断了

  <build> <plugins> <plugin> <groupId>org.scala-tools</groupId> <artifactId>maven-scala-plugin</artifactId> <executions> <execution> <goals> <goal>compile</goal> <goal>testCompile</goal> </goals> </execution> </executions> <configuration> <sourceDir>src/main/scala</sourceDir> <jvmArgs> <jvmArg>-Xms64m</jvmArg> <jvmArg>-Xmx1024m</jvmArg> </jvmArgs> </configuration> </plugin> </plugins> </build> 

你需要结合几种方法来自由混合使用scala和java类。 这个解决scheme为我工作:

  <properties> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> <!-- <encoding>UTF-8</encoding> --> <scala.tools.version>2.10</scala.tools.version> <scala.version>2.10.3</scala.version> </properties> <build> <sourceDirectory>src/main/scala</sourceDirectory> <testSourceDirectory>src/test/scala</testSourceDirectory> <plugins> <plugin> <groupId>org.scala-tools</groupId> <artifactId>maven-scala-plugin</artifactId> <version>2.15.2</version> <executions> <execution> <id>scala-compile-first</id> <phase>process-resources</phase> <goals> <goal>compile</goal> </goals> </execution> <execution> <id>scala-test-compile</id> <phase>process-test-resources</phase> <goals> <goal>testCompile</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>net.alchim31.maven</groupId> <artifactId>scala-maven-plugin</artifactId> <version>3.1.3</version> <executions> <execution> <goals> <goal>compile</goal> <goal>testCompile</goal> </goals> <configuration> <args> <arg>-make:transitive</arg> <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.13</version> <configuration> <useFile>false</useFile> <disableXmlReport>true</disableXmlReport> <includes> <include>**/*Test.*</include> <include>**/*Suite.*</include> </includes> </configuration> </plugin> </plugins> </build>