2

我编写了一个插件,它使用 org.eclipse.jdt.core.compilationParticipant 扩展来收集一些编译信息以在其他地方使用。我已经在 Eclipse IDE 的多个版本中进行了测试,它的工作原理就像一个魅力。我的最终目标是能够在无头生产 PDE 构建中使用它。我在包中添加了一些日志记录,因此我知道它何时启动、何时关闭以及何时发生源代码编译。问题是这些事件永远不会在我的无头构建中被捕获,购买参与者。无头 PDE 构建通过从运行 antrunner 执行 PDE 构建脚本的 ant 脚本启动 equinox 启动器来启动。涉及的执行范围如此之多,我不确定从哪里开始寻找。我的第一个问题是,我正在尝试做的事情是否可能?它没有 t 似乎 CompilationParticipant 只能在 UI 中工作,但我想确保在我继续调试它之前。有没有人这样做过?

我试图添加评论,但我太罗嗦了,所以我会尝试在这里澄清一下。不幸的是,除了像我尝试的那样应用挂钩外,我无法更改构建系统。我确实花了一些时间运行 PDE 生成的 ant 脚本并看到它正在调用 JDT 编译器适配器,这让我很好奇 JDT 编译器适配器是否可以引用编译参与者,因为它是从插件运行 ant 并且应该可以访问框架,参与者 API 的意图似乎是允许挂钩 JDT 编译器来执行 APT 处理器的实现和其他 DSL 实现之类的事情。这是我对参与者意图的解读,并假设由于 APT 处理器工作,他们将在无头版本中可用,但因为我可以

确实,PDE 正在生成 ant 脚本并调用 javac 任务,但它也将 build.compiler 属性设置为使用 JDT 编译器,因此我假设可以访问 OSGi 框架。这是生成的构建文件之一的片段,以显示我在说什么:

<compilerarg line="-log '${temp.folder}/pde.example3.jar.bin${logExtension}'" compiler="org.eclipse.jdt.core.JDTCompilerAdapter"/>

调试 org.eclipse.jdt.internal.core.JavaModelManager 显示实际上正在使用 JDT 编译器,但由于某种原因没有调用 getRegisteredParticipants,但是正在调用 startup(),所以问题是它为什么不尝试注册参与者。

在调试器中花费数小时连接到在我的构建过程中产生的各种虚拟机后,我能够确定通过 PDE 构建的流程。我不相信CompilationParticipants进来玩,实际上我什至不认为JavaBuilder被调用。看起来执行路径类似于以下内容:

Ant 生成我的 VM,它启动 Equinox Launcher,它启动 OSGi 框架并实例化 AntRunner 应用程序,这反过来从 Elcipse Ant 插件启动 ant,该插件从 PDE 插件运行 build.xml 文件,Build.xml 文件生成所有用于生成 Eclipse 插件的 ant 脚本,其中包括将 build.compiler 设置为 JDTCompilerAdapter,该 JDTCompilerAdapter 包装了 Eclipse Java 编译器(最初基于 Visual Age for Java)。JDTCompilerAdapter 进行一些设置并实例化进行真正编译的 org.eclipse.jdt.internal.compiler.batch.Main 类,并实例化 org.eclipse.jdt.internal.compiler.apt.dispatch.BatchAnnotationProcessorManager 类来处理注释处理。在这条执行路径中没有任何地方通知参与者,并且 JDTCompilerAdapter 似乎专门设计为能够在 ant 中的 OSGi 环境之外使用。所以看起来 CompilationParticipants 不会给我在使用 antrunner 的无头 PDE 构建中需要的东西..

4

2 回答 2

0

AFAIK PDE 构建“只是”一种生成大量Ant-scripts的奇特方式,我相信它只是使用 javac目标来编译文件。您可以在 PDE 构建运行后检查,通过进入您的源文件夹,找到 Ant 脚本并检查。

如果您所做的对构建很重要,我建议您查看Buckminster。它是为 OSGi 应用程序设计的构建工具。从某种意义上说,它实际上是在 Eclipse 工作区中构建的,因此它使用与CompilationParticipant开发期间相同的构建器和类似 s 的东西,假设您已经在无头构建应用程序中安装了插件。

于 2013-10-19T20:04:28.000 回答
0

Well after tons of debugging, reading docs, and stepping though the PDE sources it seems like this can NOT be done. It seems in a headless build the execution of the JDTCompilerAdapter is designed to work outside of OSGi and does not have access to the framework it is simply called from the javac task and does NOT involve the JavaBuilder and therefore does not call any participants.

于 2013-10-30T14:27:15.033 回答