运行配置中的动态Eclipse项目值 我正在处理一个java和C++模块的仓库,配置如下:

运行配置中的动态Eclipse项目值 我正在处理一个java和C++模块的仓库,配置如下:,java,c++,eclipse,eclipse-cdt,eclipse-jdt,Java,C++,Eclipse,Eclipse Cdt,Eclipse Jdt,回购结构 Repo/ - ModuleA/ - src/ - ... - ModuleA.launch - ... - ModuleB/ - ... # same as above. - ... 我关心的是启动脚本的定义(即:上面的ModuleA.launch);具体来说,这些脚本的项目属性值。如果我们打开这些启动脚本,它们包含如下条目: 模块a.启动 <?xml version="1.0" encoding="UTF-8" standalone="no"?>

回购结构

Repo/
- ModuleA/
  - src/
    - ...
  - ModuleA.launch
  - ...
- ModuleB/
  - ... # same as above.
- ...
我关心的是启动脚本的定义(即:上面的
ModuleA.launch
);具体来说,这些脚本的
项目属性
值。如果我们打开这些启动脚本,它们包含如下条目:

模块a.启动

<?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>

...
...
上面的问题是,如果模块没有完全作为ModuleA签出,那么运行脚本将找不到项目(这是脆弱的)。据我所知,这个字段不能用变量填充(即:
value=“${project\u name}”


是否有任何方法可以告诉启动脚本使用包含项目的项目来获取项目价值(或导致类似体验的任何合理解决方法)?Eclipse版本是开普勒SR2(不能更改),如果相关的话。

调查:

查看CDT代码,该属性仅在一个位置设置。它在类的包
org.eclipse.cdt.launch.ui
中(对于cdt版本超过7.3,否则它在中),在函数
performApply()的第344行

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

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

此函数只是在启动配置中设置一些属性。其中之一是项目名称(
ICDTLaunchConfigurationConstants.ATTR\u project\u name
)。此属性设置为
fProjText.getText()
的值,该值是窗口中的文本框,如下所示:

使用上次生成的项目名称创建运行配置(或调试配置)时,此文本框将自动填充

注意:我没有查看JDT代码,但我认为它是相同的


解决方案

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

2)您可以修改Eclipse代码,使其不使用文本框值,而是类似于
“${project\u name}”
注意:我不建议这样做,因为在eclipse更新之后更新项目会更加困难

2之二)扩展
CMainTab2
类以覆盖
performApply()
方法,将属性设置为
“${project\u name}”
,而不是重写Eclipse代码

3)不要修改任何代码,每次创建启动配置(运行或调试)时,将文本框值修改为${project\u name}。(但每次重新进入这一领域都很困难)


注意:我不知道是否存在可以在.launch脚本中调用的变量,如
project\u name
。因此,可能所有这些潜在的解决方案都不可能

您正在谈论Java,但根据XML文件,您正在使用用于C/C++的Eclipse CDT。你不觉得有些困惑吗?我已经查看了CDT代码内部,这个属性是在类CMainTab2中设置的(自CDT 7.3起,否则为CMainTab),在函数
performApply()
(包是org.eclipse.CDT.launch.ui)。当您在窗口中配置启动配置(运行>运行配置)时,会对其进行设置。如果需要,可以在此处将代码更改为write
“${project\u name}”
。但当您更改Eclipse代码时要小心,因为在更新它时可能会导致问题。此外,我不确定变量是否包含代码(ProjutsName)/代码>(或另一个名称),包含项目名称……ViCRiHaUD实际上存储了C++和java项目。(我恰巧是从C++模块中复制XML的。不管怎样,提到java和C++启动脚本都是正确的行为。抱歉,我会把问题更新一下。”ViCiChanHUD在这里,我认为赏金将在没有吸引解决问题的答案的情况下到期。(无需修改Eclipse源代码)。如果您想以答案的形式进行调查,并说明它可以用于解决CDT的问题(并说明JDT可能存在类似的解决方案;无需进一步调查),然后我会接受它。我会把它作为答案,因为它会更具可读性和完整性。但我不确定它是否值得接受,因为它并没有真正回答您的问题…谢谢您的回答。我唯一的评论是对这一声明:“我认为这个值只有在你修改它的情况下才可能是错误的,所以我认为这就是为什么它在.launch脚本中被硬写的原因。”-当开发人员签出存储库时,他们经常用不同于原始项目的名称签出它们(即:如果他们正在处理ModuleA的第123期,他们可能会将其签出为“ModuleA-123”).因此,虽然这是对项目的修改,但本质上并不一定异常。我没有考虑过这个案例(当然是因为我不知道,因为我还是it专业的大三学生)。我建议您将您的问题提交给eclipse社区。顺便说一句,我已将其改写为更像一个解决方案,而不是一个注释。btw2,thx供您审阅