【问题标题】:Dynamic Eclipse Project Value in Run Configuration运行配置中的动态 Eclipse 项目值
【发布时间】:2018-09-20 14:00:15
【问题描述】:

我正在处理配置如下的 Java 和 C++ 模块的存储库:

回购结构

Repo/
- ModuleA/
  - src/
    - ...
  - ModuleA.launch
  - ...
- ModuleB/
  - ... # same as above.
- ...

我关心的是启动脚本的定义(上面的IE:ModuleA.launch);具体来说,这些脚本的 PROJECT_ATTR 值。如果我们要打开这些启动脚本,它们会包含这样的条目:

ModuleA.launch

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
<!-- or <launchConfiguration type="org.eclipse.cdt.launch.applicationLaunchType> -->
...
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="ModuleA"/>
<!-- or <stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="ModuleA"/> -->
...
</launchConfiguration>

上面的问题是,如果模块没有被exactly ModuleA签出,运行脚本将找不到项目(这是脆弱的)。据我所知,这个字段不能填充变量(IE:value="${project_name}")。

有没有办法告诉启动脚本使用包含项目的项目值(或任何导致类似体验的合理解决方法)? Eclipse 版本是 Kepler SR2(并且不能更改),如果相关的话。

【问题讨论】:

  • 您在谈论 Java,但请注意您正在使用用于 C/C++ 的 Eclipse CDT 的 XML 文件。你不是在混淆什么吗?
  • 我查看了 CDT 代码内部,该属性设置在 CMainTab2 类中(从 CDT 7.3 开始,否则为 CMainTab),在函数 performApply()(包是 org.eclipse.cdt.launch.ui )。它是在您在窗口中配置启动配置(运行>运行配置)时设置的。如果需要,您可以在此处更改代码以编写"${project_name}"。但是当你更改 Eclipse 代码时要小心,当你更新它时可能会导致问题。此外,我不确定是否存在包含项目名称的变量 project_name(或其他名称)...
  • @vincrichaud 该存储库实际上处理 C++ 和 Java 项目(我只是碰巧从 C++ 模块复制 XML。无论如何,提到的行为对于 Java 和 C++ 启动脚本都是正确的。抱歉混乱;我会更新问题以反映这一点。
  • @vincrichaud 在这一点上,我认为赏金将到期而不会吸引解决问题的答案(无需修改 Eclipse 源代码)。如果您想以答案的形式表达您的调查并声明它可用于解决 CDT 的问题(并声明 JDT 可能存在类似的解决方案;无需进一步调查),那么我会接受它。
  • 我会把它作为答案,因为它更具可读性和完整性。但不确定它是否应该被接受,因为它并没有真正回答你的问题......

标签: java c++ eclipse eclipse-cdt eclipse-jdt


【解决方案1】:

调查:

看CDT代码,这个属性只设置在一个地方。它在包org.eclipse.cdt.launch.ui int 类CMainTab2 中(对于CDT 7.3 以上的版本,否则在CMainTab 中),在第344 行,在函数performApply() 中。

该类定义了 UI 窗口中名为“main”的选项卡,用于配置运行配置(或调试配置)。如下图所示:

函数performApply() 会在您每次刷新此选项卡(打开或关闭它时)以及单击“应用”按钮(在窗口左下方)时调用。

这个函数只是在启动配置中设置了一些属性。其中之一是项目名称 (ICDTLaunchConfigurationConstants.ATTR_PROJECT_NAME)。该属性设置为fProjText.getText()的值,即下图窗口中的文本框:

当您使用最后构建的项目名称创建运行配置(或调试配置)时,此文本框会自动填充。

注意:我没有看 JDT 代码,但我想是一样的


解决方案

1)什么都不做,因为它可能是故意的(即使我不知道为什么)。 注意: 我认为这个值只有在你修改它时才可能是错误的,所以我认为这就是为什么它很难写在.launch 脚本中。

2) 您可以修改 Eclipse 代码以不使用文本框值,而是使用类似 "${project_name}" 的内容。 注意:我不建议这样做,因为更新您的项目以跟随 Eclipse 更新会更困难。

2 bis)不要重写 Eclipse 代码,而是扩展 CMainTab2 类以覆盖 performApply() 方法以将属性设置为 "${project_name}"

3) 不要修改任何代码,每次创建启动配置(运行或调试)时,将文本框值修改为 ${project_name}。 (但是每次都重新输入会很费力

注意: 我不知道是否存在可以在 .launch 脚本中调用的变量,例如 project_name。所以也许所有这些潜在的解决方案都不可能

【讨论】:

  • 感谢您的回答。我对这句话的唯一评论是:“我认为这个值只有在你修改它时才可能是错误的,所以我认为这就是为什么它很难写在 .launch 脚本中的原因。” - 当开发人员签出存储库时,他们通常以与原始项目不同的名称签出(即:如果他们正在处理 ModuleA 上的 Issue 123,他们可能会将其签出为“ModuleA-123”)。因此,虽然它是对项目的修改,但本质上不一定是令人震惊的。
  • 我没有考虑过这个案例(肯定是因为我还是 IT 大三的我不知道)。我建议您将您的问题提交给 eclipse 社区。顺便说一句,我已经将它重写为更像是一个解决方案而不是一个笔记。 btw2,谢谢您的评价
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-15
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
  • 2019-09-03
  • 2013-06-25
  • 2012-01-27
相关资源
最近更新 更多