Amdatu和DependencyManager错误注入服务

时间:2015-04-12 10:03:50

标签: service osgi code-injection bndtools amdatu

我安装了Amdatu Bootstrap并创建了一个项目。

我尝试使用dependecyManager进行简单的服务注入,但运行时会出现错误。

代码和我的错误。

这是我的服务的实施:

package cco.bgen.scanner.XmlParser.implService;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;

import cco.bgen.scanner.XmlParser.contratService.XmlParserContrat;

public class XmlParserService implements XmlParserContrat {

    private DocumentBuilderFactory fabrique;
    private DocumentBuilder constructeur;
    private Document document;
    private Element rootElement;

    public XmlParserService() {
        super();
    }

    @Override
    public Element parserFichier(String filePath) {

        // Fabrique pour l'obtention d'une instance du documentBuilder : constructeur
        this.fabrique = DocumentBuilderFactory.newInstance();

        try {

            //l'obtention du constructeur
            this.constructeur = fabrique.newDocumentBuilder();

            try {

                //document à partir d'une path
                this.document = constructeur.parse(new File(filePath));

                //element root du document
                this.rootElement = document.getDocumentElement();

            } catch (SAXException e) {

                e.printStackTrace();

            } catch (IOException e) {

                e.printStackTrace();

            }

        } catch (ParserConfigurationException e) {

            e.printStackTrace();

        }

        //Resultat
        return this.rootElement;
    }

}

这是界面:

package cco.bgen.scanner.XmlParser.contratService;

import org.w3c.dom.Element;

public interface XmlParserContrat {

    public Element parserFichier(String fichierPath);
}

此服务的激活器:

package cco.bgen.scanner.XmlParser.implService;

import org.apache.felix.dm.DependencyActivatorBase;
import org.apache.felix.dm.DependencyManager;
import org.osgi.framework.BundleContext;

import cco.bgen.scanner.XmlParser.contratService.XmlParserContrat;

public class XmlParserActivator extends DependencyActivatorBase {

    @Override
    public void init(BundleContext arg0, DependencyManager manager)
            throws Exception {

        manager.add(createComponent().setInterface(
                XmlParserContrat.class.getName(), null).
                setImplementation(XmlParserService.class));
    }

    @Override
    public void destroy(BundleContext arg0, DependencyManager arg1)
            throws Exception {
        // TODO Auto-generated method stub

    }

}

之后,我创建了一个用于使用xmlParserService的测试包:

package cco.bgen.test;

import org.w3c.dom.Element;

import cco.bgen.scanner.XmlParser.contratService.XmlParserContrat;

public class Test {

    private volatile XmlParserContrat xmlParser;

    public void start(){

        Element rootE = xmlParser.parserFichier("processus.xml");

        System.out.println(rootE.toString());
    }
}

测试服务的Activator:

package cco.bgen.test;

import org.apache.felix.dm.DependencyActivatorBase;
import org.apache.felix.dm.DependencyManager;
import org.osgi.framework.BundleContext;

import cco.bgen.scanner.XmlParser.contratService.XmlParserContrat;

public class TestActivator extends DependencyActivatorBase {

    @Override
    public void init(BundleContext arg0, DependencyManager manager)
            throws Exception {

        manager.add(createComponent()
                .setInterface(Object.class.getName(), null)
                .setImplementation(Test.class)
                .add(createServiceDependency().setService(
                        XmlParserContrat.class)));
    }

    @Override
    public void destroy(BundleContext arg0, DependencyManager manager)
            throws Exception {

    }

}

所以当我在Run Descriptor中运行时,我有这个错误==>

! Failed to start bundle cco.bgen.scanner.Test-0.0.0, exception activator error org.apache.felix.dm.Component.add(Lorg/apache/felix/dm/Dependency;)Lorg/apache/felix/dm/Component; from: cco.bgen.test.TestActivator:init#18
____________________________
Welcome to Apache Felix Gogo

所以我用lb命令来显示Active bundle,然后我再次启动它。 详细的错误显示====>>

g! lb
START LEVEL 1
   ID|State      |Level|Name
    0|Active     |    0|System Bundle (4.2.1)
    1|Resolved   |    1|cco.bgen.scanner.Test (0.0.0)
    2|Active     |    1|cco.bgen.scanner.XmlParser (1.0.0)
    3|Active     |    1|org.amdatu.template (1.0.0)
    4|Active     |    1|Apache Felix Configuration Admin Service (1.8.0)
    5|Active     |    1|Apache Felix Dependency Manager (3.1.0)
    6|Active     |    1|Apache Felix Dependency Manager (4.0.1)
    7|Active     |    1|Apache Felix Gogo Command (0.12.0)
    8|Active     |    1|Apache Felix Gogo Runtime (0.10.0)
    9|Active     |    1|Apache Felix Gogo Shell (0.10.0)
   10|Active     |    1|Apache Felix Servlet API (1.0.0)
   11|Active     |    1|Apache Felix Metatype Service (1.0.6)
g! start 1
g! org.osgi.framework.BundleException: Activator start error in bundle cco.bgen.scanner.Test [1].
    at org.apache.felix.framework.Felix.activateBundle(Felix.java:2196)
    at org.apache.felix.framework.Felix.startBundle(Felix.java:2064)
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:955)
    at org.apache.felix.gogo.command.Basic.start(Basic.java:729)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.felix.gogo.runtime.Reflective.invoke(Reflective.java:137)
    at org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:82)
    at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:477)
    at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:403)
    at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)
    at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:183)
    at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:120)
    at org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:89)
    at org.apache.felix.gogo.shell.Console.run(Console.java:62)
    at org.apache.felix.gogo.shell.Shell.console(Shell.java:203)
    at org.apache.felix.gogo.shell.Shell.gosh(Shell.java:128)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.felix.gogo.runtime.Reflective.invoke(Reflective.java:137)
    at org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:82)
    at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:477)
    at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:403)
    at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)
    at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:183)
    at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:120)
    at org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:89)
    at org.apache.felix.gogo.shell.Activator.run(Activator.java:75)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NoSuchMethodError: org.apache.felix.dm.Component.add(Lorg/apache/felix/dm/Dependency;)Lorg/apache/felix/dm/Component;
    at cco.bgen.test.TestActivator.init(TestActivator.java:18)
    at org.apache.felix.dm.DependencyActivatorBase.start(DependencyActivatorBase.java:75)
    at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:645)
    at org.apache.felix.framework.Felix.activateBundle(Felix.java:2146)
    ... 32 more
java.lang.NoSuchMethodError: org.apache.felix.dm.Component.add(Lorg/apache/felix/dm/Dependency;)Lorg/apache/felix/dm/Component;

这是错误:: =>

中提到的第18行
.add(createServiceDependency().setService(
TestActivator.java中的

1 个答案:

答案 0 :(得分:2)

我看到您在运行时中同时拥有Dependency Manager 3和4。确保您的bundle导入正确的bundle,例如通过显式设置构建路径的版本。