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-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, поэтому все файлы.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 ответ

Решение
  • Да, решение "хакерское", но плагин maven-compiler-plugin всегда является первым плагином, запускаемым на этапе компиляции (он как бы жестко запрограммирован в maven).
  • Я не тестировал Scala 2.11, но предыдущая версия Scalac не компилирует.java в.class (только анализирует их). и scala-maven-plugin предназначен для работы с "каждой версией scala" начиная с 2.7.
Другие вопросы по тегам