Maven: Java und Scala in einem Projekt mischen

Heute habe ich versucht, eine geeignete Lösung zum Einrichten eines Maven-Projekts zu finden, das sowohl Java- als auch Scala-Code enthält (mit wechselseitigen Abhängigkeiten).

Die Lösungen, die ich gefunden habe, bestehen normalerweise darin, das Scala-Maven-Plugin oder das Maven-Scala-Plugin im @ aufzurufeprocess-resources phase, damit es vor dem Standard-Maven-Compiler-Plugin ausgeführt wird (Beispiele: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, die offizielle Scala-Maven-Plugin-Seite:http: //davidb.github.io/scala-maven-plugin/example_java.htm).

Das führt zu der Lösung, die so aussieht:

<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>

Diese Lösung funktioniert gut - Die Scala-Kompilierung wird im @ aufgerufeprocess-resources phase und kompiliert sowohl Java- als auch Scala-Code, sodass alle .class-Dateien bereit sind, wenn das Maven-Compiler-Plugin im @ ausgeführt wircompile phase.

Das Problem ist, dass diese Lösung für mich nicht sauber aussieht. Aufrufen des Scala-Kompilierungsprozesses vor der Kompilierungsphase, um sicherzustellen, dass er ausgeführt wird, bevor das Maven-Compiler-Plugin "hacky" zu sein scheint.

Scala-Compiler kompiliert sowieso Java-Klassen, also dachte ich, ich könnte das Standard-Maven-Compiler-Plugin einfach komplett ausschalten und dann den Scala-Compiler im @ ausführecompile Phase. Es sieht für mich viel sauberer aus, obwohl die Konfiguration etwas länger ist:

<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>

Ich frage mich, warum diese Lösung nicht in Blog-Posts oder auf der offiziellen Plugin-Seite empfohlen wird. Gibt es Nachteile bei diesem Ansatz? Gibt es irgendwelche Probleme, mit denen ich bei der Verwendung der zweiten Lösung anstelle der ersten rechnen sollte?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage