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

我正在尝试学习如何创建自定义注释处理器,但我被困在尝试调试它。

我已经设法在调试模式下运行javac编译器(使用mvnDebug全新安装)(使用带有注释处理器的其他人的项目),使用IntelliJ IDEA连接到它,并让它在注释处理器中的断点处停止。


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

public class MyProcessor extends AbstractProcessor {...}

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

另外,据我所知,注释处理器需要某种 META INF 文件,该文件可以使用 Google Autoservices 注释处理器之类的东西生成。

因此,也许是一个maven构建过程,首先运行自动服务,然后扩展抽象处理器的类编译为注释处理器,最后使用我们自己的注释处理器(以及调试模式下的javac编译器)编译整个项目。


答案 1

这是食谱。

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

  1. 首先,下载并安装Maven,然后下载并安装IntelliJ IDEA(从这里开始称为IDEA)。(如果您不知道如何使用Windows CMD,这里有一个简短的教程,还有:如何打开命令提示符)

  2. 在 IDEA 中创建一个没有任何原型的 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>测试>java,在那里创建另一个与你之前创建的包同名的包。然后在其中创建一个名称以“Test”结尾的类(例如: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 中设置远程调试器配置。为此,请转到“运行>编辑配置”,单击左上角的绿色+按钮,选择“远程”。将其命名为“mvnDebug”,将Host设置为localhost,将Port设置为8000,按OK即可。

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

  11. 打开 Windows 命令提示符,导航到 pom.xml所在的项目目录。然后键入 mvnDebug 干净安装。如果一切设置正确,它应该说“在地址:8000处侦听运输dt_socket”。

  12. 返回 IDEA 并执行我们刚刚创建的 mvnDebug 配置。如果一切设置正确,它应该显示类似“已连接到目标 VM,地址:'localhost:8000',传输:'套接字'”的内容。

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

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


有关注释处理的其他教程


答案 2