升级到gradle 4.7后,我之前的无警告版本现在会发出此警告:
在编译类路径上检测到以下注释处理器:'lombok.launch.AnnotationProcessorHider $ AnnotationProcessor'和'lombok.launch.AnnotationProcessorHider $ ClaimingProcessor'.不推荐在编译类路径上检测注释处理器,Gradle 5.0将忽略它们.请将它们添加到注释处理器路径中.如果您不打算使用注释处理器,则可以使用'-proc:none'编译器参数来忽略它们.
似乎不推荐使用注释处理器,并且gradle版本5.0不支持注释处理器.
我的项目使用lombok,它需要处理注释处理器,因此使用-proc:none不是一种选择.当verison 5.0发布时,它们都不会停止使用Gradle.
我如何能:
我正在尝试编写一个注释处理器来在类上插入方法和字段......而且文档非常稀疏.我没有走得太远,我不知道我是否正确接近它.
处理环境提供了一个Filer对象,该对象具有用于创建新源和类文件的方便方法.那些工作正常,但后来我试图弄清楚如何读取现有的源文件,它提供的只是"getResource".所以在我的处理器实现中我做到了:
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
try {
for (TypeElement te : annotations) {
for (Element element : roundEnv.getElementsAnnotatedWith(te)) {
FileObject in_file = processingEnv.getFiler().getResource(
StandardLocation.SOURCE_PATH, "",
element.asType().toString().replace(".", "/") + ".java");
FileObject out_file = processingEnv.getFiler().getResource(
StandardLocation.SOURCE_OUTPUT, "",
element.asType().toString().replace(".", "/") + ".java");
//if (out_file.getLastModified() >= in_file.getLastModified()) continue;
CharSequence data = in_file.getCharContent(false);
data = transform(data); // run the macro processor
JavaFileObject out_file2 = processingEnv.getFiler().createSourceFile(
element.asType().toString(), element);
Writer w = out_file2.openWriter();
w.append(data);
w.close();
} …Run Code Online (Sandbox Code Playgroud) 我正在玩Java(javax)注释处理.
假设我有方法的注释:
@Target(ElementType.METHOD)
public @interface MethodAnnotation { }
Run Code Online (Sandbox Code Playgroud)
现在我想处理所有使用带注释的方法从类型中重写的方法:
interface MyInterface() {
@MethodAnnotation
void f()
}
class MyClass implements MyInterface {
override void f() { } // <- I want to process this method
}
Run Code Online (Sandbox Code Playgroud)
@Inherited 元注释似乎不适合这里:
请注意,如果使用带注释的类型来注释除类之外的任何内容,则此元注释类型不起作用.
此外,是否可以处理未在子类中重写的继承类方法?像这样:
class MyClass {
@MethodAnnotation
void f() { }
}
class MySubClass extends MyClass { } // <- I want to process its f()
// or at least to find out that it doesn't
// override the method
Run Code Online (Sandbox Code Playgroud)
如何访问某个方法中的覆盖方法AbstractProcessor?
我想,要实现这一点,我需要找到eclosing类的子类,但我还没有找到一种方法来做到这一点. …
我试图使用Annotation Processors来生成特定Factory接口的实现.这些接口看起来如下:
public interface ViewFactory<T extends View> {
<S extends Presenter<T>> T create(S presenter);
}
Run Code Online (Sandbox Code Playgroud)
和
public interface PresenterFactory<T extends View> {
<S extends Presenter<T>> S create();
}
Run Code Online (Sandbox Code Playgroud)
Annotation Processor正在执行正确的操作,并为每个匹配的类生成一个工厂,该工厂使用相应的注释进行注释.
注释处理器的输出如下:
public final class TestViewImplFactory implements ViewFactory {
public final TestView create(TestPresenter presenter) {
return new TestViewImpl(presenter);
}
}
Run Code Online (Sandbox Code Playgroud)
和相应的其他类:
public final class TestPresenterImplFactory implements PresenterFactory {
public final TestPresenter create() {
return new TestPresenterImpl();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,TestViewImplFactory无法编译.错误消息是:
"类'TestViewImplFactory'必须声明为abstract或在'ViewFactory'中实现抽象方法create(S)"
Java说,以下是正确的:
@Override
public View create(Presenter presenter) {
return new …Run Code Online (Sandbox Code Playgroud) 我有一个java注释处理器,它在编译期间生成一堆java文件.我想通过添加扩展方法使生成的类更好地在kotlin中使用.我在kotlin论坛上被告知,我可以尝试的是写一个包含我的扩展功能的kotlin文件.我试过这个,我使用该Filer对象创建此文件,将其输出到StandardLocations.SOURCE_OUTPUT目录.Intellij可以看到我生成的类,我可以按预期使用扩展函数,但是app不会编译,因为编译器找不到新的kotlin文件.有什么方法可以编写一个新的kotlin文件,它将被kotlin编译器选中吗?
我有一个注释处理器,它将生成一个枚举,其中包含由接口的getter方法定义的键.
界面位于
MyProject的/ src目录/主/ JAVA/my.package.MyInterfaces.java.
我想验证驻留的属性文件,MyProject/src/main/resources/META-INF/resource-bundle/如果它们确实包含生成的枚举中定义的键.
我的问题是属性文件不能通过处理器的类加载器或Filer.getResource(...)获得.
如何使该项目的源或类路径可供处理器使用,以便我可以加载属性文件?
现在我只有处理器所在的jar中的资源可用.我尝试通过eclipse Project/Properties/Java编译器/ Annotation处理/处理器选项来定义-classpath和/或-sourcepath,但它没有成功.
有没有人遇到这样的问题,谁能给我一个关于如何为处理器提供资源的线索?
我确实有maven结构但不使用maven,因为应用程序中的旧依赖项.所以maven现在不适合我.
Eclipse 3.6 Helios似乎
StandardLocation.SOURCE_PATH并且StandardLocation.CLASS_PATH没有在Filer#getResource()中实现,因此将生成的源文件或类文件写入SOURCE_PATH或CLASS_PATH似乎不可能,同时访问任何文件SOURCE_PATH和CLASS_PATH*
谢谢.
tl; dr:我无法配置IntelliJ来生成与gradle相同的目录中的java文件
我有一个使用immutables注释处理器的小项目.它在gradle命令行构建中按预期工作,但我无法让IntelliJ将生成的文件输出到同一目录.
整个项目可在GitLab上获得
Gradle配置:
我使用以下gradle插件:
build-script的相关部分(链接到完整列表):
apply plugin: 'java'
apply plugin: "net.ltgt.apt"
apply plugin: 'idea'
dependencies {
def immutablesVersion = '2.3.9'
compileOnly "org.immutables:value:$immutablesVersion:annotations"
compileOnly "org.immutables:encode:$immutablesVersion"
apt "org.immutables:value:$immutablesVersion"
}
Run Code Online (Sandbox Code Playgroud)
DataEncoding.java处理源文件,生成的java文件DataEncodingEnabled.java最终进入/build/generated/source/apt/main 根据预期的方案 com.tmtron.immutables.data在IntelliJ中,我按照gradle-apt-plugin文档的建议激活注释处理:

然后我执行./gradlew clean以确保先前的文件已经消失然后我单击Build- Build Project在IntelliJ中.
执行注释处理器,但问题是生成的java文件最终位于错误的位置:

它位于:/ build/generated/source/apt/main/build/generated/source/apt/main /com.tmtron.immutables.data
,粗体部分是多余的.
我做错了什么以及如何正确设置,以便IntelliJ和gradle在同一目录中生成文件?
笔记:
我目前正试图弄清楚如何减少Android启动时间.它不是iOS的问题,但对于Android,我看到的时间是6-10秒.目标是大约3-4秒.
以下是我遇到的研究摘要
ReactMethod解决方案存在但不完美:
ReactMethods 我对这些解决方案的问题在于使用注释处理来生成类(编译时).我试图找出如何让这些解决方案运行没有运气.
此外,围绕减少Android启动时间的其他建议也会有所帮助.
谢谢!
我试图从Java Annotation Processor中访问类型的实际原始源代码.这有可能吗?谢谢!
我正在玩Java注释处理.IntelliJ IDEA中的应用程序构建失败,而maven构建成功结束.我确信提供程序类存在,但我收到以下错误:
java: Bad service configuration file, or exception thrown while constructing Processor object: javax.annotation.processing.Processor: Provider <my class> not found.
Run Code Online (Sandbox Code Playgroud)
我想这是因为一个模块X,应该用-proc:none参数编译.但我需要为其余的应用程序启用注释处理.如何配置IntelliJ IDEA构建过程以在注释过程中跳过特定模块?