【问题标题】:How to make a Eclipse plug-in deployable in many Eclipse versions?如何使 Eclipse 插件可部署在多个 Eclipse 版本中?
【发布时间】:2020-02-05 18:39:18
【问题描述】:

我为 Eclipse Oxygen 3a 编写了自己的 Eclipse 插件。它在 Eclipse Oxygen 3a 中完美运行。

现在我需要在较新版本的 Eclipse 中部署相同的插件,但是当插件被安装到例如 Eclipse Photon 中时,安装窗口显示:

Cannot perform operation. Computing alternate solutions, may take a while: ...

确实拖了很久,最后说我的插件不会安装了。

如何使这个插件适用于多个 Eclipse 版本?

更新 1

按照要求,这是 Require-Bundle:

Require-Bundle: org.eclipse.ui,
 org.eclipse.core.runtime,
 org.eclipse.jface.text,
 org.eclipse.core.resources,
 org.eclipse.ui.editors,
 org.eclipse.ui.views;bundle-version="3.8.0",
 org.eclipse.ui.ide,
 org.eclipse.jdt.ui;bundle-version="3.13.52",
 org.eclipse.jdt.core;bundle-version="3.13.50"

没有 Import-Bundle。

更新 2

feature.xml 文件如下所示。我在内部 Apache Web 服务器中部署了一个插件站点,并使用 Eclipse 帮助菜单中的“安装新软件”选项从塔雷安装。

<?xml version="1.0" encoding="UTF-8"?>
<feature
      id="MyPluginFeature"
      label="MyPlugin"
      version="0.4.0"
      provider-name="MyPlugin.com"
      plugin="MyPlugin">

   <description url="http://www.example.com/description">
   </description>

   <copyright url="http://www.example.com/copyright">
   </copyright>

   <license url="http://www.example.com/license">
   </license>

   <url>
      <update label="MyPlugin site" url="http://acme.com/myplugin"/>
   </url>

   <requires>
      <import plugin="org.eclipse.core.expressions" version="3.2.0" match="compatible"/>
      <import plugin="org.eclipse.core.filesystem" version="1.3.0" match="compatible"/>
      <import plugin="org.eclipse.core.runtime" version="3.12.0" match="compatible"/>
      <import plugin="org.eclipse.core.resources" version="3.12.0" match="compatible"/>
      <import plugin="org.eclipse.core.runtime" version="3.13.0" match="compatible"/>
      <import plugin="org.eclipse.core.filesystem" version="1.7.0" match="compatible"/>
      <import plugin="org.eclipse.text" version="3.6.0" match="compatible"/>
      <import plugin="org.eclipse.osgi" version="3.7.0" match="compatible"/>
      <import plugin="org.eclipse.equinox.common" version="3.8.0" match="compatible"/>
      <import plugin="org.eclipse.core.jobs" version="3.2.0" match="compatible"/>
      <import plugin="org.eclipse.equinox.registry" version="3.4.0" match="compatible"/>
      <import plugin="org.eclipse.equinox.preferences" version="3.4.0" match="compatible"/>
      <import plugin="org.eclipse.core.contenttype" version="3.3.0" match="compatible"/>
      <import plugin="org.eclipse.equinox.app" version="1.0.0" match="greaterOrEqual"/>
      <import plugin="org.eclipse.equinox.common" version="3.2.0" match="compatible"/>
      <import plugin="org.eclipse.equinox.registry" version="3.2.0" match="compatible"/>
      <import plugin="org.eclipse.osgi" version="3.2.0" match="compatible"/>
      <import plugin="org.eclipse.core.commands" version="3.5.0" match="compatible"/>
      <import plugin="org.eclipse.equinox.common" version="3.5.0" match="compatible"/>
      <import plugin="org.eclipse.core.runtime" version="3.2.0" match="compatible"/>
      <import plugin="org.eclipse.swt" version="3.103.0" match="compatible"/>
      <import plugin="org.eclipse.jface" version="3.13.0" match="compatible"/>
      <import plugin="org.eclipse.ui.workbench" version="3.105.0" match="compatible"/>
      <import plugin="org.eclipse.core.expressions" version="3.4.0" match="compatible"/>
      <import plugin="org.eclipse.swt" version="3.104.0" match="compatible"/>
      <import plugin="org.eclipse.core.commands" version="3.4.0" match="compatible"/>
      <import plugin="org.eclipse.equinox.common" version="3.3.0" match="compatible"/>
      <import plugin="org.eclipse.core.runtime" version="3.5.0" match="compatible"/>
      <import plugin="org.eclipse.compare.core" version="3.5.0" match="compatible"/>
      <import plugin="org.eclipse.core.expressions" version="3.4.100" match="compatible"/>
      <import plugin="org.eclipse.jface.text" version="3.8.0" match="compatible"/>
      <import plugin="org.eclipse.ui" version="3.5.0" match="compatible"/>
      <import plugin="org.eclipse.core.runtime" version="3.11.0" match="compatible"/>
      <import plugin="org.eclipse.core.filesystem" version="1.2.0" match="compatible"/>
      <import plugin="org.eclipse.core.filebuffers" version="3.5.0" match="compatible"/>
      <import plugin="org.eclipse.core.resources" version="3.5.0" match="compatible"/>
      <import plugin="org.eclipse.text" version="3.5.0" match="compatible"/>
      <import plugin="org.eclipse.ltk.core.refactoring" version="3.7.0" match="compatible"/>
      <import plugin="org.eclipse.jface.text" version="3.5.0" match="compatible"/>
      <import plugin="org.eclipse.ui.navigator" version="3.3.200" match="compatible"/>
      <import plugin="org.eclipse.compare" version="3.5.0" match="compatible"/>
      <import plugin="org.eclipse.team.core" version="3.4.100" match="compatible"/>
      <import plugin="org.eclipse.team.ui" version="3.4.100" match="compatible"/>
      <import plugin="org.eclipse.ui.editors"/>
      <import plugin="org.eclipse.ui.views" version="3.8.0" match="greaterOrEqual"/>
      <import plugin="org.eclipse.ui.ide"/>
      <import plugin="org.eclipse.jdt.ui" version="3.13.52" match="greaterOrEqual"/>
      <import plugin="org.eclipse.jdt.core" version="3.13.50" match="greaterOrEqual"/>
   </requires>

   <plugin
         id="org.eclipse.core.resources"
         download-size="0"
         install-size="0"
         version="0.0.0"
         unpack="false"/>

   <plugin
         id="org.eclipse.jdt.core"
         download-size="0"
         install-size="0"
         version="0.0.0"
         unpack="false"/>

   <plugin
         id="org.eclipse.core.runtime"
         download-size="0"
         install-size="0"
         version="0.0.0"
         unpack="false"/>

   <plugin
         id="org.eclipse.core.filesystem"
         download-size="0"
         install-size="0"
         version="0.0.0"
         unpack="false"/>

   <plugin
         id="org.eclipse.text"
         download-size="0"
         install-size="0"
         version="0.0.0"
         unpack="false"/>

   <plugin
         id="org.eclipse.equinox.common"
         download-size="0"
         install-size="0"
         version="0.0.0"
         unpack="false"/>

   <plugin
         id="org.eclipse.ui"
         download-size="0"
         install-size="0"
         version="0.0.0"
         unpack="false"/>

   <plugin
         id="org.eclipse.jface"
         download-size="0"
         install-size="0"
         version="0.0.0"
         unpack="false"/>

   <plugin
         id="org.eclipse.ui.workbench.texteditor"
         download-size="0"
         install-size="0"
         version="0.0.0"
         unpack="false"/>

   <plugin
         id="org.eclipse.ltk.core.refactoring"
         download-size="0"
         install-size="0"
         version="0.0.0"
         unpack="false"/>

   <plugin
         id="org.eclipse.ltk.ui.refactoring"
         download-size="0"
         install-size="0"
         version="0.0.0"
         unpack="false"/>

   <plugin
         id="MetaCoder"
         download-size="0"
         install-size="0"
         version="0.4.0"
         unpack="false"/>

</feature>

更新 3

修复窗口:

更新 4

在 Eclipse JEE 2019-Jul 中尝试安装插件失败后,我收到以下错误消息:

Cannot complete the install because of a conflicting dependency.
  Software being installed: MyPlugin 0.4.0 (MyPluginFeature.feature.group 0.4.0)
  Software currently installed: Eclipse Platform 4.13.0.v20190916-1323 (org.eclipse.platform.feature.group 4.13.0.v20190916-1323)
  Only one of the following can be installed at once: 
    Core File Systems 1.7.500.v20190620-1312 (org.eclipse.core.filesystem 1.7.500.v20190620-1312)
    Core File Systems 1.7.0.v20170406-1337 (org.eclipse.core.filesystem 1.7.0.v20170406-1337)
    Core File Systems 1.7.400.v20190518-1151 (org.eclipse.core.filesystem 1.7.400.v20190518-1151)
  Cannot satisfy dependency:
    From: MyPlugin 0.4.0 (MetaCoderFeature.feature.group 0.4.0)
    To: org.eclipse.equinox.p2.iu; org.eclipse.core.filesystem [1.7.0.v20170406-1337,1.7.0.v20170406-1337]
  Cannot satisfy dependency:
    From: Eclipse Platform 4.13.0.v20190916-1323 (org.eclipse.platform.feature.group 4.13.0.v20190916-1323)
    To: org.eclipse.equinox.p2.iu; org.eclipse.core.filesystem [1.7.500.v20190620-1312,1.7.500.v20190620-1312]

更新 5

在功能编辑器中,我决定单击 [Compute] 按钮并重新计算所有依赖项。因此,下面我们有了新的 feature.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<feature
      id="MyPluginFeature"
      label="MyPlugin"
      version="0.4.0"
      provider-name="ACME"
      plugin="MyPlugin">

   <description url="http://www.example.com/description">
   </description>

   <copyright url="http://www.example.com/copyright">
   </copyright>

   <license url="http://www.example.com/license">
   </license>

   <url>
      <update label="Site do MyPlugin" url="http://example.org/myplugin"/>
   </url>

   <requires>
      <import plugin="org.eclipse.ui" version="3.5.0" match="compatible"/>
      <import plugin="org.eclipse.core.runtime" version="3.12.0" match="compatible"/>
      <import plugin="org.eclipse.jface.text" version="3.8.0" match="compatible"/>
      <import plugin="org.eclipse.core.resources" version="3.12.0" match="compatible"/>
      <import plugin="org.eclipse.ui.editors"/>
      <import plugin="org.eclipse.ui.views" version="3.8.0" match="greaterOrEqual"/>
      <import plugin="org.eclipse.ui.ide"/>
      <import plugin="org.eclipse.jdt.ui" version="3.13.52" match="greaterOrEqual"/>
      <import plugin="org.eclipse.jdt.core" version="3.13.50" match="greaterOrEqual"/>
   </requires>

   <plugin
         id="MyPlugin"
         download-size="0"
         install-size="0"
         version="0.4.0"
         unpack="false"/>

</feature>

【问题讨论】:

  • 这通常是你插件的依赖。它依赖于哪些插件,并指定了这些插件的哪些版本范围?向我们展示 MANIFEST.MF 的 Require-BundleImport-Package 部分
  • 在等待替代解决方案计算后,应该有一个选项来显示原始错误消息。这会告诉你到底哪里出了问题。通常是缺少插件或缺少插件版本。
  • Require-Bundle 部分看起来不错(除了缺少版本范围,但这是另一回事)。你也有一个feture和一个更新站点吗?如果是,请出示您的feature.xml。您究竟是如何安装插件的?
  • @AlexSC 我认为您必须取消选中所有复选框(那些说“安装更少的项目”和“更新已安装的项目”的复选框),然后它将显示一些文本而不是列出插件。跨度>
  • feature.xml 包含许多使用 &lt;plugin 的 Eclipse 插件 - 我认为这可能会导致问题 - 仅将其用于您自己的插件,使用 requires 部分用于 Eclipse 插件。

标签: eclipse eclipse-plugin


【解决方案1】:

feature.xml 中,只有您自己的插件应指定为 &lt;plugin ... /&gt;,而不是所需的 (Eclipse) 插件/捆绑包。

例如,

    <plugin
         id="org.eclipse.core.resources"
         download-size="0"
         install-size="0"
         version="0.0.0"
         unpack="false"/>

使当前版本的插件/捆绑包org.eclipse.core.resourcesversion="0.0.0" 是一个占位符,在构建更新站点时将被当前版本替换)成为可以安装的一部分。因为org.eclipse.core.resources是单例插件/bundle(Bundle-SymbolicName: org.eclipse.core.resources; singleton:=true),所以不能和其他版本的插件/bundle一起使用。这会阻止您的插件在许多 Eclipse 版本中部署。

【讨论】:

  • 抱歉,features.xml 文件的当前配置(请参阅更新 5)与您的分析相似,但问题仍然存在。
  • @AlexSC 请仔细检查并确保已增加功能版本号(或使用version="0.4.0.qualifier" 而不是version="0.4.0" 以获得包含时间戳的版本号)。顺便说一句,您也可以直接使用目录而不是 Web 服务器来托管更新站点(这可能会在测试时为您节省一个步骤)。直到 Update 4 一切都有意义,包括其他人所说的。如果仍有问题,请显示更新后的错误消息(更新您的 Update 4)。
猜你喜欢
  • 2018-12-21
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多