【问题标题】:Launch External Tools from Eclipse Plug-in View从 Eclipse 插件视图启动外部工具
【发布时间】:2018-08-31 23:43:37
【问题描述】:

我正在利用预先存在的 Java 应用程序项目构建一个简单的 Eclipse 插件,它依赖 2 个外部文件,一个 x-executable/application 和一个 .sh 脚本。 调用是在这样的应用程序中实现的,(在插件中不起作用):

Process p = new ProcessBuilder("external/application_name", "-d", path).start();

我使用 External Tool Configuration 来定义我希望如何启动这个外部文件(当用户单击 View 上的按钮时)并且我已经导出了配置(一个示例):

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType">
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${workspace_loc:/softwareevolution/external/application_name}"/>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-d ${project_loc}"/>
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${project_loc}"/>
</launchConfiguration>
  1. 如何让这个应用程序与 Eclipse 插件一起安装, 或作为它的一部分? (见@howlger 回答浪花) - 我设置插件安装为目录 / 将插件连接到功能项目-检查后解压 安装 - 并导出功能项目。选择应用程序 构建/二进制构建上的文件夹。
  2. 然后我可以利用这个导出的 .launch 文件吗?如果可以 我应该在哪个扩展点下将它们包含在 plugin.xml 中? - 没有。(参见 @greg-449)
  3. 应用程序应该在它所在的路径上生成 2 个文件 从执行。 我在尝试访问时遇到权限被拒绝 从插件的安装目录在终端中启动它,但不是什么时候 在工作区中启动。 (见@howlger 回答浪涛) - 在导出插件时,初始 应用程序的权限已更改。 p2.inf 中使用的指令 chmod 他们回来。

  4. 新生成的文件(来自运行 .sh 脚本)缺少写入权限

流程构建器

在最终正确设置插件并添加 ProcessBuilder 后,我收到异常消息:无法运行程序“rfind_20”(在 目录 “home/adminuser/.p2/pool/plugins/rFindTest3_1.0.0.201809030453/external” error=2:, 没有这样的文件或目录

文件 rfind_20 确实存在,权限为 777。目标项目也存在。

虽然工作目录设置为应用程序文件夹,但应用程序名称不够,需要绝对路径为 命令参数。

pb = new ProcessBuilder(url.getPath(), "-d", project.getProject().getLocation().toString()); 
@Override
    public Object execute(ExecutionEvent event) throws ExecutionException {


        IProject project= sampleGetSelectedProject();

        ProcessBuilder pb;
        Process rfind, ajust, copy;

        Bundle bundle = FrameworkUtil.getBundle(getClass());//Bundle bundle = Platform.getBundle("rFindTest3");

        URL url = FileLocator.find(bundle, new Path("external/rfind_20"), null);
        URL dirurl = FileLocator.find(bundle, new Path("external/"), null);



        IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event);

        try {

            MessageDialog.openInformation(
                    window.getShell(),
                    "Test",
                    project.getProject().getLocation().toString());

            url = FileLocator.toFileURL(url); 
            dirurl = FileLocator.toFileURL(dirurl);
            pb = new ProcessBuilder(url.getPath(), "-d", project.getProject().getLocation().toString()); 
    //no matter the working directory the absolute path was required!! sending "rfind_20" as command did not work as command
            pb.directory(new File(dirurl.getFile()));

            rfind = pb.start(); 
            rfind.waitFor();
            rfind.destroy();

        }catch(Exception e) {

            MessageDialog.openInformation(
                    window.getShell(),
                    "Test",
                    e.getMessage());

        }


    return null;

}

唯一剩下的谜团是为什么我的 sampleGetProject() 方法在插件透视图中不起作用。因此,请记住在测试您的插件时切换到其他 Perspectives

【问题讨论】:

  • "在插件里面不行" 为什么这么说呢?
  • 要运行包含在插件中的可执行文件,插件作为目录而不是 JAR 安装(META-INF/MANIFEST.MF 中的Eclipse-BundleShape: dir)或者可执行文件必须在运行它之前被提取。
  • @nitind 将插件安装为目录后,我现在再次尝试 ProcessBuilder,但没有成功,我注意到安装插件后我无法再从终端运行应用程序,它的权限已更改。我明天会更深入地研究它。测试这个太累了。
  • @howlger 插件现在安装为目录,我遇到了这个问题link,第二个答案解决了它。
  • 如果对您有帮助,请为您链接的答案投票。我添加了一个答案,其中还包含如何通过p2.inf 更改文件权限。

标签: eclipse eclipse-plugin


【解决方案1】:

有两种方法可以将应用程序作为插件的一部分发布并通过 ProcessBuilder 运行(*.launch 文件不能在插件中使用那个):

instructions.install = \
   chmod(targetDir:${artifact.location},targetFile:path/to/executable1,permissions:755);\
   chmod(targetDir:${artifact.location},targetFile:path/to-executale_which_generates_files/executable2,permissions:733);\
   chmod(targetDir:${artifact.location},targetFile:path/to-executale_which_generates_files/,permissions:766);
instructions.install.import = org.eclipse.equinox.p2.touchpoint.eclipse.chmod

【讨论】:

  • 我遇到了更多problems 和可能的bug- 在(每次)安装失败后重新启动 Eclipse 会有所帮助。
  • @howlgler 现在我收到“安装项目时出错...”操作 chmod 失败 - 文件 /home/adminuser/.p2/pool/plugins/rFindTest2_1.0.0.201809021620。 jar/external/rfind_20 不存在”。我检查了文件夹,.jar 确实存在,但 chmod 无法在 jar 中的文件上执行。我觉得这些指令是在 tatgetFile (仍然)a 时执行的。 jar(也许它是为了在安装过程中稍后解压缩 - 因为 Eclipse-BundleShape 仍然设置为 dir)。
  • @BanAnanas instructions.configure 代替 instructions.install 有效吗?
  • 没有An error occurred while configuring the installed items session context was:(profile=_home_adminuser_eclipse_committers-photon_eclipse, phase=org.eclipse.equinox.internal.p2.engine.phases.Configure, operand=null --&gt; [R]rFindTest2 1.0.0.201809021700, action=org.eclipse.equinox.internal.p2.touchpoint.eclipse.actions.ChmodAction). The action chmod failed - file /home/adminuser/.p2/pool/plugins/rFindTest2_1.0.0.201809021700.jar/external/rfind_20 does not exist。也许取决于 Eclipse 的“安装到主机”选项?我应该尝试以其他方式安装插件吗?
  • 是的,也许这仅在“安装到主机”时才会发生。 Eclipse 也这样做:git.eclipse.org/c/equinox/rt.equinox.framework.git/tree/bundles/…
【解决方案2】:

如果您在工作区中有一个xxx.launch 文件,您可以使用它来启动它

IFile file = ... get IFile for workspace file

ILaunchConfiguration config = DebugPlugin.getDefault().getLaunchManager().getLaunchConfiguration(file);

DebugUITools.launch(config, ILaunchManager.RUN_MODE, false);

如果您将可执行文件作为插件的一部分,则不能使用 .launch 文件。而是使用FileLocator 获取可执行文件的位置并使用ProcessBuilder 运行它

Bundle bundle = FrameworkUtil.getBundle(getClass());

URL url = FileLocator.find(bundle, new Path("relative path to executable"));

url = FileLocator.toFileURL(url);

【讨论】:

  • 我认为value="${workspace_loc:/softwareevolution/external/application_name}" 给人的印象是应用程序将位于运行时工作区中,但我实际上希望它成为插件安装目录/jar 的一部分。
  • 在这种情况下,您不能使用 .launch 文件 - 使用 FileLocatorProcessBuilder - 请参阅更新后的答案。
  • Your answerFrom class file:toFileURL 将使用用户自定义协议的 URL 转换为使用文件协议的 URL。 URL 的内容可能被提取到文件系统上的缓存中以获得文件 URL。如果此转换器无法识别给定 URL 的协议,则按原样返回原始 URL。此功能可能无法将文件放置到临时位置?我认为我现在的问题取决于 FileLocator。我会尽快放代码和错误,感谢您的帮助。
  • 您可能需要在 ProcessBuilder 构造函数中指定可执行文件的完整路径,而不仅仅是名称。
  • 完成了这件事,我只花了这么长时间,因为从今天开始 插件停止在插件视角中工作,正在对其进行测试。我会看看其他时间。非常感谢您的帮助。
猜你喜欢
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多