我有兴趣为maven-processor-plugin编写注释处理器.我对Maven比较新.
在项目路径中应该处理器Java源代码的位置(例如:src/main/java/...)以便它被适当地编译,但不会最终作为我的工件JAR文件的一部分?
目前我在eclipse中为一个项目生成带有注释处理器的文件
Right click on project > Run As > Maven Clean
Right click on project > Run As > Maven install
Run Code Online (Sandbox Code Playgroud)
这非常耗时.如何设置eclipse以使其在保存时运行注释处理器?
我有"自动构建"功能集,但它似乎忽略了注释处理器.BTW我正在使用m2e apt插件"自动配置JDT APT激活".
我正在尝试编写一个自定义的Anntoation处理器.注释处理器将在编译时处理每个类文件以检查注释,但是我如何才能获得它当前正在处理的类?我只能在以下代码中获取类名.
public class AnnotationProcessor extends AbstractProcessor {
......
@Override
public boolean process(Set<? extends TypeElement> annotations,
RoundEnvironment roundEnv) {
Set<? extends Element> rootE=roundEnv.getRootElements();
for(Element e: rootE) {
if(e.getKind()==ElementKind.CLASS) {
String className= e.getSimpleName().toString();
processingEnv.getMessager().printMessage( javax.tools.Diagnostic.Kind.WARNING,className, e);
}
}
}
Run Code Online (Sandbox Code Playgroud) 我已经编写了一个Java注释处理器,通过扩展javax.annotation.processing.AbstractProcessor在Eclipse上下文中调用它并且工作正常,除了我需要有关处理器工作的源路径和类路径的更多信息:
@SupportedAnnotationTypes({"MyAnno"})
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class Processor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
// this used to work in Java4 but not anymore (since Java6?):
String sourcePath = processingEnv.getOptions().get("sourcepath");
String classPath = processingEnv.getOptions().get("classpath");
for (Element e : roundEnv.getElementsAnnotatedWith(MyAnno.class)) {
myProcess(e, sourcePath, classPath);
}
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是如何在注释处理上下文(实现process)中检索一个有效的JavaFileManager,它可以给出源路径和当前正在执行注释处理器的编译器的类路径.最好,我会找到一个不涉及对Eclipse/JDT特定接口的依赖的解决方案.
我已经试过这不以下不工作:
DiagnosticCollector<JavaFileObject> diagnostics =
new DiagnosticCollector<JavaFileObject>();
StandardJavaFileManager fm = ToolProvider.getSystemJavaCompiler().getStandardFileManager(diagnostics, null, null);
fm.getLocation(StandardLocation.CLASS_PATH); // prints an empty class …Run Code Online (Sandbox Code Playgroud) 我想知道是否可以通过注释处理器生成一个类,它将是要编译的类的内部类.
例如,在编译类时A,生成类A$Foo.我想知道是否有一个可以使用的技巧.我觉得有可能生成一些源代码,这些源代码将在与内部类相同的字节代码中编译.并且,在编译/运行时,JVM将其用于内部类,并允许访问外部类私有字段.
这个问题背后的想法,虽然它可能看起来或多或少是技术性的,但它不是一个noobie问题,是能够使用私有可见性修饰符来注释字段,如Dagger,ButterKnife等.私有修饰符允许检测未使用的字段更容易,而包私人保护隐藏它们.
或者是否有任何解决方法,任何方式来充分利用这两个词?
我有一个简单的注释处理器,需要从与注释类相同的项目中读取配置文件.结构示例:
- myproject
- src
- main
- java
- my.package.SourceFile
- resources
- config.json
Run Code Online (Sandbox Code Playgroud)
在注释处理器中,我尝试读取文件:
FileObject resource = processingEnv.getFiler().getResource(StandardLocation.SOURCE_PATH, "", "config.json");
Run Code Online (Sandbox Code Playgroud)
但它会抛出FileNotFoundException.我也尝试过其他路径,例如../resources/config.json(抛出Invalid relative name: ../resources/config.json).我尝试将配置文件放入src/main/java(甚至src/main/java/my/package),我不喜欢,但仍然会抛出FileNotFoundException.
如果我可以filer.getResource()告诉我它在哪里,它会有所帮助.为了找到答案,我尝试生成一个文件:
filer.createResource(StandardLocation.SOURCE_OUTPUT, "", "dummy");
Run Code Online (Sandbox Code Playgroud)
产生于myproject/build/classes/main/dummy.不幸的是,我无法生成SOURCE_PATH,因此无法找到它.
我正在为Kotlin开发注释处理器,因为处理过的元素是用Java编写的,我没有收到?带有@Nullable注释的nullables ,这很好,但是我遇到了在类型和高阶函数中接收空参数的问题,对于正常参数.
var someNullField: String? = ""
Run Code Online (Sandbox Code Playgroud)
我将在其注释java.lang.String过程@org.jetbrains.annotations.Nullable中收到.
但是List<String?>例如将返回我java.util.List<java.lang.String>没有任何注释不在主元素中而不在类型参数中导致未知的可空性状态
我尝试使用javax.lang.model.util.Types找到某种结果,但没有.
我现在使用的一些代码:
val utils = processingEnvironment.typeUtils
val type = fieldElement.asType()
if (type is DeclaredType) {
val typeElement = utils.asElement(type)
type.typeArguments
.forEach {
//Trying different ways and just printing for possible results
val capture = utils.capture(it)
val erasure = utils.erasure(it)
val element = utils.asElement(it)
printMessage("element: $element isNullable: ${element.isNullable()} isNotNull: ${element.isNotNull()}\ncapture: $capture isNullable: ${capture.isNullable()} isNotNull: ${capture.isNotNull()}\nerasure: $erasure isNullable: ${erasure.isNullable()} …Run Code Online (Sandbox Code Playgroud) 在 IntelliJ 上,我得到了一个Spring Boot 配置注释处理器,该处理器未配置为具有 @ConfigurationProperties。下面是我的课:
@Configuration
@ConfigurationProperties(prefix = "abc")
@Data
@RefreshScope
class Config {
String propA;
String propB;
...
}
Run Code Online (Sandbox Code Playgroud)
我不确定是什么原因造成的,当我单击扳手进行设置时,我没有看到任何用于配置元数据文件的选项。
我创建了一个注释,将其应用于DTO并编写了Java 1.6样式的annotationProcessor.我可以看到如何让annotationProcessor编写一个新的源文件,这不是我想要做的,我看不到或者找不到如何修改现有的类(理想情况下只是修改字节代码).修改实际上是相当简单的,我希望处理器做的就是插入一个新的getter和setter,其名称来自正在处理的注释的值.
我的注释处理器看起来像这样;
@SupportedSourceVersion(SourceVersion.RELEASE_6)
@SupportedAnnotationTypes({ "com.kn.salog.annotation.AggregateField" })
public class SalogDTOAnnotationProcessor extends AbstractProcessor {
@Override
public boolean process(final Set<? extends TypeElement> annotations, final RoundEnvironment roundEnv) {
//do some stuff
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试学习如何制作自定义注释处理器,而我却一直试图调试它.
我已经设法在调试模式下运行javac编译器(使用mvnDebug clean install)(与其他人的项目一起使用注释处理器),使用IntelliJ IDEA连接到它并让它停在注释处理器的断点处.
如果我们在项目的某些包中有这样的东西,就像任何其他类一样(例如,没有特殊配置或任何东西):
public class MyProcessor extends AbstractProcessor {...}
Run Code Online (Sandbox Code Playgroud)
我们能否以某种方式将其作为注释处理器挂钩到maven的构建过程中?因此首先编译它,然后整个项目在注释处理器处于活动状态时进行编译.
另外,据我所知,注释处理器需要某种META INF文件,可以使用google autoservices注释处理器生成.
所以也许是一个maven构建过程,我们首先运行自动服务,然后将扩展AbstractProcessor的类作为注释处理器进行编译,最后让整个项目使用我们自己的注释处理器进行编译(并在调试模式下使用javac编译器).