【问题标题】:Is a CompilationParticipant bundle usable in a headless PDE build?CompilationParticipant 包是否可用于无头 PDE 构建?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 我使用相同的 Eclipse 安装进行构建,插件安装在该实例中并使用 JDT 编译器。我想知道范围在哪里改变,所以 JDT 编译器看不到插件?等到 Equinox 启动器执行 antrunner 时,我是否在 OSGi 环境之外,因此无法使用任何已安装的插件?
  • 问题是(AFIK)PDE 构建使用 ANT 中的标准 java 编译器,而不是 Eclipse 中的编译器。 PDE 使用 eclipse 的唯一目的是生成构建脚本,而不是实际执行构建。因此,在使用 PDE 构建时安装了哪些插件并不重要。但我只有 90% 的把握,而不是 100%。您应该检查 PDE 构建生成的 antscripts。如果那里有 &lt;javac&gt; 电话,我很可能是正确的。
【解决方案2】:

经过大量调试、阅读文档和单步执行 PDE 源代码后,似乎无法做到这一点。似乎在无头构建中,JDTCompilerAdapter 的执行被设计为在 OSGi 之外工作,并且无法访问它只是从 javac 任务调用的框架,并且不涉及 JavaBuilder,因此不调用任何参与者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-14
    • 2011-03-12
    • 2011-08-05
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多