我正在制作一个包含注解处理器的库
.
├── 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 build
或gradle test
时,注解处理器没有输出。
我做了第二个项目,指定dependencies { annotationProcessor 'my-annotation-processor-project' }
来测试注解处理器是否工作,当我构建该项目时,注解处理器的消息被记录下来。我希望在注解处理器的项目本身中使用注解时也记录它们。
如何在定义编译时注解处理器的同一个项目中测试和使用它?
1条答案
按热度按时间pnwntuvh1#
我找到了一个适合我的解决方案。这感觉有点janky,不确定这是否会被推荐,所以我也期待着更好的答案。
我做了第二个gradle“模块”来做测试
settings.gradle
必须添加include('test')
(在可能已经有include('lib')
的位置下然后
lib/build.gradle
可以删除所有测试:lib/build.gradle
和
test/build.gradle
进行测试test/build.gradle
我不认为任何
./test
模块会包含在./builds/libs/demo.jar
构建结果中,但我不确定。