问题描述
我已经尝试过这个链接.界面:
i have tried component factory example from this link.interface:
package com.java.examplefactoryservice;
public interface ExampleFactoryService {
public void start();
public void stop();
}
工厂供应商:
package com.java.examplecomponentfactoryserviceprovider;
import java.util.Map;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import com.java.examplefactoryservice.ExampleFactoryService;
@Component(name = "ExampleComponentFactoryServiceProvider", factory = "example.factory.provider")
public class ExampleComponentFactoryServiceProvider implements ExampleFactoryService {
@Activate
public void activate(Map<String, Object> properties) {
System.out.println("Actiavted!!!");
}
@Override
public void start() {
System.out.println("Started !!!!");
}
@Override
public void stop() {
System.out.println("Stopped!!!");
}
}
工厂经理:
package com.java.examplecomponentfatorymanager;
import java.util.Map;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.osgi.service.component.ComponentFactory;
import org.osgi.service.component.ComponentInstance;
import com.java.examplefactoryservice.ExampleFactoryService;
@Component(name = "ExampleComponentFactoryManager", enabled = true, immediate = true)
public class ExampleComponentFactoryManager {
@Reference(target = "(component.factory=example.factory.provider)", bind = "setFactory", unbind = "unsetFactory")
private ComponentFactory factory;
private ComponentInstance instance;
private ExampleFactoryService service;
@Activate
public void activate(Map<String, Object> properties) {
System.out.println("activate in manager !!!!");
instance = factory.newInstance(null);
service = (ExampleFactoryService) instance.getInstance();
System.out.println("service = " + service.toString());
}
public void setFactory(final ComponentFactory factory) {
this.factory = factory;
System.out.println("setfactory called");
}
public void unsetFactory(ComponentFactory factory) {
this.factory = null;
System.out.println("Unset factory called");
}
}
一切都很好编译并安装在 karaf 2.3.10 中.工厂注册成功.但是什么都没有显示.
Everything compiled fine and installed in karaf 2.3.10. factory is registered successfully. But nothing has been displayed.
卡拉夫输出:
[ 71] [Active ] [ ] [ 80] osgi.cmpn (4.3.1.201210102024)
[ 79] [Active ] [ ] [ 80] testI (0.0.1.SNAPSHOT)
[ 80] [Active ] [ ] [ 80] testImpl (0.0.3.SNAPSHOT)
[ 110] [Active ] [ ] [ 80] Apache Felix Declarative Services (1.6.0)
[ 140] [Active ] [ ] [ 80] ExampleFactoryService (0.0.1.SNAPSHOT)
[ 152] [Active ] [ ] [ 80] ExampleComponentFactoryServiceProvider (0.0.1.SNAPSHOT)
[ 158] [Active ] [ ] [ 80] ExampleComponentFatoryManager (0.0.1.SNAPSHOT)
scr:list 输出
scr:list output
[9 ] [FACTORY ] ExampleComponentFactoryServiceProvider
scr:详细信息
scr:deactivate scr:details
karaf@root> scr:details ExampleComponentFactoryServiceProvider
Component Details
Name : ExampleComponentFactoryServiceProvider
State : FACTORY
Properties :
service.vendor=The Apache Software Foundation
component.factory=example.factory.provider
component.name=ExampleComponentFactoryServiceProvider
References
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ExampleComponentFatoryManager</groupId>
<artifactId>ExampleComponentFatoryManager</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<version>2.3.5</version>
<configuration>
<instructions>
<Import-Package>
*,
javax.servlet*;version="[2.5,4)"
</Import-Package>
</instructions>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-scr-plugin</artifactId>
<version>1.14.0</version>
<executions>
<execution>
<id>generate-scr-scrdescriptor</id>
<goals>
<goal>scr</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.scr.annotations</artifactId>
<version>1.9.6</version>
</dependency>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.osgi.compendium</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.core</artifactId>
<version>4.3.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>ExampleFactoryService</groupId>
<artifactId>ExampleFactoryService</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
最初我尝试在 karaf 命令行中安装包而不是名称,它显示包的绝对路径.一段时间后,我尝试将包放入部署中,它显示了包的确切名称.我不明白 karaf 的行为,为什么它在进行正确的命令行安装时不显示包名称.它根本没有显示任何错误[依赖/编译/有线执行].有人能告诉我捆绑包有什么问题吗?
Initially i tried in karaf command line to install a bundle instead of name it displays the absolute path of the bundle. After sometime i tried by putting the bundle in deploy it shows the exact name of the bundle.I didn't understand the behaviour of karaf why it is not showing the bundle name while doing proper command line installation. And it is not at all showing any errors[dependency/compilation/wiredexecption]. Can anybody please tell me what is wrong in the bundle?
推荐答案
你可以改为导入 aQute.bnd.annotation为 karaf 导入 org.apache.felix.scr.annotations.
you can go for import aQute.bnd.annotation insteadimport org.apache.felix.scr.annotations for karaf.
参考下面的代码
@Component(name="ExampleComponentFactoryManager",immediate=true,enabled=true)
public class ExampleComponentFactoryManager
{
private static final Logger LOG = LoggerFactory.getLogger(ExampleComponentFactoryManager.class);
private ComponentFactory factory;
// @Reference(target = "(component.factory=example.factory.provider)",unbind = "unsetFactory")
//private ComponentFactory factory;
private ComponentInstance instance;
private ExampleFactoryService service;
@Activate
public void activate(Map<String, Object> properties) {
LOG.info("activation factorymanager");
instance=factory.newInstance(null);
service =(ExampleFactoryService)instance.getInstance();
LOG.info("service instance from factory "+service.toString());
}
@Reference(target = "(component.factory=example.factory.provider)",unbind = "unsetFactory")
public void setFactory(final ComponentFactory factory) {
LOG.info("set Factory");
this.factory = factory;
System.out.println("setfactory called");
}
public void unsetFactory(ComponentFactory factory) {
this.factory = null;
System.out.println("Unset factory called");
}
}
这篇关于karaf 在组件工厂示例中未显示任何错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!