我正在开发一个非常简单的Eclipse插件,它使用EclipseLink的MOXy进行XML绑定(编组/解组)。当我在插件的启动过程(Activator.java)中尝试编写一个简单的类(Person.java)时,我遇到了一些错误。这是代码:
Person.java
package test_rcp;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Activator.java
package test_rcp;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;
public class Activator extends AbstractUIPlugin {
public void start(BundleContext context) throws Exception {
super.start(context);
plugin = this;
// Just to make sure EclipseLink is already loaded
System.out.println(org.eclipse.persistence.Version.getVersion());
Person p1 = new Person();
p1.setName("John Dewey");
p1.setAge(54);
JAXBContext jc = JAXBContext.newInstance("test_rcp",Person.class.getClassLoader());
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(p1, System.out);
}
}
MANIFEST.MF
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Test-RCP
Bundle-SymbolicName: Test-RCP; singleton:=true
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: test_rcp.Activator
Require-Bundle: org.eclipse.ui,
org.eclipse.core.runtime,
org.eclipse.persistence.core,
org.eclipse.persistence.moxy;bundle-version="2.4.1"
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
包test_rcp
还包含jaxb.index
和jaxb.properties
:
jaxb.index
Person
的 jaxb.properties
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
但是,运行插件会引发以下异常:
javax.xml.bind.JAXBException: Provider org.eclipse.persistence.jaxb.JAXBContextFactory could not be instantiated:
javax.xml.bind.JAXBException: Provider class org.eclipse.persistence.jaxb.JAXBContextFactory could not be instantiated:
javax.xml.bind.JAXBException:
ClassCastException: attempting to cast bundleresource://43.fwk583158213/javax/xml/bind/JAXBContext.class to jar:file:/usr/lib/jvm/java-7-oracle/jre/lib/rt.jar!/javax/xml/bind/JAXBContext.class. Please make sure that you are specifying the proper ClassLoader.
据我所知,问题产生于两个类加载器已加载javax.xml.bind
包,但我无法弄清楚为什么以及如何避免这种情况。
Morover,使用JAXBContextFactory
代替JAXBContext.newInstance
(如建议的here),即:
JAXBContext jc = org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(new Class[] {Person.class}, null);
我会得到以下异常:
java.lang.LinkageError: loader constraint violation:
loader (instance of org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader) previously
initiated loading for a different type with name "javax/xml/bind/JAXBContext"
我已经尝试过以下解决方案但没有成功:
https://stackoverflow.com/a/12943115/2295964
https://stackoverflow.com/a/11797373/2295964
如果有人能帮助我摆脱这种痛苦,我真的很感激!
答案 0 :(得分:2)
您发布的清单仅包含Require-Bundle
:
Require-Bundle: org.eclipse.ui,
org.eclipse.core.runtime,
org.eclipse.persistence.core,
org.eclipse.persistence.moxy;bundle-version="2.4.1"
我建议将Import-Package: javax.xml.bind
添加到捆绑包清单中。这应该允许框架将包解析为org.eclipse.persistence.moxy
使用的包。
答案 1 :(得分:0)
您需要确保导入javax.xml.bind
捆绑包,而不是从JRE获取JAXB API。