Создание приложения scala с maven (который имеет источник java, смешанный)
У меня есть приложение, в котором я хотел бы смешать Java и Scala source (на самом деле его миграция java - приложения в scala-но немного за раз).
Я могу сделать эту работу в IDEs просто отлично, очень приятно. Но я не уверен, как это сделать с maven - scalac может скомпилировать java и scala переплетены, но как я могу настроить maven для модуля?
кроме того, должен ли мой источник scala быть другой папкой для java?
7 ответов:
используя плагин Maven scala, конфигурация, подобная приведенной ниже, будет работать для проекта, который смешивает java и источник scala (источник scala, конечно, идет в каталог /scala, как упоминалось кем-то другим).
вы можете запустить run mvn compile, test и т. д... и все это будет работать как обычно. Очень приятно (он будет запускать scalac сначала автоматически).
для отличной IDE IntelliJ 8 отлично работает: добавьте в плагин scala, затем добавьте фасет scala, а затем настройте параметр компиляции для 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 должна быть в отдельном модуле и в . Мэйвен рассматривает смешанный источник как ересь.
вы включаете компиляцию scala, импортируя плагин scala maven. Элемент "статистика" страница как хороший пример.
Я как-то спросил a очень похожий вопрос о том, как включить код не Java в проект Maven. Суть ответа заключалась в том, чтобы иметь под src другой каталог для каждого языка программирования и найти/написать плагин Maven, который знал бы, что делать с каждым. Например:
src/ |-- main | |-- bin | |-- sh | |-- sql | |-- scala | |-- java | `-- resources |-- site ...
посмотрите на Sonatype Maven Cookbook Глава 3. Скала и мавен
Я решил это некоторое время назад, имея один модуль Maven, написанный на Scala, а другой на Java. Но поскольку Scala и Java могут пересекаться, зависят друг от друга (Java -> Scala -> Java или наоборот), то это очень желательно без многомодульных проектов.
ведется работа по решению этой проблемы, вы можете прочитать об этом здесь и новая версия Maven-scala-плагин будет выпущен в ближайшее время.
вот небольшая ссылка на проект (https://github.com/mebinjacob/mongo-scala-java-maven-poc), что я сделал с помощью scala, java и mongo db.
Примечание в pom.xml проекта можно указать исходную папку файлов scala он может быть таким же, как у java или другой папки, как src/main/scala. Нет никакого мандата для классов scala, чтобы быть на отдельных папках src. Я пробовала оба и оба отлично работают. Фрагмент Пома, которым я являюсь имею в виду
<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. Это решение работало для меня:
<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>