Приложение RCP + Xstream

1

У меня возникла проблема с использованием XStream в моем приложении RCP. Я добавил плагин с библиотеками Xstream и создал класс объектов, содержащий информацию о книгах.

package Library.objects;
import com.thoughtworks.xstream.annotations.XStreamAlias;

@XStreamAlias("book")
public class Book {

   @XStreamAlias("id")
   private int id;

   @XStreamAlias("name")
   private String name;

   @XStreamAlias("author")
   private String author;

   @XStreamAlias("desc")
   private String desc;

   @XStreamAlias("status")
   private boolean status;

//some methods here
}

И в моем другом классе я хотел проверить, работает ли эта библиотека. Так что я создал что-то вроде этого

package Library.parts;
public class test {
private Table table;
ArrayList<Book> books;
MockBooks MockElement;
private Text text;

public test() {
}

/**
 * Create contents of the view part.
 *  
 */
@PostConstruct
public void createControls(Composite parent) {
    parent.setLayout(null);
    Display display = parent.getDisplay();  
    final Shell shell = new Shell(display);



    MockElement = new MockBooks();
    //XMLBooks xml = new XMLBooks();
    XStream xstream = new XStream(new DomDriver());
    xstream.alias("book",Library.objects.Book.class);
    Book test = new Book(1,"test1","auth1","desc1","true");
    String result = xstream.toXML(test);
            Book test2 = (Book) xstream.fromXML(result);

            //other stuff in window
}

Анализ из объекта в xml отлично работает, но синтаксический анализ из строки XML (или файла) дает мне такую же ошибку:

com.thoughtworks.xstream.mapper.CannotResolveClassException: Library.objects.Book

У меня возникла эта проблема, только когда я использую RCP. В чистых java-приложениях xstream отлично работает. Любые идеи почему?

Теги:
eclipse-rcp
rcp
xstream

2 ответа

0
Лучший ответ

"Проблема" здесь заключается в том, что Eclipse RCP основан на OSGi (реализация Equinox). OSGi - это основа для создания модульных и гибких приложений Java. Каждый модуль имеет свой собственный загрузчик классов (http://www.eclipsezone.com/articles/eclipse-vms/). Это отличается от стандартного приложения Java, где все классы загружаются одним и тем же загрузчиком классов (в общем).

Так в чем проблема? Допустим, модуль А имеет класс под названием foo.Bar, а модуль C также имеет класс foo.Bar. В стандартной Java это невозможно: вы не можете иметь 2 класса с тем же (полным) именем класса. Так отражается работа - вы можете использовать Reflection для "rebuild" foo.Bar.

Но когда есть x классов с таким именем, которое нужно воссоздать?

Это проблема с XStream: она использует несовместимые вещи OSGi. И это делает его несовместимым с Eclipse RCP, если вы просто добавляете Jar в путь сборки.

Вам нужно добавить его как пакет OSGi. К счастью, кто-то сделал эту работу раньше. Вы можете захватить XStream как OSGi-Bundle: http://mvnrepository.com/artifact/org.apache.servicemix.bundles/org.apache.servicemix.bundles.xstream/1.4_1


Смотрите также:

  • 0
    И можете ли вы сказать мне, как я могу добавить этот пакет в мой плагин RCP?
  • 0
    Добавьте JAR в ваш проект. Перейдите в файл META-INF / MANIFEST.MF. В Eclipse открывается редактор. Перейдите на страницу «Runtime», там есть раздел Classpath. Добавьте банку. Теперь перейдите в «Зависимости», раздел «Импорт пакетов» -> «Добавить» -> выберите нужные вам пакеты.
Показать ещё 1 комментарий
0

XStream доступен на орбите Eclipse. Eclipse Orbit Project http://www.eclipse.org/orbit/ Там вы можете скачать XStream как плагин Eclipse и использовать в своих проектах RCP Eclipse.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню