在混合Java/Kotlin项目中使用Dagger 2的Maven配置

Phi*_*ßen 6 java maven kotlin dagger-2

在混合Java/Kotlin项目中使用Dagger 2的推荐Maven设置是什么?

我找到了一个使用Gradle的示例项目:https://github.com/damianpetla/kotlin-dagger-example 与Maven类似的东西会非常有用.


更新:我尝试了什么?

我用从科特林配置kotlinlang.org/docs/reference/using-maven.html 和匕首配置google.github.io/dagger.我还使用了build-helper-maven-plugin插件来集成IDEA中的注释处理.

我的主要问题是我遇到了编译周期.我的配置混合了Kotlin的编译并调用了注释处理器,它生成了Dagger2类.我没有系统地尝试将两个阶段分开但缺乏更深入的Maven理解以使其工作.

Les*_*iak 3

javac 可以扫描源文件(java)和类来搜索注释: http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#processing

这意味着如果您没有在 Kotlin 代码中引用任何 Dagger 生成的类(这意味着 Dagger 模块实现),您就可以完成这项工作

  1. 调用 kotlin 编译器(Kotlin 代码中没有 Dagger 生成类型)
  2. 调用注释处理器(处理 java 文件和 kotlin 编译文件中的注释)
  3. 调用 java 编译器 - 可以访问 Dagger 生成的类型和 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>
Run Code Online (Sandbox Code Playgroud)

另一方面,如果您在 kotlin 代码中包含 Dagger 生成的类型,则必须在编译 kotlin 代码之前使这些类型可用,这意味着您需要 Kotlin 感知注释处理器 (KAPT)

在这种情况下,问题归结为一个问题: maven 是否支持 kapt?

遗憾的是,答案是否定的,但有一个错误文件支持它: https: //youtrack.jetbrains.com/issue/KT-14478