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

我找到了一个使用Gradle的示例项目:https://github.com/damianpetla/kotlin-dagger-example
与Maven类似的方法将非常有帮助。

更新:我尝试了什么?

我使用了kotlinlang.org/docs/reference/using-maven.html的Kotlin配置
以及google.github.io/dagger中的Dagger配置。
我还使用了build-helper-maven-plugin插件将注释处理集成到IDEA中。

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

最佳答案

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

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

  • 调用kotlin编译器(在Kotlin代码中没有Dagger生成的类型)
  • 调用注释处理器(处理Java文件和Kotlin编译文件中的注释)
  • 调用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>
    

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

    在这种情况下,问题归结为一个问题:
    Is kapt supported in maven?

    不幸的是,答案是否定的,但是有一个错误需要支持它:
    https://youtrack.jetbrains.com/issue/KT-14478

    09-10 07:08
    查看更多