有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java开发了一个Eclipse插件,可以向项目中添加外部构建器

编辑: 我不知道如何让我的插件添加一个与手动添加的构建器配置相同的外部构建器。我认为使用Bananewizen的建议直接修改项目文件是不够可维护的。我们现在放弃。我们将让用户手动创建外部生成器

我正在编写一个Eclipse插件,作为我的一位同事开发的优秀命令行工具的GUI。开发人员使用该插件创建一个bash脚本,该脚本使用特定配置运行命令行工具。创建bash脚本后,可以将其作为外部工具生成器手动添加到Eclipse项目中(参见下图)自动化这一步是我遇到麻烦的地方

**I can add the bash script manually, but not programatically**

首先,添加bash脚本作为外部生成器的代码:

createBuilderConfigFile();

IProjectDescription desc = project.getDescription();
ICommand newCommand = desc.newCommand();
newCommand.setBuilding(IncrementalProjectBuilder.AUTO_BUILD, false);
newCommand.setBuilding(IncrementalProjectBuilder.INCREMENTAL_BUILD, false);
newCommand.setBuilding(IncrementalProjectBuilder.CLEAN_BUILD, false);
newCommand.setBuilding(IncrementalProjectBuilder.FULL_BUILD, true);
newCommand.setBuilderName("org.eclipse.ui.externaltools.ExternalToolBuilder");
Map<String, String> arguments = new HashMap<String, String>();
arguments.put("LaunchConfigHandle", "<project>/.externalToolBuilders/CodeGen.launch");
newCommand.setArguments(arguments);
List<ICommand> allCommands = new ArrayList<ICommand>();
allCommands.add(newCommand);
for (ICommand command : desc.getBuildSpec()) {
    allCommands.add(command);
}
ICommand[] commandArray = allCommands.toArray(new ICommand[allCommands.size()]);
desc.setBuildSpec(commandArray);
project.setDescription(desc, null);

第一行创建了一个名为CodeGen.launch的文件。它类似于this SO post。然后剩下的代码用如下代码更新我的Eclipse项目中的.project文件:

<buildCommand>
  <name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
  <arguments>
     <dictionary>
        <key>LaunchConfigHandle</key>
        <value>&lt;project&gt;/.externalToolBuilders/CodeGen.launch</value>
     </dictionary>
  </arguments>
</buildCommand>

它几乎可以完美地工作。构建项目时,将运行脚本。但是,脚本会更新源文件,如果project->;从Eclipse主菜单中选择自动构建。重新构建会导致脚本再次运行,该循环将继续,直到用户关闭自动构建

如果我打开构建器列表,我可以看到我的插件创建的构建器(见上图)。如果我点击编辑,不做任何更改,然后单击确定,新的构建器只运行手动构建,而不是自动构建。现在.project文件不同了;手动打开并保存生成器定义导致Eclipse对其进行更新。它看起来像:

<buildCommand>
  <name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
  <triggers>full,incremental,</triggers>
  <arguments>
     <dictionary>
        <key>LaunchConfigHandle</key>
        <value>&lt;project&gt;/.externalToolBuilders/CodeGen.launch</value>
     </dictionary>
     <dictionary>
        <key>incclean</key>
        <value>true</value>
     </dictionary>
  </arguments>
</buildCommand>

注意新的<triggers>标记和新的<dictionary>值。如果您查看我的代码,您可以看到我试图指定脚本应该为哪些构建运行的代码行。这些线被忽略了;我可以把它们注释掉,得到的.project文件也一样。这可能是因为“org.eclipse.ui.externaltools.ExternalToolBuilder”是一个不可配置的生成器。我已经确认newCommand.isConfigurable()返回false,文档here建议为isConfigurable()返回false的构建器将忽略setBuilding()。我搜索了除“org.eclipse.ui.externaltools.ExternalToolBuilder”之外的扩展点,该扩展点是开放供配置的,但我还没有找到

我的插件有没有办法定义一个外部生成器,其结果与手动定义生成器的用户相同


共 (1) 个答案

  1. # 1 楼答案

    如果所有这些都失败了,您仍然可以扫描并更新。通过文件读/写的方式创建项目文件。然后调用iProject.refreshLocal(DEPTH_INFINITE, ...)对您修改过的项目进行修改,以使Eclipse知道这些更改