标签: annotation-processing

在Maven中为注释处理器设置生成的源目录

我正在尝试将使用注释处理器生成源的构建移动到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 maven-2 maven annotation-processing

6
推荐指数
3
解决办法
3万
查看次数

如何在Maven 2中使用自定义注释处理器?

在我们的企业应用程序中,我们正在寻找一种从Java类中收集数据的动态方法.我们@interfacename属性创建了一个自定义注释接口().我们希望从所有带注释的类中收集此属性的值.

我设法创建了一个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.xmlmain_project.只是假设,工厂和处理器是sub_project1和自定义的注释是sub_project2,sub_project3,...,sub_projectn

java maven-2 annotations maven-plugin annotation-processing

6
推荐指数
1
解决办法
6921
查看次数

APT如何处理嵌套注释类的注释

我正在尝试使用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)

java apt annotations nested annotation-processing

6
推荐指数
1
解决办法
2970
查看次数

正常处理TypeMirror和Class

我刚刚进入这里的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)

java reflection annotation-processing

6
推荐指数
1
解决办法
4420
查看次数

任何处理器都无法识别 AnnotationProcessor 选项

我写了一个注释处理器。用户可以传递一个选项作为处理器的参数。我也可以在我的注释处理器中读取这个参数。到目前为止一切顺利,一切都按预期进行!

但是,我从编译器收到警告,传递给注释处理器的选项尚未被任何注释处理器识别:

警告:以下选项未被任何处理器识别:'[fragmentArgsLib]'

实际上,我的处理器已成功识别并读取此选项:

@Override public boolean process(Set<? extends TypeElement> type, RoundEnvironment env) {

    String fragementArgsLib = processingEnv.getOptions().get("fragmentArgsLib");
    ... 
}
Run Code Online (Sandbox Code Playgroud)

我想我必须手动说我已经使用这个选项来使这个编译器警告消失。你们中有人知道怎么做吗?

java annotation-processing

6
推荐指数
1
解决办法
2112
查看次数

确定Java注释处理器中类型的稳定性

我想编写一个注释处理器,它根据处理类型的JavaBeans属性集生成源代码.

这一般起作用,但如果其他注释处理器存在,我正在努力正确地这样做.具体来说,这样的其他处理器可以为我的处理器处理的类型生成超类,因此我也需要考虑该超类型的属性.在随后的回合中,可以生成该超类的超类,等等.

这意味着我不能生成我的源代码,直到我感兴趣的类型的层次结构稳定,即在其他处理器的后续轮次(或在我的处理器运行之后的同一轮)中不会生成更多的超类型.

我怎么知道是不是这样呢?我知道RoundEnvironment#processingOver()并且可能在最后一轮中生成我的代码,但我理解这是一个不好的做法(编译器会发出警告).

java annotations annotation-processing

6
推荐指数
1
解决办法
307
查看次数

如何从AnnotationProcessor获取编译时类路径?

我试图在AnnotationProcessor中读取编译时类路径,但我无法弄清楚如何.

我的注释处理器需要将构建的类路径保存到文件中,因此可以在以后由第三方库分析此构建时使用它...

我怎样才能找到classpath?System.getProperty("java.class.path")只会找到注释处理器的类路径,但是我需要构建的类路径来编译....建议?

我想用maven来实现这个目标......

annotations maven annotation-processing

6
推荐指数
0
解决办法
184
查看次数

注释处理器,获取方法参数的修饰符

我目前正处于一个使用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)

任何想法,为什么会这样?我错过了什么吗?

java annotations annotation-processing

6
推荐指数
1
解决办法
323
查看次数

如何在eclipse jdt-apt环境中获得资源?

我正在开发一个注释处理器.这是一个经典的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_OUTPUTSOURCE_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 eclipse annotation-processing eclipse-jdt

6
推荐指数
0
解决办法
106
查看次数

Java 11 模块信息和注释处理器

我们如何提供带有 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.processingjavax.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 annotation-processing module-info

6
推荐指数
1
解决办法
160
查看次数