【发布时间】:2013-10-17 00:59:41
【问题描述】:
我编写了一个插件,它使用 org.eclipse.jdt.core.compilationParticipant 扩展来收集一些编译信息以在其他地方使用。我已经在 Eclipse IDE 的多个版本中进行了测试,它的工作原理就像一个魅力。我的最终目标是能够在无头生产 PDE 构建中使用它。我在包中添加了一些日志记录,因此我知道它何时启动、何时关闭以及何时发生源代码编译。问题是这些事件永远不会在我的无头构建中被捕获,购买参与者。无头 PDE 构建通过从运行 antrunner 执行 PDE 构建脚本的 ant 脚本启动 equinox 启动器来启动。涉及的执行范围如此之多,我不确定从哪里开始寻找。我的第一个问题是,我正在尝试做的事情是否可能?看起来 CompilationParticipant 似乎不能只在 UI 中工作,但我想在继续调试之前确定一下。有人做过吗?
我试图添加评论,但我太罗嗦了,所以我会尝试在这里澄清一下。不幸的是,除了像我尝试的那样应用挂钩外,我无法更改构建系统。我确实花了一些时间运行 PDE 生成的 ant 脚本并看到它正在调用 JDT 编译器适配器,这让我很好奇 JDT 编译器适配器是否可以引用编译参与者,因为它是从插件运行 ant 并且应该可以访问框架,并且参与者 API 的意图似乎是允许挂钩 JDT 编译器来执行 APT 处理器的实现和其他 DSL 实现之类的事情。这是我对参与者意图的解读,并假设他们将在 APT 处理器工作后以无头版本的形式提供,但由于我找不到一个真正好的教程,我有点把东西拼凑在一起,我'我猜我错过了什么,或者至少我希望如此..
确实,PDE 正在生成 ant 脚本并调用 javac 任务,但它也将 build.compiler 属性设置为使用 JDT 编译器,因此我假设可以访问 OSGi 框架。这是来自生成的构建文件之一的 sn-p 以显示我在说什么:
<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(),所以问题是它为什么这样做不要尝试注册参与者。
在调试器中花费数小时附加到在我的构建过程中生成的各种 VM 之后,我能够确定 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 构建中需要的东西..
【问题讨论】:
-
是的,您可以在无头构建中使用 CompilationParticipant。您应该能够从它的捆绑清单中看到它不依赖于 UI 库。不,我没有任何例子。我很久很久以前就停止使用 PDE Build...
-
感谢您的信息,我很高兴这是可能的。我希望我可以转储 PDE,然后继续前进,但此时我被它困住了。
标签: java ant build osgi eclipse-pde