使用Intellij和Maven调试Java注释处理器

时间:2015-07-10 16:29:55

标签: java maven debugging annotations annotation-processing

我正在尝试学习如何制作自定义注释处理器,而我却一直试图调试它。

我已经设法在调试模式下运行javac编译器(使用 mvnDebug clean install )(与其他人的项目一起使用注释处理器),使用IntelliJ IDEA连接到它并让它停在注释处理器中的断点。

如果我们在项目的某个包中有这样的东西,就像任何其他类一样(例如,没有特殊配置或任何东西):

public class MyProcessor extends AbstractProcessor {...}

我们能否以某种方式将其作为注释处理器挂钩到maven的构建过程中?因此首先编译它,然后整个项目在注释处理器处于活动状态时进行编译。

另外,据我所知,注释处理器需要某种META INF文件,可以用google autoservices注释处理器生成。

所以也许是一个maven构建过程,我们首先运行autoservices,然后将扩展AbstractProcessor的类编译为注释处理器,最后使用我们自己的注释处理器编译整个项目(并使用javac编译器)在调试模式下)。

1 个答案:

答案 0 :(得分:12)

这是食谱。

旁注:我在某些情况下非常详细,跳过你已经知道如何做的部分。

  1. 首先,download and install Maven,然后下载并安装 IntelliJ IDEA (此处称为IDEA)。 (如果您不知道如何使用Windows CMD,这里有一个简短的tutorial,还有:how to open the command prompt

  2. 在IDEA中创建一个没有任何Archetype的Maven项目。然后在 src>中创建一些包。主要>的java

  3. 创建一个扩展javax.annotation.processing.AbstractProcessor的类。

  4. 插入一些最小的代码,只是为了让它工作。 (不要忘记课堂声明顶部的注释!)

    假设注释完整路径core.Factory,代码将如下所示

    @SupportedAnnotationTypes("core.Factory")
    public class MyProcessor extends AbstractProcessor {
    Messager messager;
    
        @Override
        public void init(ProcessingEnvironment env) {
            messager = env.getMessager();
            super.init(env);
        }
    
        @Override
        public boolean process(Set<? extends TypeElement> annotations,       RoundEnvironment roundEnv) {
            for (TypeElement te : annotations)
                for (Element e : roundEnv.getElementsAnnotatedWith(te))
                    messager.printMessage(Diagnostic.Kind.NOTE, "Printing: " +   e.toString());
            return true;
        }
    
        @Override
        public SourceVersion getSupportedSourceVersion() {
            return SourceVersion.latestSupported();
        }
    }
    
  5. 在同一个包中创建注释。

    public @interface Factory {
    
    }
    
  6. 在项目中可能有一个目录 src&gt;测试&gt; java ,在那里创建另一个包,其名称与您之前创建的包相同。然后在其中创建一个名称以&#34; Test&#34; (例如:MyProcessorTest)。然后使用您之前创建的新注释类型(@Factory)注释此类。

    @Factory
    public class MyProcessorTest {
    
    }
    
  7. 现在,要使注释处理器工作,它们必须在META-INF中有一些文件。为此,我们将使用另一个名为autoservice的注释处理器。所以在 pom.xml 文件中插入它的依赖。

    <dependencies>
        <dependency>
            <groupId>com.google.auto.service</groupId>
            <artifactId>auto-service</artifactId>
            <version>1.0-rc2</version>
        </dependency>
    </dependencies>
    

    7.1 旁注:由于某种原因,如果我没有明确指定它,Maven项目使用Java 1.5。要强制它与Java 1.8一起使用,请将其插入到pom.xml文件中。

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    
  8. 使用@AutoService(Processor.class)注释我们的处理器类。

  9. 现在,我们必须在IDEA中设置远程调试器配置。为此,请转到运行&gt;编辑配置,单击左上角的绿色+按钮,选择远程。将其命名为&#34; mvnDebug&#34;,将主机设置为 localhost ,将端口设置为 8000 ,按确定即可。

  10. 在我们的处理器中的处理方法中设置断点。

  11. 打开Windows命令提示符,导航到 pom.xml 所在的项目目录。然后输入 mvnDebug clean install 。如果一切设置正确,它应该说&#34;在地址:8000&#34;

  12. 返回IDEA并执行我们刚刚制作的mvnDebug配置。如果一切设置正确,它应该说&#34;连接到目标VM,地址:&#39; localhost:8000&#39;,transport:&#39; socket&#39;&#34;

  13. 返回命令提示符,如果没有发生任何事情,请按某个键将其唤醒。

  14. 如果一切设置正确,IDEA将在断点处停止,暂停执行javac(Java编译器)。

  15. 有关注释处理的其他教程