java - CompilationParticipant 包是否可用于 headless PDE 构建?

标签 java ant build osgi eclipse-pde

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

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

确实,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 的 headless PDE 构建中需要的东西..

最佳答案

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

如果您所做的对构建很重要,我建议您查看 Buckminster .它是为 OSGi 应用程序设计的构建工具。它在某种意义上是特殊的,它实际上是在 Eclipse 工作区中构建的,所以它使用相同的构建器和类似 CompilationParticipant 的东西。就像你在开发过程中所做的那样,假设你已经在 headless 构建应用程序中安装了插件。

关于java - CompilationParticipant 包是否可用于 headless PDE 构建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19416506/

相关文章:

ant - 如何使用Ant任务启动和停止jboss服务器?

java - Ant测试编译找不到主类

build - 配置脚本是否有 "Keep-going"标志?

java - 如何使用 FileNameFilter 列出目录中的最新文件

java - 设计决策 : should I provide a thread-safety version for all low-level library?

javascript - 新版本的谷歌地图javascript版本是否适用于JavaFx-WebView

android - 使用ant构建Android项目时如何在build.properties中指定多个源文件夹?

java - 在 WSO2 Identity Server 中创建工作流时出错 (wso2is-km-5.9.0)

javascript - ant进程中回显文件名

c++ - 代码库是什么意思?我如何访问一个?