我正在尝试将使用注释处理器生成源的构建移动到Maven.我尝试过如下配置maven-compiler-plugin:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<fork>true</fork>
<compilerArgument>-s ${project.build.directory}/target/generated-sources/annotation-processing</compilerArgument>
</configuration>
</plugin>
</plugins>
Run Code Online (Sandbox Code Playgroud)
但是javac失败了
[INFO] Compilation failure
Failure executing javac, but could not parse the error:
javac: invalid flag: -s /home/robert/workspaces/betbrain/sportsengine.common/sportsengine.bean.test/target/target/generated-sources/annotation-processing
Usage: javac <options> <source files>
use -help for a list of possible options
Run Code Online (Sandbox Code Playgroud)
据我所知,-s应该在源文件之前传递给javac,但maven之后传递它.
如何将-s标志正确传递给maven-compiler-plugin?
更新:maven-annotation-plugin似乎不起作用.
配置为时
<plugin>
<groupId>org.bsc.maven</groupId>
<artifactId>maven-processor-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<executions>
<execution>
<id>process</id>
<goals>
<goal>process</goal>
</goals>
<phase>generate-sources</phase>
<configuration>
<outputDirectory>${generated.sources.directory}</outputDirectory>
<processors>
<processor>xxx.annotation.EnforceJavaBeansConventionsProcessor</processor>
</processors>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
执行失败
[INFO] [processor:process {execution: process}]
error: Annotation processor …Run Code Online (Sandbox Code Playgroud) 在我们的企业应用程序中,我们正在寻找一种从Java类中收集数据的动态方法.我们@interface用name属性创建了一个自定义注释接口().我们希望从所有带注释的类中收集此属性的值.
我设法创建了一个AnnotationProcessorFactory和一个AnnotationProcessor自定义注释.由于我们使用的是Maven 2,因此我将以下内容添加到pom.xml主项目的插件中.
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.0-alpha-5</version>
<configuration>
<factory>our.company.api.component.lister.ComponentAnnotationProcessFactory</factory>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
这属于主项目,有几个子项目.工厂和定制处理器属于这些子项目之一.自定义注释分散在所有子项目中,这就是我将插件放在pom.xml主项目中的原因.
问题是当我发出mvn apt:process命令时,我收到了关于没有处理器的注释的警告,我们的自定义注释就在其中.我认为这意味着该插件无法找到工厂类.
我应该怎么做才能让插件找到工厂和处理器文件?
编辑:
项目层次结构非常简单:
main_project
|-sub_project1
|...
|-sub_projectn
Run Code Online (Sandbox Code Playgroud)
该插件是在pom.xml的main_project.只是假设,工厂和处理器是sub_project1和自定义的注释是sub_project2,sub_project3,...,sub_projectn
我正在尝试使用java编写注释处理器.此批注处理器需要在带注释的类中标识带注释的嵌套类,如下所示.我将首先处理带注释的类,然后处理它们的内部注释.这是在编译时执行的,我将不知道正在处理的类.在Foo中可以有多个嵌套类.如何处理所有这些嵌套类的注释.
@MyAnnotation(value="Something important")
public class Foo
{
private Integer A;
@MyMethodAnnotation(value="Something Else")
public Integer getA() { return this.A; }
@MyAnnotation(value="Something really important")
private class Bar
{
private Integer B;
@MyMethodAnnotation(value="Something Else that is very Important")
public Integer getB() { return this.B }
}
}
Run Code Online (Sandbox Code Playgroud)
如何在处理过程中访问嵌套的Bar类,它是注释"MyAnnotation"及其"MyMethodAnnotation"?以下代码仅打印有关类Foo的信息.如何处理有关Bar的信息?
for (Element element : env.getElementsAnnotatedWith(MyAnnotation.class)) {
if ( element.getKind().equals(ElementKind.CLASS) )
{
System.out.println(element.getKind().name() + " " + element.getSimpleName() );
processInnerClassElement(element);
}
else
{
System.out.println(element.getKind().name() + " " + element.getSimpleName() );
}
}
...
private void processInnerClassElement(Element …Run Code Online (Sandbox Code Playgroud) 我刚刚进入这里的javax AnnotationProcessing,并遇到了一个丑陋的案例.我将在一系列描述我学习过程的伪代码行中进行说明:
MyAnnotation ann = elementIfound.getAnnotation(MyAnnotation.class);
// Class<?> clazz = ann.getCustomClass(); // Can throw MirroredTypeException!
// Classes within the compilation unit don't exist in this form at compile time!
// Search web and find this alternative...
// Inspect all AnnotationMirrors
for (AnnotationMirror mirror : element.getAnnotationMirrors()) {
if (mirror.getAnnotationType().toString().equals(annotationType.getName())) {
// Inspect all methods on the Annotation class
for (Entry<? extends ExecutableElement,? extends AnnotationValue> entry : mirror.getElementValues().entrySet()) {
if (entry.getKey().getSimpleName().toString().equals(paramName)) {
return (TypeMirror) entry.getValue();
}
}
return null;
}
}
return …Run Code Online (Sandbox Code Playgroud) 我写了一个注释处理器。用户可以传递一个选项作为处理器的参数。我也可以在我的注释处理器中读取这个参数。到目前为止一切顺利,一切都按预期进行!
但是,我从编译器收到警告,传递给注释处理器的选项尚未被任何注释处理器识别:
警告:以下选项未被任何处理器识别:'[fragmentArgsLib]'
实际上,我的处理器已成功识别并读取此选项:
@Override public boolean process(Set<? extends TypeElement> type, RoundEnvironment env) {
String fragementArgsLib = processingEnv.getOptions().get("fragmentArgsLib");
...
}
Run Code Online (Sandbox Code Playgroud)
我想我必须手动说我已经使用这个选项来使这个编译器警告消失。你们中有人知道怎么做吗?
我想编写一个注释处理器,它根据处理类型的JavaBeans属性集生成源代码.
这一般起作用,但如果其他注释处理器存在,我正在努力正确地这样做.具体来说,这样的其他处理器可以为我的处理器处理的类型生成超类,因此我也需要考虑该超类型的属性.在随后的回合中,可以生成该超类的超类,等等.
这意味着我不能生成我的源代码,直到我感兴趣的类型的层次结构稳定,即在其他处理器的后续轮次(或在我的处理器运行之后的同一轮)中不会生成更多的超类型.
我怎么知道是不是这样呢?我知道RoundEnvironment#processingOver()并且可能在最后一轮中生成我的代码,但我理解这是一个不好的做法(编译器会发出警告).
我试图在AnnotationProcessor中读取编译时类路径,但我无法弄清楚如何.
我的注释处理器需要将构建的类路径保存到文件中,因此可以在以后由第三方库分析此构建时使用它...
我怎样才能找到classpath?System.getProperty("java.class.path")只会找到注释处理器的类路径,但是我需要构建的类路径来编译....建议?
我想用maven来实现这个目标......
我目前正处于一个使用Java自定义注释的项目中.我想强制我的注释的用户,final boolean b如果他用@Foo注释了方法,他必须至少声明方法参数列表中的内容.所以看起来应该是这样的:
@Foo
public void foo(final boolean b) { }
@Foo
public void bar() { } // This should result in an error
Run Code Online (Sandbox Code Playgroud)
使用我的注释处理器,我可以检索变量的类型,但不能检索最终修饰符.如果我想要检索修改器集,如下面的代码所示,虽然最终修饰符出现在参数上,但该集将始终为空.
for (VariableElement parameter : method.getParameters()) {
Set<Modifier> modifiers = parameter.getModifiers(); // This set is always empty
}
Run Code Online (Sandbox Code Playgroud)
任何想法,为什么会这样?我错过了什么吗?
我正在开发一个注释处理器.这是一个经典的maven项目结构.
project
- src/main
- java // SOURCE_PATH
- resources // SOURCE_PATH
- target
- classes // CLASS_PATH and CLASS_OUTPUT
- generated-sources
- annotations // SOURCE_OUTPUT
Run Code Online (Sandbox Code Playgroud)
在与javac的maven中一切都很好.但是当我想将它集成到eclipse中时,我发现eclipse只支持CLASS_OUTPUT和SOURCE_OUTPUT.
我认为CLASS_OUTPUT也可以,因为它等于CLASS_PATH.然后我得到以下异常
org.eclipse.core.internal.resources.ResourceException: Resource '/test-annotation-use-processer/target/classes/config.properties' does not exist.
at org.eclipse.core.internal.resources.Resource.checkExists(Resource.java:335)
at org.eclipse.core.internal.resources.Resource.checkAccessible(Resource.java:209)
at org.eclipse.core.internal.resources.File.getContents(File.java:275)
at org.eclipse.core.internal.resources.File.getContents(File.java:268)
at org.eclipse.jdt.internal.apt.pluggable.core.filer.IdeInputFileObject.openInputStream(IdeInputFileObject.java:86)
Run Code Online (Sandbox Code Playgroud)
那么,该文件确实存在于磁盘中.我不知道日食有什么不对.
有没有办法在eclipse apt中获取资源?
我们如何提供带有 Java 11 模块的注释处理器?
要注册注释提供程序,我们需要以下模块信息条目:
import javax.annotation.processing.Processor;
import com.mycompany.mylib.impl.MyAnnotationProcessor;
module com.mycompany.mylib {
provides Processor with MyAnnotationProcessor;
}
Run Code Online (Sandbox Code Playgroud)
现在,不幸的是,这是不是因为包装不够javax.annotation.processing,javax.lang.model.*而javax.tools不是在java.base模块,但在java.compiler模块。
在 Java SE 8 中,一切都只在 JRE 中可用,但在 Java 11 中,我们可以选择只使用一个子集。随着jlink我们再可以创建更小的运行时间图像。
现在,当然,我可以将以下内容添加到模块信息中:
requires java.compiler;
Run Code Online (Sandbox Code Playgroud)
但这也会导致java.compiler成为自定义运行时映像的一部分。
但是注解处理有些特殊:它是在编译时运行的代码,而不是在运行时运行。因此它不应该是运行时映像的一部分。它应该只是编译时要求/依赖项。
有没有办法用 Java 11 模块系统解决这个问题?
java ×9
annotations ×5
maven ×2
maven-2 ×2
apt ×1
eclipse ×1
eclipse-jdt ×1
maven-plugin ×1
module-info ×1
nested ×1
reflection ×1