OSGI在发布时暴露了“ClassNotFoundException:org.w3c.dom。***”错误

时间:2011-11-14 07:15:54

标签: osgi w3c

我只在Activator.start()函数中编写了以下代码

    public void start(BundleContext bundleContext) throws Exception {
    Activator.context = bundleContext;
    Node node = new Node() {

        @Override
        public Object setUserData(String arg0, Object arg1, UserDataHandler arg2) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public void setTextContent(String arg0) throws DOMException {
            // TODO Auto-generated method stub

        }

        @Override
        public void setPrefix(String arg0) throws DOMException {
            // TODO Auto-generated method stub

        }

        @Override
        public void setNodeValue(String arg0) throws DOMException {
            // TODO Auto-generated method stub

        }

        @Override
        public Node replaceChild(Node arg0, Node arg1) throws DOMException {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public Node removeChild(Node arg0) throws DOMException {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public void normalize() {
            // TODO Auto-generated method stub
            System.out.println("normalize 方法调用");

        }

        @Override
        public String lookupPrefix(String arg0) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public String lookupNamespaceURI(String arg0) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public boolean isSupported(String arg0, String arg1) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean isSameNode(Node arg0) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean isEqualNode(Node arg0) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean isDefaultNamespace(String arg0) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public Node insertBefore(Node arg0, Node arg1) throws DOMException {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public boolean hasChildNodes() {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean hasAttributes() {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public Object getUserData(String arg0) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public String getTextContent() throws DOMException {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public Node getPreviousSibling() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public String getPrefix() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public Node getParentNode() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public Document getOwnerDocument() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public String getNodeValue() throws DOMException {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public short getNodeType() {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public String getNodeName() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public Node getNextSibling() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public String getNamespaceURI() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public String getLocalName() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public Node getLastChild() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public Node getFirstChild() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public Object getFeature(String arg0, String arg1) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public NodeList getChildNodes() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public String getBaseURI() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public NamedNodeMap getAttributes() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public short compareDocumentPosition(Node arg0) throws DOMException {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public Node cloneNode(boolean arg0) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public Node appendChild(Node arg0) throws DOMException {
            // TODO Auto-generated method stub
            return null;
        }
    };
    node.normalize();
}

在eclipse环境中运行时一切顺利,但是,在发布产品时,运行时记录错误:

根异常: java.lang.NoClassDefFoundError:org / w3c / dom / Node

引起:java.lang.ClassNotFoundException:org.w3c.dom.Node

任何人都可以提供帮助吗?

4 个答案:

答案 0 :(得分:7)

OSGi默认提供对系统包的访问,但只提供java。*包,这不包括其他包,如:javax.net,javax.xml,com.sun

因此,有必要为OSGi框架指定任何此类包,以通过系统包将它们导出,使其可以被导入它们的其他包访问。

为此,您需要使用捆绑包所需的其他包设置配置属性,尝试在启动OSGi框架之前将其设置为系统属性,以便在首次启动时获取此属性。

假设您使用的是OSGi 4.2,该属性将配置为:

org.osgi.framework.system.packages.extra=org.w3c.dom

您可能需要查看Apache Felix Framework Configuration Properties以获取更多详细信息,尽管此属性是OSGi规范的一部分,因此也可以在其他实现中使用

答案 1 :(得分:1)

请更新您的问题以包含该套装的MANIFEST.MF

看起来你的作品中没有隐式提供org.w3c.dom。检查Import-Package标头,可能是您没有Import-Package: org.w3c.dom

答案 2 :(得分:0)

如果您使用的是Equinox,可以编辑config.ini并将“org.w3c.dom”添加到 org.osgi.framework.system.packages 键并导入相同的包MANIFEST.MF

答案 3 :(得分:0)

在我的情况下添加

org.osgi.framework.bootdelegation=xx...xxx,org.w3c.dom

解决了我的问题。