web-dev-qa-db-ja.com

Maven:1つのプロジェクトでJavaとScala

今日、私は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コンパイルはprocess-resourcesフェーズで呼び出され、JavaとScalaの両方をコンパイルします= mavenコンパイラプラグインがcompileフェーズで実行されると、.classファイルがすべて準備できるようにコードを記述します。

問題は、この解決策が私にはきれいに見えないことです。コンパイルフェーズの前に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番目のソリューションを使用すると予想される問題はありますか?

16
  • はい、解決策は「ハッキー」ですが、maven-compiler-pluginは常にコンパイルフェーズで実行される最初のプラグインです(mavenにハードコードされているようなものです)。
  • scala 2.11でテストしませんでしたが、以前のバージョンのscalacは.Javaを.classにコンパイルしません(それらを解析するだけです)。scala-maven-pluginは "で実行されます。 2.7以降の「scalaのすべてのバージョン」。
11
David Bernard