Как я могу использовать свойства, взятые из файла в коде проекта фрагмента / плагина eclipse PDE? - PullRequest
0 голосов
/ 07 августа 2010

Я создал проект подключаемого модуля eclipse и соответствующий проект фрагмента, который я использую для тестов junit.

Во фрагменте я указываю проект плагина как «Плагин хоста». Далее я указываю следующее на панели build.properties:

source.. = src/
output.. = bin/
bin.includes = META-INF/,\
               .,\
               my.properties

где my.properties - файл, расположенный в корне проекта фрагмента. Затем я написал тест, в котором я пытаюсь загрузить файл my.properties следующим образом:

Properties properties = new Properties();
InputStream istream = this.getClass().getClassLoader()
    .getResourceAsStream("my.properties");

try {
  properties.load(istream);
} catch (IOException e) {
  e.printStackTrace();
}

, но istream равно нулю, и тест завершается неудачно с NullPointerException при вызове load в блоке try.

Я попытался сделать то же самое в плагине хоста, и там он работает нормально. Любые идеи о том, почему я не могу прочитать ресурсы в моем фрагменте PDE при использовании Junit?

Ответы [ 3 ]

0 голосов
/ 07 августа 2010

Попробуйте использовать Bundle # getEntry . Если ваш плагин имеет Activator , вы получаете объект BundleContext при запуске вашего плагина (используйте Bundle-ActivationPolicy: lazy в манифесте). Вы можете получить объект Bundle из BundleContext:

public class Activator implements BundleActivator {
   private static Bundle bundle;

   public static Bundle getBundle() {
      return myBundle;
   }
   public void start(BundleContext context) throws Exception {
      bundle = context.getBundle();
   }
}

...
URL url = Activator.getBundle().getEntry("my.properties");
InputStream stream = url.openStream();
properties.load(stream);
0 голосов
/ 18 мая 2012

Эндрю Нифер указал направление, но решение неверно.Это то, что работает:

1) Добавьте super(); к вашему конструктору Activator.
2) Поместите это в конструктор вашего плагина:

    Properties properties = new Properties();

    try {
        Bundle bundle=Activator.getDefault().getBundle();
        URL url = bundle.getEntry("plugin.properties");
        InputStream stream;
        stream = url.openStream();
        properties.load(stream);
    } catch (Exception e) {
        e.printStackTrace();
    }

И у вас есть функционирующие «свойства».


Пояснения:

Делая (1), вы достигнете всех этих функций:

public class Activator implements BundleActivator {
   private static Bundle bundle;

   public static Bundle getBundle() {
      return myBundle;
   }
   public void start(BundleContext context) throws Exception {
      bundle = context.getBundle();
   }
}

Этоприсутствует уже в родительском классе плагинов.И вы просто не можете поместить его в Activator, потому что getBundle () является окончательным в плагине.

Обратите внимание на Activator.getDefault () в (2).Без этого комплект недоступен, он не статичен.И если вы просто создадите новый экземпляр активатора, его комплект будет null .


Существует еще один способ взять пакет:

Bundle bundle = Platform.getBundle(Activator.PLUGIN_ID);

Только убедитесь, что для Activator.PLUGIN_ID задана правильная строка - как в поле идентификатора на странице обзора плагина.Кстати, вы должны проверять это Activator.PLUGIN_ID после каждого изменения идентификатора плагина в любом случае .

0 голосов
/ 07 августа 2010

Одна из проблем, с которой вы, возможно, столкнетесь, заключается в том, что

InputStream istream = this.getClass().getClassLoader().
getResourceAsStream("my.properties");

ведет себя по-разному в двух ситуациях, когда «this» находится в другом пакете.Поскольку вы не добавляли "/" в начало, java автоматически начнет искать корень пакета вместо корня пути к классу для ресурса.Если код в вашем проекте плагина и вашем проекте фрагмента существует в разных пакетах, у вас есть проблема.

...