gpt4 book ai didi

java - EclipseLink MOXy OSGi 包的问题

转载 作者:行者123 更新时间:2023-11-30 09:23:18 25 4
gpt4 key购买 nike

我正在开发一个非常简单的 Eclipse 插件,它使用 EclipseLink 的 MOXy 进行 XML 绑定(bind)(编码/解码)。当我在插件 (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.in​​dexjaxb.properties:

jaxb.in​​dex

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 包,但我不知道为什么以及如何避免这种情况。

此外,通过使用 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

如果有人能帮助我摆脱这种痛苦,我将不胜感激!

最佳答案

您发布的 list 仅包含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 添加到 bundle list 中。这应该允许框架将包解析为 org.eclipse.persistence.moxy 使用的包。

关于java - EclipseLink MOXy OSGi 包的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16121374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com