今日、私はJavaとScalaコードの両方を含むMavenプロジェクトをセットアップするための適切なソリューションを見つけようとしています(それらの間に双方向の依存関係があります)。
私が見つけた解決策は通常、process-resources
フェーズでscala-maven-pluginまたはmaven-scala-pluginを呼び出して、デフォルトのmavenコンパイラプラグインの前に実行することで構成されています(例: http://www.hascode.com/2012/03 /snippet-mixing-scala-java-in-a-maven-project/、https://itellity.wordpress.com/2014/08/21/mixing-scala-and-java-in-a-maven-project/、公式の scala-maven-plugin ページ: http://davidb.github.io/scala-maven-plugin/example_java.html )。
これにより、次のようなソリューションが得られます。
<build>
<plugins>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<recompileMode>incremental</recompileMode>
<executions>
<execution>
<id>scala-compile</id>
<phase>process-resources</phase>
<goals>
<goal>add-source</goal>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>scala-test-compile</id>
<phase>process-test-resources</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
このソリューションはうまく機能します。フェーズで Scala コンパイルが呼び出され、 Java コードと Scala コードの両方がコンパイルされるため、Maven コンパイラ プラグインがフェーズprocess-resources
で実行されるときに .class ファイルがすべて準備されます。compile
問題は、このソリューションがきれいに見えないことです。コンパイル フェーズの前に Scala コンパイル プロセスを呼び出して、maven コンパイラ プラグインが「ハッキー」に見える前に実行されるようにします。
いずれにせよ、Scala コンパイラーは Java クラスをコンパイルするので、デフォルトの Maven コンパイラー・プラグインを完全にオフにすれば、Scala コンパイラーはcompile
フェーズで実行できると考えました。構成は少し長くなりますが、私にはずっときれいに見えます。
<build>
<plugins>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<recompileMode>incremental</recompileMode>
<executions>
<execution>
<id>scala-compile</id>
<phase>compile</phase>
<goals>
<goal>add-source</goal>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>scala-test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<executions>
<execution>
<id>default-compile</id>
<phase>none</phase>
</execution>
<execution>
<id>default-testCompile</id>
<phase>none</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
この解決策が、ブログの投稿や公式のプラグイン ページで推奨されていないのはなぜでしょうか。このアプローチに欠点はありますか? 最初のソリューションの代わりに 2 番目のソリューションを使用すると、予想される問題はありますか?