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

凡尘一*_*尘一滴 4 w3c osgi

我只在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();
}
Run Code Online (Sandbox Code Playgroud)

在eclipse环境中运行时一切顺利,但是,当发布产品时,运行中的日志错误:

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

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

有人可以帮忙吗?

Moh*_*gab 7

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

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

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

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

org.osgi.framework.system.packages.extra=org.w3c.dom
Run Code Online (Sandbox Code Playgroud)

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