我正在尝试学习如何制作自定义注释处理器,而我却一直试图调试它。
我已经设法在调试模式下运行javac编译器(使用 mvnDebug clean install )(与其他人的项目一起使用注释处理器),使用IntelliJ IDEA连接到它并让它停在注释处理器中的断点。
如果我们在项目的某个包中有这样的东西,就像任何其他类一样(例如,没有特殊配置或任何东西):
public class MyProcessor extends AbstractProcessor {...}
我们能否以某种方式将其作为注释处理器挂钩到maven的构建过程中?因此首先编译它,然后整个项目在注释处理器处于活动状态时进行编译。
另外,据我所知,注释处理器需要某种META INF文件,可以用google autoservices注释处理器生成。
所以也许是一个maven构建过程,我们首先运行autoservices,然后将扩展AbstractProcessor的类编译为注释处理器,最后使用我们自己的注释处理器编译整个项目(并使用javac编译器)在调试模式下)。
答案 0 :(得分:12)
这是食谱。
旁注:我在某些情况下非常详细,跳过你已经知道如何做的部分。
首先,download and install Maven,然后下载并安装 IntelliJ IDEA (此处称为IDEA)。 (如果您不知道如何使用Windows CMD,这里有一个简短的tutorial,还有:how to open the command prompt)
在IDEA中创建一个没有任何Archetype的Maven项目。然后在 src>中创建一些包。主要>的java
创建一个扩展javax.annotation.processing.AbstractProcessor的类。
插入一些最小的代码,只是为了让它工作。 (不要忘记课堂声明顶部的注释!)
假设注释完整路径为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();
}
}
在同一个包中创建注释。
public @interface Factory {
}
在项目中可能有一个目录 src&gt;测试&gt; java ,在那里创建另一个包,其名称与您之前创建的包相同。然后在其中创建一个名称以&#34; Test&#34; (例如:MyProcessorTest)。然后使用您之前创建的新注释类型(@Factory)注释此类。
@Factory
public class MyProcessorTest {
}
现在,要使注释处理器工作,它们必须在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>
使用@AutoService(Processor.class)
注释我们的处理器类。
现在,我们必须在IDEA中设置远程调试器配置。为此,请转到运行&gt;编辑配置,单击左上角的绿色+按钮,选择远程。将其命名为&#34; mvnDebug&#34;,将主机设置为 localhost ,将端口设置为 8000 ,按确定即可。
在我们的处理器中的处理方法中设置断点。
打开Windows命令提示符,导航到 pom.xml 所在的项目目录。然后输入 mvnDebug clean install 。如果一切设置正确,它应该说&#34;在地址:8000&#34;
返回IDEA并执行我们刚刚制作的mvnDebug配置。如果一切设置正确,它应该说&#34;连接到目标VM,地址:&#39; localhost:8000&#39;,transport:&#39; socket&#39;&#34;
返回命令提示符,如果没有发生任何事情,请按某个键将其唤醒。
如果一切设置正确,IDEA将在断点处停止,暂停执行javac(Java编译器)。