Maven: смешивание Java и Scala в одном проекте

Сегодня я пытался найти правильное решение для настройки проекта maven, который содержит как Java, так и Scala-код (с двусторонними зависимостями между ними).

Решения, которые я нашел, обычно состоят из вызова scala-maven-plugin или maven-scala-plugin вprocess-resources фаза, чтобы он запускался перед плагином 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: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, так что все файлы .class готовы, когда плагин компилятора maven запускается в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>

Мне интересно, почему это решение не рекомендуется в сообщениях блога или на официальной странице плагина. Есть ли недостатки этого подхода? Есть ли какие-либо проблемы, которые я должен ожидать, используя вторые решения вместо первого?

Ответы на вопрос(1)

Ваш ответ на вопрос