从Eclipse插件视图启动外部工具

时间:2018-08-31 23:43:38

标签: eclipse eclipse-plugin

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

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

我使用了外部工具配置来定义我希望如何启动该外部文件(当用户单击“视图”上的按钮时),并且我已经导出了配置(一个示例):

<?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回答涛声)-我将插件设置为目录/ 已将插件连接到Feature项目-检查后解压缩 安装-并导出功能项目。选择应用程序的 构建/二进制构建上的文件夹。
  2. 然后我可以利用此导出的 .launch 文件吗,如果可以, 我应该在哪个扩展点中将它们包括在plugin.xml中? -- 否。(请参阅@ greg-449)
  3. 该应用程序应该在其路径上生成 2个文件 从执行。 我正面临拒绝权限 从插件的安装目录在终端中启动它,而不是在启动时 在工作区中启动。 (请参阅@howlger回答涛声)-导出插件后,初始 应用程序的权限已更改。 p2.inf中使用的指令 chmod他们回来。

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

ProcessBuilder

  

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

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

  

尽管将工作目录设置为Applications文件夹,但是应用程序名称不够,需要使用绝对路径,因为    command 参数。

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()方法在Plug-in Perspective中不起作用。因此,只需记住要在测试插件时切换到其他Perspectives

2 个答案:

答案 0 :(得分:1)

如果工作空间中有一个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);

答案 1 :(得分:1)

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

  • 可执行文件从插件JAR 提取到(临时)目录,并更改文件权限在运行它们之前
  • 插件安装为目录
    • META-INF/MANIFEST.MF 中添加行 Eclipse-BundleShape: dir (请参阅{{中的“ Eclipse-BundleShape标头” 3}})
    • 创建一个功能项目,并将您的插件连接到“包含的插件”中,选中“ 安装后解压缩插件档案包
    • 创建包含以下内容的 META-INF/p2.inf 文件(请参阅{{3中的Eclipse帮助-平台插件开发人员指南:“ Touchpoint Instruction Advice” }}和Eclipse help - Platform Plug-in Developer Guide - OSGi Bundle Manifest Headers中的“ chmod” ):
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