Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在eclipse中调试注释处理器_Java_Eclipse_Ant_Remote Debugging_Annotation Processing - Fatal编程技术网

Java 在eclipse中调试注释处理器

Java 在eclipse中调试注释处理器,java,eclipse,ant,remote-debugging,annotation-processing,Java,Eclipse,Ant,Remote Debugging,Annotation Processing,我正在编写一个简单的注释处理器,并尝试使用eclipse对其进行调试。我为annotation processor创建了一个新项目,并根据需要在META-INF下配置javax.annotation.processing.processor,它可以很好地处理注释 然后,我又添加了一些代码并尝试调试,但无法在注释处理器中添加的断点处停止执行。我使用ant进行编译,并使用以下ant选项 export ANT_OPTS=“-Xdebug-Xrunjdwp:transport=dt_socket,ser

我正在编写一个简单的注释处理器,并尝试使用eclipse对其进行调试。我为annotation processor创建了一个新项目,并根据需要在META-INF下配置javax.annotation.processing.processor,它可以很好地处理注释

然后,我又添加了一些代码并尝试调试,但无法在注释处理器中添加的断点处停止执行。我使用ant进行编译,并使用以下ant选项

export ANT_OPTS=“-Xdebug-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000”


触发ant build之后,我创建了一个远程调试配置,调试器可以正常启动。Ant构建也成功启动。但是在注释处理器中添加的任何断点处执行都不会停止。

最简单的方法是创建一个eclipse插件,然后直接从eclipse调试它。
这听起来比实际情况要困难得多——这是youtube上的一个7分钟指南,可以帮助您入门。

这是我刚刚遇到的一个问题,eclipse插件解决方案对我来说似乎超级麻烦。我发现了一个更简单的解决方案,使用javax.tools.JavaCompiler调用编译过程。使用下面的代码,您只需在eclipse中右键单击>调试为>JUnit测试,然后直接从那里调试注释处理器

   @Test
   public void runAnnoationProcessor() throws Exception {
      String source = "my.project/src";

      Iterable<JavaFileObject> files = getSourceFiles(source);

      JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

      CompilationTask task = compiler.getTask(new PrintWriter(System.out), null, null, null, null, files);
      task.setProcessors(Arrays.asList(new MyAnnotationProcessorClass()));

      task.call();
   }

   private Iterable<JavaFileObject> getSourceFiles(String p_path) throws Exception {
     JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
     StandardJavaFileManager files = compiler.getStandardFileManager(null, null, null);

     files.setLocation(StandardLocation.SOURCE_PATH, Arrays.asList(new File(p_path)));

     Set<Kind> fileKinds = Collections.singleton(Kind.SOURCE);
     return files.list(StandardLocation.SOURCE_PATH, "", fileKinds, true);
   }
@测试
public void runAnnoationProcessor()引发异常{
字符串source=“my.project/src”;
Iterable files=getSourceFiles(源文件);
JavaCompiler=ToolProvider.getSystemJavaCompiler();
CompilationTask=compiler.getTask(新的PrintWriter(System.out),null,null,null,null,files);
task.setProcessors(Arrays.asList(新的MyAnnotationProcessorClass());
task.call();
}
私有Iterable getSourceFiles(字符串p_路径)引发异常{
JavaCompiler=ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager files=compiler.getStandardFileManager(null,null,null);
files.setLocation(StandardLocation.SOURCE_PATH,Arrays.asList(新文件(p_PATH));
设置fileKinds=Collections.singleton(Kind.SOURCE);
返回files.list(StandardLocation.SOURCE_PATH,“”,filetypes,true);
}

这个问题已经发布了6年多了,但是,我现在遇到了同样的问题,仍然无法在互联网上找到好的答案

我终于能够设计出一个好的设置,它允许我开发一个注释处理器,在编译另一个项目时使用它,并根据需要进行调试

设置如下所示:

  • 在GAV项目中开发的注释处理器:

    infra
    注释处理器
    1.0-快照

  • 在注释处理器POM文件中,我指定了以下内容:

    
    org.apache.maven.plugins
    maven编译器插件
    ${maven.compiler.plugin.version}
    -过程:无
    ${java.source.version}
    ${java.source.version}
    UTF-8
    

    请注意
    -proc:none
    规范

  • 在使用注释处理器的项目中,它在项目编译期间使用。也就是说,注释处理器在编译器的执行过程中被调用,
    javac
    。我发现,为了在直接运行
    javac
    时调试注释处理器的执行,我可以使用以下命令行:

    javac-J-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=1044-d target/classes-proc:only-processor infra.annotation.CustomizationAnnotationProcessor-cp../annotation processor/target/annotation-processor-1.0-SNAPSHOT.jar src\main\java\org\digital\annotationtest\MyTestClass.java

    注意
    javac
    命令行中的
    suspend=y
    部分。这会告诉JVM暂停执行,直到调试器连接到它

  • 在这种情况下,我可以通过启动远程Java应用程序调试配置来启动eclipse调试器。将其配置为使用注释处理器项目,并连接到本地主机和端口1044上的进程。这允许您调试注释处理器代码。如果在
    init
    process
    方法中设置断点,调试器将中断

  • 为了在使用Maven编译时实现相同的调试体验,我将POM文件设置如下:

  • 向使用注释处理器的POM添加依赖项:
    
    红外线
    注释处理器
    1.0-快照
    
  • 在使用注释处理器的同一项目中,定义以下内容:
  • 
    org.apache.maven.plugins
    maven编译器插件
    ${maven.compiler.plugin.version}
    1.8
    1.8
    真的
    -J-详细
    ${enableDebugAnnotationCompilerArg}
    真的
    红外线
    注释处理器
    1.0-快照
    infra.annotation.CustomizationAnnotationProcessor
    调试注释
    -J-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=1044
    

    注意使用
    true
    , 和
    ${enableDebugAnnotationCompilerArg}

    另外,请注意
    debugAnnotation
    的概要文件定义和
    属性。 这允许我们启动一个调试程序