Запись в консоль Eclipse - PullRequest
5 голосов
/ 06 апреля 2009

Мой плагин должен писать в консоль eclipse - для целей тестирования я упростил свой код, чтобы у меня было только следующее:

public void start(BundleContext context) throws Exception {
        super.start(context);
        plugin = this;
        System.out.println("Tecomp Plugin is running");

        MessageConsole myConsole = new MessageConsole("My Console", null);
        //myConsole.activate();
        ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[]{ myConsole });
        ConsolePlugin.getDefault().getConsoleManager().showConsoleView(myConsole);
        final MessageConsoleStream stream = myConsole.newMessageStream();
        stream.setActivateOnWrite(true);
        stream.println("Hi there!");
        stream.close();
    }

Это простой плагин, метод start запускает класс, расширяющий AbstractUIPlugin - это не приложение rcp. Код прекрасно работает в рабочей среде времени выполнения - после установки плагина вывод теряется где-то. Остальная часть плагина работает правильно.

Возможно, есть проблема с ConsolePlugin? Или потоки обрабатываются по-разному в среде исполнения и в среде разработки?

Я попробовал оба варианта - проект с возможностью добавления файлов и непосредственное копирование jar плагина в каталог eclipse - для установки плагина - одинаковый результат для обоих ...

Любая помощь приветствуется, потому что сейчас я борюсь с этой проблемой ...

С уважением, Кати

Edit:

похоже, что это не проблема Консоли ... Я предоставил свой собственный вид для печати вывода, но хотя в файле plugin.xml declard нет представления после установки плагина ... вот что Я сделал: экспортировать плагин с помощью ExportWizard в jar-архив скопировал этот архив в / usr / share / eclipse / plugins затмение

или с художественным проектом: -экспортировал проект с моим плагином с помощью ExportWizard убрал указанный выше архив из затмения -установлена ​​функция затмение

оба не сказали - я что-то не так с установкой плагина? Jar-архив в порядке, я проверил - это последняя версия. Но почему-то кажется, что Eclipse все еще работает с более старым плагином без изменений, которые я сделал

С уважением, Кати

Edit:

Я реализовал интерфейс интерфейса IStartup, расширил точку org.eclipse.ui.startup, но ничего не изменилось ... Я действительно думаю, что это проблема установки. Я закомментировал некоторые результаты, но они все еще выводятся на консоль отладки. Есть ли в Eclipse какой-то кеш плагина? Чтобы новый код не читался?

Edit:

Спасибо за предложения, но запуск eclipse с опцией -clean не помог - я постараюсь установить плагин в какой-то другой среде на следующей неделе - возможно, что-то не так с моим ...

Edit:

код в классе, вызывающем компилятор, выглядит следующим образом:

private MessageConsole findConsole(String name){
  ConsolePlugin plugin = ConsolePlugin.getDefault();
  IConsoleManager conMan = plugin.getConsoleManager();
  IConsole[] existing = conMan.getConsoles();
  for (int i = 0; i<existing.length; i++){
    if (name.equals(existing[i].getName())){
      return (MessageConsole)existing[i];
    }
  }
  //no console found -> create new one
  MessageConsole newConsole = new MessageConsole(name, null);
  conMan.addConsoles(new IConsole[]{newConsole});
  return newConsole;
}



public void run() {
  MessageConsole console = findConsole("tecompConsole");
  //display the tecomp Console
  IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
  String id = IConsoleConstants.ID_CONSOLE_VIEW;
  try {
    IConsoleView view = (IConsoleView) page.showView(id);
    view.display(console);
  } catch (PartInitException e) {
    e.printStackTrace();
  }
  MessageConsoleStream output = console.newMessageStream();
  String tecompPath = TecompPlugin.getDefault().getPreferenceStore().getString(IEiffelConstants.TECOMP_PATH);
  if (checkTecompPath(tecompPath)){
    String line;
    String[] cmd = {tecompPath, pathToAceFile};
    try{
      output.println("calling tecomp");
      Process tecomp = Runtime.getRuntime().exec(cmd);
      //capture stdout und stderr from tecomp
      BufferedReader input = new BufferedReader(
          new InputStreamReader(tecomp.getInputStream()));
      BufferedReader err = new BufferedReader(
          new InputStreamReader(tecomp.getErrorStream()));
      while ((line = input.readLine()) != null ){
        output.println(line);
      }  
      input.close();
      while ((line = err.readLine()) != null){
        output.println(line);
      }
      err.close();
      output.close();
      tecomp.waitFor();
      //System.out.println(tecomp.exitValue());
    }catch (Exception err){
      err.printStackTrace();
    }
  } else {
    try{
    output.println("please specify a tecomp path");
    output.close();
    }catch (Exception err){}
  }
}

но первый тестовый пример должен работать, не так ли? Я создаю новый MessageConsoleStream и пишу в него вручную. Это в точности как примеры, которые я нашел.

Edit:

Код не относится к rcp-приложению - это просто плагин, расширяющий Eclipse Idea с поддержкой языка Eiffel. Поэтому я думаю, что ваше предложение не работает для моего плагина - VonC, по крайней мере, я не знаю, куда поместить ваш код ... Мой первый пример кода в начальном вопросе вызывается внутри класса Plugin, расширяющего AbstractUIPlugin в методе start (контекст BundleContext). Мой плагин работает, поэтому где-то этот метод вызывается. И, как я уже говорил, плагин прекрасно работает в рабочей среде времени выполнения ...

Извините, если это не подходящее место для дополнительного объяснения моего вопроса - но, похоже, это единственное место, где система позволяет мне публиковать дополнительные строки. Комментарии к вашим ответам не разрешены для меня, потому что я только что вошел в систему, и для этого у меня недостаточно очков репутации ... поэтому, пожалуйста, поправьте меня, если я использую систему неправильно :) thx

Ответы [ 5 ]

3 голосов
/ 04 апреля 2009

Вы проверяли " Отображение консоли в приложении RCP " ?

Может ли следующий небольшой код (выполненный в Application.java run() перед созданием и запуском рабочей среды) начать, по крайней мере, вести себя так, как вы хотите?

MessageConsole console = new MessageConsole(”System Output”, null);
ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[] { console });
ConsolePlugin.getDefault().getConsoleManager().showConsoleView(console);
MessageConsoleStream stream = console.newMessageStream();

System.setOut(new PrintStream(stream));
System.setErr(new PrintStream(stream));

logger = LoggerFactory.getLogger(Application.class); // Previously declared.

(т.е. отображается ли консоль, когда ваш плагин установлен в eclipse?)

1 голос
/ 07 апреля 2009

Я думаю, проблема в том, что твой плагин не запускается. Код, который вы показываете, не будет активирован, пока какой-либо другой плагин не попытается получить доступ к чему-либо в вашем плагине. Похоже, что это имеет место с вашей конфигурацией запуска отладки, но не с упакованным приложением.

Вы можете попытаться реализовать интерфейс IStartup и использовать точку расширения org.eclipse.ui.startup в своем плагине для принудительной инициализации, как только пользовательский интерфейс загружен. Это должно активировать ваш плагин и выполнить код консоли, который у вас есть.

Можете ли вы добавить оператор ведения журнала или точку останова в метод start (), чтобы убедиться, что он вызывается в развернутом приложении?

0 голосов
/ 08 апреля 2009

Другая возможность заключается в том, что установленный вами плагин кэшируется при установке. Вы можете запустить eclipse с параметром -clean, чтобы удалить все кэшированные плагины из рабочей области

0 голосов
/ 07 апреля 2009

Возможно, вам придется очистить кэшированные данные, используемые OSGI, и среду выполнения eclipse. Вы можете сделать это, добавив аргумент -clean в командную строку eclipse.

Вот соответствующая информация из Руководства разработчика по плагину:

Очищает кэшированные данные, используемые платформой OSGi и средой выполнения Eclipse. Попробуйте запустить Eclipse один раз с этой опцией, если вы наблюдаете ошибки запуска после установки, обновления или использования общей конфигурации.

См. Eclipse Опции времени выполнения для получения дополнительной информации.

Вы также можете проверить использование сайтов обновлений. Я обычно использую локальный сайт обновлений для установки плагинов во время тестирования, так как он кажется менее подверженным ошибкам. В Eclipse FAQ есть небольшая статья о том, как создать сайт обновления .

0 голосов
/ 06 апреля 2009

Может показаться, что в приложении eclipse, в которое вы пытаетесь установить свой плагин, может не быть установлен плагин org.eclipse.ui.console, который вам нужен в качестве зависимости от плагина. Вы проверили, что ваш плагин имеет правильные зависимости и что он установлен без проблем?

...