【问题标题】:Java 11-Kotlin annotation processorJava 11-Kotlin 注释处理器
【发布时间】:2020-07-28 14:15:33
【问题描述】:

我们有一个生成代码的注释处理器。该注释处理器自 2013 年以来一直在使用,并且可以正常工作。但是,我根本无法让它与 Kotlin 类一起使用。

java 的当前用法是

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>${maven-compiler-plugin.version}</version>
        <configuration>
            <annotationProcessors>
                <annotationProcessor>db.annotationprocessing.PropertyAnnotationProcessor</annotationProcessor>
            </annotationProcessors>
            <annotationProcessorPaths>
                <dependency>
                    <groupId>to.etc.domui</groupId>
                    <artifactId>property-annotations-processor</artifactId>
                    <version>1.2-SNAPSHOT</version>
                </dependency>
            </annotationProcessorPaths>
        </configuration>
    </plugin>
</plugins>

但这不会处理 kotlin,因为它是一个 java 编译器。所以我在此之前编译了 Kotlin,带有插件:

<plugin>
            <artifactId>kotlin-maven-plugin</artifactId>
            <groupId>org.jetbrains.kotlin</groupId>
            <version>${kotlin.version}</version>
            <executions>
                <execution>
                    <id>kapt</id>
                    <goals>
                        <goal>kapt</goal>
                    </goals>
                    <configuration>
                        <annotationProcessorArgs>
                            <processorArg>
                                kapt.kotlin.generated=${project.build.outputDirectory}/kaptStubs
                            </processorArg>
                        </annotationProcessorArgs>
                        <sourceDirs>
                            <sourceDir>src/main/java</sourceDir>
                            <sourceDir>src/test/java</sourceDir>
                        </sourceDirs>
                        <annotationProcessorPaths>
                            <!-- Specify your annotation processors here. -->
                            <annotationProcessorPath>
                                <groupId>to.etc.domui</groupId>
                                <artifactId>property-annotations-processor</artifactId>
                                <version>${domui.version}</version>
                            </annotationProcessorPath>
                        </annotationProcessorPaths>
                    </configuration>
                </execution>
                <execution>
                    <id>compile</id>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                    <configuration>
                        <sourceDirs>
                            <sourceDir>${project.basedir}/src/main/java</sourceDir>
                        </sourceDirs>
                    </configuration>
                </execution>
                <execution>
                    <id>test-compile</id>
                    <goals>
                        <goal>test-compile</goal>
                    </goals>
                    <configuration>
                        <sourceDirs>
                            <sourceDir>${project.basedir}/src/test/kotlin</sourceDir>
                            <sourceDir>${project.basedir}/src/test/java</sourceDir>
                        </sourceDirs>
                    </configuration>
                </execution>
            </executions>
        </plugin>

我将调试器附加到注释处理器,并预计在 kotlin-maven-plugin 期间会命中断点。这没有发生。它是在 java 编译期间发生的,并且我没有对 Kotlin 类进行任何引用来测试它。

奇怪的是,它在 /target/kaptStubs 下生成了类,IntellIJ 将其解释为 java 类,而将 target/classes/ 下的类解释为 Kotlin 类。

然而,这是警告: [警告] 'tools.jar' 未找到,kapt 可能工作不可靠。

环境:

java --version
openjdk 11.0.8 2020-07-14
OpenJDK Runtime Environment (build 11.0.8+10-post-Ubuntu-0ubuntu118.04.1)
OpenJDK 64-Bit Server VM (build 11.0.8+10-post-Ubuntu-0ubuntu118.04.1, mixed mode, sharing)

Kotlin 类被编译(我可以找到它的目标/类),但注释处理器甚至没有被触发。有人知道问题出在哪里吗?

【问题讨论】:

  • 这与您的问题无关。但是,我建议使用 Gradle 而不是 Maven。当我以前在 Kotlin 项目中使用 Maven 时,我遇到了很多问题。迁移到 Gradle 后就没有问题了。
  • 谢谢,但我现在无法更改...这样做确实需要大量工作。

标签: java maven kotlin annotation-processing


【解决方案1】:

由于某种原因,kapt 没有接上

META-INF/services/javax.annotation.processing.Processor

文件。我认为这是 kapt 中的一个错误,因为这是标准的做事方式。 绕过它的方法是通过定义来指定您想要的注释处理器:

    <annotationProcessors>
        <processor>db.annotationprocessing.PropertyAnnotationProcessor</processor>
    </annotationProcessors>

这仍然会在错误的目录中生成代码,但是嘿,至少它正在生成代码。

完整的执行步骤如下:

<execution>
                    <id>kapt</id>
                    <goals>
                        <goal>kapt</goal>
                    </goals>
                    <phase>process-sources</phase>
                    <configuration>
                        <sourceDirs>
                            <sourceDir>src/main/java</sourceDir>
                        </sourceDirs>
                        <annotationProcessorPaths>
                            <annotationProcessorPath>
                                <groupId>to.etc.domui</groupId>
                                <artifactId>property-annotations-processor</artifactId>
                                <version>${domui.version}</version>
                            </annotationProcessorPath>
                        </annotationProcessorPaths>
                        <annotationProcessors>
                            <processor>db.annotationprocessing.PropertyAnnotationProcessor</processor>
                        </annotationProcessors>
                    </configuration>
                </execution>

【讨论】:

    猜你喜欢
    • 2023-03-04
    • 2017-05-22
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多