5

我在我们的 Eclipse IDE (Indigo V3.7.2) 中有一个奇怪的问题。我们使用托管在服务器上的目标平台,该服务器是使用 b3 聚合过程构建的 p2 存储库。我们从不同的团队获得某些组件和功能。每次他们交付插件时,版本号都保持不变(例如 myjar_v1.0.0.jar)(当然大小不同)。我们在远程服务器上更新这些插件。在此更新之后,问题是,如果我使用现有工作区,我会在我的代码中看到编译问题,因为没有从目标平台下载最新的 jar。eclipse会不会因为版本和名称相同而无法识别新插件?如果是,我尝试从工作区的 .metadata 文件夹中删除旧 jar,重新启动 eclipse,但问题仍然存在。我删除了整个 .metadata 文件夹本身,但它仍然没有帮助。eclipse 是否在工作区之间共享插件/jar。即如果同一台机器上的任何其他工作区具有相同的jar?我们使用 Maven 进行构建。eclipse 是否引用本地 maven repo 中的插件?eclipse 是否维护来自目标平台的数据缓存?如果是,在哪里?

这个问题实际上让我发疯,我需要找到一种使用最新版本 jar 的方法,即使版本号相同。(我们对其他团队版本控制方法没有太多控制)

任何输入将不胜感激。

4

4 回答 4

4

Eclipse(实际上是 p2)使用 ID + Version 作为包的唯一标识符。这存储在缓存中,有时甚至在实例之间共享。如果您更改 jar 的内容,即使是轻微的,您也必须更改版本号。您会注意到 Eclipse 使用版本号,例如 xyzqualifier,其中 qualifier 是时间戳 (20120928-2359)。

p2 拥有的 MD5 仅用于检查下载的有效性。

我很抱歉,但事情就是这样。幸运的是,Tycho 和 PDE/Build 都可以处理 .qualifier 并将它们更改为对您有意义的日期。

于 2012-09-28T21:41:28.920 回答
2

我知道这个问题已经很老了,但也许我可以深入了解这个问题。

Eclipse 并没有真正在工作空间之间共享捆绑池。相反,在解析目标平台时会考虑所有已知的工作空间。这些“已知工作区”就是您的“最近的工作区”列表中的那些。因此,在工作区 A 中的目标平台解析期间,Eclipse 在其他工作区的包池中查找所需的包,并将那些已经下载的包从那里复制到工作区 A 的包池,而不是真正下载最新的包文件从工作区 A 的目标平台中配置的 P2 存储库中。

万恶之源当然是 irbull 已经解释过的。

作为一种解决方法,您可以简单地从“最近的工作区”列表中删除所有其他工作区,关闭 Eclipse,删除要更新的工作区的捆绑池,启动 Eclipse 并启动您选择的目标平台的解析。然后,Eclipse 将真正从适当的位置下载所有包。

于 2018-07-19T18:11:21.900 回答
0

我遇到了类似的问题,我的谷歌搜索将我带到了这个页面。

我想我会把我的答案放在这里,以防它帮助别人。

请注意(正如其他人所提到的):如果 JAR 确实不同,那么拥有相同编号的 JAR 是不正常的行为。我遇到这个是因为我有一个“测试”存储库,以确保我可以从存储库下载自定义插件,并且我使用相同的版本号进行了更新,因为一旦它在我的公司成为“官方”,那将是版本它将使用的编号。

长话短说,我通过 eclipse 卸载了我的插件,在我的插件目录中删除了包含插件的文件夹,从远程仓库中取出 jar,并将其解压缩到我的插件目录中,回到 Eclipse 并安装了我的插件。

同样,请注意,这不是执行此操作的预期方式,并且应该被视为最后的手段,因为我不知道这可能会破坏哪些其他内部 Eclipse 假设。我个人没见过,但是YMMV。如果我遇到任何问题,我会更新这个答案。

于 2015-02-19T18:07:12.600 回答
0

在与 Eclipse 目标编辑器苦苦挣扎数小时后,我想出了一些允许我管理 P2 存储库和 .target 文件的舞步。几乎我所有的头痛都是由缓存失效问题引起的。我非常擅长确保在任何代码更改时功能和插件版本都会更改(请参阅下面的提示 3),因此目标应该选择新版本,但很多/大多数时候它不会。特别是当我使用本地 P2 存储库时。为什么要缓存本地存储库?

如果目标编辑器没有找到新版本的功能或插件,而是坚持从存储库加载缓存的旧版本的功能或插件,则需要使用“可用软件”中的重新加载选项站点的对话框使缓存无效。但是该对话框有两个版本。

计划 A:如果您只使用远程 (http) P2 存储库,那么这些说明应该有效:https ://eclipsesource.com/blogs/2012/08/31/reloading-your-p2-cache/

计划 B:但是,如果您使用远程和本地(文件:URI)P2 存储库的组合,则需要使用更迂回的路线使缓存无效。

  1. 在目标编辑器的目标定义页面中单击“添加...”。

  2. 选择“软件站点”,点击下一步。点击右上角的“管理”按钮。

  3. 在“可用软件站点”对话框中,选择要使其缓存无效的存储库,然后单击“重新加载”。

  4. 返回目标编辑器,取消您打开的两个对话框,然后选择您刚刚使其缓存失效的存储库,然后单击“更新”。

如果有人知道包含本地存储库的此对话框的更快路径,请发表评论。

提示 1:要使 Target 编辑器的“更新”和“重新加载”至少部分工作,工件版本应设置为“0.0.0”以进行延迟解析。

提示 2。如果你做很多目标管理,我强烈推荐 M. Barbero 的免费且强大的 Target Platform Definition DSL 插件。它为您生成 .target 文件,消除了 .target 文件中功能和插件版本控制的大部分麻烦——并有助于避免不得不使用令人尴尬的 Eclipse 目标编辑器。为了消除更多版本发现问题,强烈考虑为每个功能和/或插件使用“惰性”选项。安装说明在这里:https ://github.com/eclipse-cbi/targetplatform-dsl

这里有一个很好的概述:https ://eclipsesource.com/blogs/2018/05/30/eclipse-target-platform-definition-dsl-and-generator/

提示 3:为 PDE 安装和使用 Eike Stepper 和 Ed Merks 的 Oomph 版本控制。节省大量时间,让您远离版本控制惩罚框。它现在是 Eclipse 的标准配置。它将监视您启用它的任何项目中的代码更改,了解功能和插件之间的关系,通知您不受版本控制但应该受版本控制的项目,标记插件和功能清单中的陈旧版本号以进行更新等等. 它甚至会根据您所做的更改类型建议正确的主要/次要版本号。https://www.eclipse.org/forums/index.php/t/1100576/

于 2021-12-09T13:58:11.627 回答