Конфигурация Maven для использования Dagger 2 в смешанном проекте Java / Kotlin

Какая рекомендуемая настройка Maven для использования Dagger 2 в смешанном проекте Java / Kotlin?

Я нашел образец проекта, который использует Gradle: https://github.com/damianpetla/kotlin-dagger-example. Нечто похожее на Maven было бы очень полезно.


ОБНОВЛЕНИЕ: Что я пробовал?

Я использовал конфигурацию Kotlin из kotlinlang.org/docs/reference/using-maven.html и конфигурацию кинжала из google.github.io/dagger . Я также использовал плагин build-helper-maven- plugin для интеграции обработки аннотаций в IDEA.

Моя основная проблема заключалась в том, что я столкнулся с циклами компиляции. Моя конфигурация смешивала компиляцию Kotlin и вызывала процессор аннотации, который генерирует классы Dagger2. Я бессистемно пытался отделить обе фазы, но не обладал более глубоким пониманием Maven, чтобы заставить его работать.

javac может сканировать как исходные файлы (java), так и классы в поисках аннотаций: http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#processing

Это означает, что вы можете выполнить эту работу, если у вас нет классов, созданных кинжалом, на которые ссылается код Котлина (что означает реализацию модулей Dagger)

  1. invoke kotlin-компилятор (никаких типов сгенерированных кинжалами в коде Kotlin)
  2. вызывать обработчик аннотации (обрабатывает аннотации как в java-файлах, так и в файлах, скомпилированных kotlin)
  3. invoke java compiler – имеет доступ как к сгенерированным кинжалом типам, так и к типам Kotlin

Вы можете писать свои услуги как в java, так и в kotlin, но модуль должен быть создан с помощью класса java

Вот соответствующий pom.xml

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.test</groupId> <artifactId>testkotlindagger</artifactId> <version>1.0-SNAPSHOT</version> <properties> <kotlin.version>1.0.6</kotlin.version> <dagger2.version>2.7</dagger2.version> </properties> <dependencies> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-stdlib</artifactId> <version>${kotlin.version}</version> </dependency> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-test</artifactId> <version>${kotlin.version}</version> <scope>test</scope> </dependency> <!-- Dagger 2 --> <dependency> <groupId>com.google.dagger</groupId> <artifactId>dagger</artifactId> <version>${dagger2.version}</version> </dependency> <dependency> <groupId>com.google.dagger</groupId> <artifactId>dagger-compiler</artifactId> <version>${dagger2.version}</version> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>kotlin-maven-plugin</artifactId> <groupId>org.jetbrains.kotlin</groupId> <version>${kotlin.version}</version> <executions> <execution> <id>compile</id> <phase>compile</phase> <goals> <goal>compile</goal> </goals> <configuration> <sourceDirs> <source>src/main/java</source> <source>src/main/kotlin</source> </sourceDirs> </configuration> </execution> <execution> <id>test-compile</id> <phase>test-compile</phase> <goals> <goal>test-compile</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.bsc.maven</groupId> <artifactId>maven-processor-plugin</artifactId> <version>2.2.4</version> <executions> <execution> <id>process</id> <goals> <goal>process</goal> </goals> <phase>compile</phase> <configuration> <outputDirectory>target/generated-sources/annotations</outputDirectory> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <executions> <!-- Replacing default-compile as it is treated specially by maven --> <execution> <id>default-compile</id> <phase>none</phase> </execution> <!-- Replacing default-testCompile as it is treated specially by maven --> <execution> <id>default-testCompile</id> <phase>none</phase> </execution> <execution> <id>java-compile</id> <phase>compile</phase> <goals> <goal>compile</goal> </goals> </execution> <execution> <id>java-test-compile</id> <phase>test-compile</phase> <goals> <goal>testCompile</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project> 

С другой стороны, если вы включаете типы сгенерированных кинжалом в свой код kotlin, вы должны иметь их доступными до компиляции кода kotlin, что означает, что вам нужен обработчик комментариев Kotlin (KAPT)

В этом сценарии проблема сводится к вопросу: поддерживается ли kapt в maven?

К сожалению, ответ отрицательный, но есть ошибка, поданная для его поддержки: https://youtrack.jetbrains.com/issue/KT-14478