Запустите внешние инструменты из представления подключаемого модуля Eclipse - PullRequest
0 голосов
/ 01 сентября 2018

Я создаю простой плагин Eclipse из существующего проекта приложения Java, который передает 2 внешних файла, один x-исполняемый / приложение и один. Сценарий. Вызов реализован в таком приложении (которое не работает в плагине):

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

Я использовал External Tool Configuration , чтобы определить, как я хочу запускать эти внешние файлы (когда пользователь нажимает кнопку в представлении), и я экспортировал конфигурацию (пример одного):

<?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 Project - проверено распаковывать после Инсталляция - и экспортируемый Художественный проект . Выберите приложение папка на Сборка / Двоичная сборка .
  2. Могу ли я использовать эти экспортированные .launch файлы, и если да, то под какой точкой расширения я должен включить их в plugin.xml? - (см. @ Greg-449)
  3. Приложение должно выдавать 2 файлов по пути, по которому оно выполнен из. Мне отказано в разрешении при попытке запускать его в терминале из каталога установки плагина, но не тогда, когда запуск в рабочей области. (см. @howlger answer billow) - После экспорта плагина начальная разрешения приложения изменились. Используемые инструкции в p2.inf вернуть их обратно.

  4. недавно сгенерированные файлы (из запущенного сценария .sh) отсутствуют права на запись .

ProcessBuilder

После окончательной настройки плагина и добавления ProcessBuilder я получаю сообщение об исключении: не удается запустить программу "rfind_20" (в каталог "Главная / adminuser / .p2 / бассейн / плагины / rFindTest3_1.0.0.201809030453 / внешний" ошибка = 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 () не будет работать в перспективе подключаемого модуля. Так что просто помните, чтобы переключиться на другие перспективы при тестировании вашего плагина .

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Существует два способа отправить приложение как часть плагина и запустить его через 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
0 голосов
/ 01 сентября 2018

Если у вас есть файл 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...