【发布时间】: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>
- 如何让这个应用程序与 Eclipse 插件一起安装, 或作为它的一部分? (见@howlger 回答浪花) - 我设置插件安装为目录 / 将插件连接到功能项目-检查后解压 安装 - 并导出功能项目。选择应用程序 构建/二进制构建上的文件夹。
- 然后我可以利用这个导出的 .launch 文件吗?如果可以 我应该在哪个扩展点下将它们包含在 plugin.xml 中? - 没有。(参见 @greg-449)
应用程序应该在它所在的路径上生成 2 个文件 从执行。 我在尝试访问时遇到权限被拒绝 从插件的安装目录在终端中启动它,但不是什么时候 在工作区中启动。 (见@howlger 回答浪涛) - 在导出插件时,初始 应用程序的权限已更改。 p2.inf 中使用的指令 chmod 他们回来。
新生成的文件(来自运行 .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更改文件权限。