我正在从现有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>
该应用程序应该在其路径上生成 2个文件 从执行。 我正面临拒绝权限 从插件的安装目录在终端中启动它,而不是在启动时 在工作区中启动。 (请参阅@howlger回答涛声)-导出插件后,初始 应用程序的权限已更改。 p2.inf中使用的指令 chmod他们回来。
新生成的文件(来自正在运行的.sh脚本)缺少写权限。
最终正确设置了插件并添加了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 。
答案 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
文件在插件中)
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