У меня возникла проблема с использованием 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 основан на 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
Смотрите также:
XStream доступен на орбите Eclipse. Eclipse Orbit Project http://www.eclipse.org/orbit/ Там вы можете скачать XStream как плагин Eclipse и использовать в своих проектах RCP Eclipse.