java gradle使用项目作为自己的注解处理器

uinbv5nw  于 2023-06-20  发布在  Java
关注(0)|答案(1)|浏览(151)

我正在制作一个包含注解处理器的库

.
├── lib
│   ├── build.gradle
│   └── src
│       ├── main
│       │   ├── java
│       │   │   └── demo
│       │   │       ├── MyAnnotation.java
│       │   │       └── MyAnnotationProcessor.java
│       │   └── resources
│       └── test
│           ├── java
│           │   └── demo
│           │       └── MyAnnotationProcessorTest.java
│           └── resources
└── settings.gradle

我想在MyAnnotationProcessorTest.java中使用@MyAnnotation
但在我构建或测试这个项目时,Gradle看起来根本没有处理这个注解。
为了便于调试,注解文件看起来像

package demo;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.MODULE, ElementType.PACKAGE, ElementType.TYPE_USE, ElementType.PARAMETER, ElementType.CONSTRUCTOR, ElementType.LOCAL_VARIABLE, ElementType.TYPE_PARAMETER, ElementType.ANNOTATION_TYPE, ElementType.RECORD_COMPONENT})
@Retention(RetentionPolicy.SOURCE)
public @interface MyAnnotation { }
package demo;

import java.util.Set;

import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.Processor;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import javax.tools.Diagnostic;

import com.google.auto.service.AutoService;

@SupportedAnnotationTypes("demo.MyAnnotation")
@AutoService(Processor.class)
public class MyAnnotationProcessor extends AbstractProcessor {
    @Override
    public SourceVersion getSupportedSourceVersion() {
        return SourceVersion.latest();
    }

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, ">>>>> process called <<<<<");
        return true;
    }
}

而测试文件只是到处喷了很多@MyAnnotation
我的build.gradle

plugins {
    id 'java-library'
}

repositories {
    mavenCentral()
}

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter:5.9.1'

    implementation 'com.google.auto.service:auto-service:1.1.1'
    annotationProcessor 'com.google.auto.service:auto-service:1.1.1'
}

// Apply a specific Java toolchain to ease working on different environments.
java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

tasks.named('test') {
    // Use JUnit Platform for unit tests.
    useJUnitPlatform()
}

但是当I gradle buildgradle test时,注解处理器没有输出。
我做了第二个项目,指定dependencies { annotationProcessor 'my-annotation-processor-project' }来测试注解处理器是否工作,当我构建该项目时,注解处理器的消息被记录下来。我希望在注解处理器的项目本身中使用注解时也记录它们。
如何在定义编译时注解处理器的同一个项目中测试和使用它?

pnwntuvh

pnwntuvh1#

我找到了一个适合我的解决方案。这感觉有点janky,不确定这是否会被推荐,所以我也期待着更好的答案。
我做了第二个gradle“模块”来做测试

.
├── lib
│   ├── build.gradle
│   └── src
│       └── main
│           └── java
│               └── demo
│                   ├── MyAnnotation.java
│                   └── MyAnnotationProcessor.java
├── test
│   ├── build.gradle
│   └── src
│       └── test
│           └── java
│               └── demo
│                   └── MyAnnotationProcessorTest.java
└── settings.gradle

settings.gradle必须添加include('test')(在可能已经有include('lib')的位置下
然后lib/build.gradle可以删除所有测试:

lib/build.gradle

plugins {
    id 'java-library'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'com.google.auto.service:auto-service:1.1.1'
    annotationProcessor 'com.google.auto.service:auto-service:1.1.1'
}

// Apply a specific Java toolchain to ease working on different environments.
java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

test/build.gradle进行测试

test/build.gradle

plugins {
    id 'java'
}

repositories {
    mavenCentral()
}

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter:5.9.1'

    testImplementation project(':lib')
    testAnnotationProcessor project(':lib')
}

// Apply a specific Java toolchain to ease working on different environments.
java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

tasks.named('test') {
    // Use JUnit Platform for unit tests.
    useJUnitPlatform()
}

我不认为任何./test模块会包含在./builds/libs/demo.jar构建结果中,但我不确定。

相关问题