Karaf教程第1部分 安装Karaf与第一个应用
来源:互联网 发布:软件测试se是什么意思 编辑:程序博客网 时间:2024/06/10 16:58
原文链接:http://blog.csdn.net/wusandi/article/details/78172261
1.1 karaf入门
在这个帖子中,我将编写关于Apache Karaf的一系列帖子。那么什么是Karaf,你为什么对它感兴趣呢?Karaf是基于Equinox或者Felix的OSGi容器。相对于其它优良的容器来说,主要的不同点是karaf带来了优秀的features管理。
Karaf的杰出特性:
- 类似于Bash的完备feature扩展控制台
- SSH控制台
- 从maven仓库部署bundle和feature
- 易于从命令行创建新的实例
所有这些特性使得开发基于服务器的OSGi应用几乎与常规的Java应用一样容易。部署和管理是我迄今为止见到的比其他应用服务器更好。All this is combined with a small footprint as well of karaf as the resulting applications. 在我看来,这将允许轻量级的开发风格,就像伴随spring应用的灵活性的JavaEE 6一样。
1.2 安装与第一次启动
- 从Karaf网站下载Karaf 3.0.3
- 提取,用bin/karaf启动
你应该看到欢迎界面:
__ __ ____
/ //_/____ __________ _/ __/
/ ,< / __ `/ ___/ __ `/ /_
/ /| |/ /_/ / / / /_/ / __/
/_/ |_|\__,_/_/ \__,_/_/
Apache Karaf (3.0.3)
Hit '<tab>' for a list of available commands
and '[cmd] \--help' for help on a specific command.
Hit '<ctrl-d>' or 'osgi:shutdown' to shutdown Karaf.
karaf@root()>
1.3 一些方便的命令行
命令
描述
la
显示所有安装的bundle
service:list
显示活动的OSGi服务。这个列表很长。你可以使用unix管道,类似于"ls | grep admin"
exports
显示所有导出的包(package),以及提供这些包的bundle。这有助于找到一个包来自于哪个bundle。
feature:list
显示已经安装的feature和可以安装的feature
feature:install webconsole
安装feature(一系列bundle和其他的feature)。使用上面的命令我们安装了Karaf webconsole。它可以通过http://localhost:8181/system/console访问。用karaf/karaf登录,花费一点时间看看它提供了什么。
log:tail
显示日志。使用ctrl-c返回控制台。
Ctrl-d
退出console。如果这是主控制台,那么karaf就会被停止。
OSGi 容器在重启之后保存状态
注意Karaf像所有的osgi容器一样只维护安装的和启动的bundle的最后的状态。所以如果某些功能不再工作,重启是没有用的。为了真正地启动一个新的,要停止karaf,删除data目录。
检查日志
Karaf是非常安静的。为了不错误消息,要一直保持tail -f data/karaf.log打开!!
1.4 任务列表:一个小的osgi应用
Karaf本身是一个很好的但是没有用的容器。所以,让我们创建第一个应用。创建一个OSGi应用是很简单的,maven提提供了很大的帮助。与标准的maven工程的区别很小。为了编写这个应用,我推荐使用安装了m2eclipse插件的Eclipse 4。
获取源代码
- 克隆示例程序:git clone git@github.com:cschneider/Karaf-Tutorial.git
- 或者
- 下载示例工程:https://github.com/cschneider/Karaf-Tutorial/zipball/master 并提取到某个目录。
导入到Eclipse
- 启动Eclipse
- 在Eclipse Package explorer中:Import -> Existing maven project -> Browse,选择提取的目录的tasklist子目录。
- Eclipse会显示所有的maven工程
- 点击through to import with defaults
Eclipse现在会导入工程,并用m2eclipse导入所有的依赖。
tasklist示例包含三个工程
Module
描述
tasklist-model
服务接口和任务类
tasklist-persistence
简单的持久实现,提供了TaskService
tasklist-ui
Servlet,使用TaskService显示任务列表
tasklist-features
应用的Feature描述,这样在Karaf中安装会很容易
1.4.1 Tasklist-persistence工程
这个工程包含了内部的模型和服务实现。这个模型是Task类和TaskService接口。持久实现TaskServiceImpl在简单的HashMap中管理任务。使用blueprint上下文将TaskService作为一个OSGi服务发布。Blueprint是OSGi依赖注入的标准,非常类似于spring上下文。
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
<bean id="taskService" class="net.lr.tasklist.persistence.impl.TaskServiceImpl" />
<service ref="taskService" interface="net.lr.tasklist.model.TaskService" />
</blueprint>
Bean标签创建了TaskServiceImpl的单例对象。Service标签将这个单例作为OSGi服务以TaskService接口的形式发布。
Pom.xml用于打包bundle,maven-bundle-plugin插件使用OSGi的Manifest文件创建了jar包。默认情况下,这个插件导入了在Java文件导入的或者blueprint上下文引用的所有的包(package)。它也导出除了字符串实现和内部之外所有的包。在我们的示例中,我们想要导入模型的包,但不导入持久实现的包。由于使用了命名惯例,我们不需要额外的配置。
1.4.2 Tasklist-ui
这个ui工程包含了一个TaskServlet类,用于显示任务列表和独立的任务。要与Task一起工作,servlet需要TaskService。
为了注入TaskService和发布servlet,使用下面的blueprint上下文。
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
<reference id="taskService" availability="mandatory" interface="net.lr.tasklist.model.TaskService" />
<bean id="taskServlet" class="net.lr.tasklist.ui.TaskListServlet">
<property name="taskService" ref="taskService"></property>
</bean>
<service ref="taskServlet" interface="javax.servlet.http.HttpServlet">
<service-properties>
<entry key="alias" value="/tasklist" />
</service-properties>
</service>
</blueprint>
Reference标签使得blueprint搜索并等待实现了TaskService接口的服务,并创建bean "taskService"。
bean taskServlet实例化了servlet类,并被注入了taskService。
Service标签将servlet作为OSGi服务以HttpServlet 接口发布,并设置了别名。
这种发布servlet的方式还没有标准化,但是已经被pax web whiteboard extender支持了。这个extender使用HttpServlet接口和OSGi的http服务注册每一个服务。它使用alias属性设置访问servlet的路径。
参阅:http://wiki.ops4j.org/display/paxweb/Whiteboard+Extender
1.4.3 Tasklist-features
最后一个工程只是将feature描述安装到maven仓库,这样我们在Karaf中就可以很容易地安装它。这个描述定义了一个名为tasklist的feature以及要从maven仓库安装的bundle。
<feature name="example-tasklist" version="${pom.version}">
<feature>example-tasklist-persistence</feature>
<feature>example-tasklist-ui</feature>
</feature>
<feature name="example-tasklist-persistence" version="${pom.version}">
<bundle>mvn:net.lr.tasklist/tasklist-model/${pom.version}</bundle>
<bundle>mvn:net.lr.tasklist/tasklist-persistence/${pom.version}</bundle>
</feature>
<feature name="example-tasklist-ui" version="${pom.version}">
<feature>http</feature>
<feature>http-whiteboard</feature>
<bundle>mvn:net.lr.tasklist/tasklist-model/${pom.version}</bundle>
<bundle>mvn:net.lr.tasklist/tasklist-ui/${pom.version}</bundle>
</feature>
一个feature可以包含其他要被安装的feature和bundle。Bundle通常使用mvn url。这意味着它们是从配置的maven仓库或者你本地的maven仓库(例如~/.m2/repository)加载。
1.5 在Karaf中安装应用
feature:repo-add mvn:net.lr.tasklist/tasklist-features/1.0.0-SNAPSHOT/xml
feature:install example-tasklist-persistence example-tasklist-ui
增加feature描述到Karaf,这样feature就会被添加到可用的features中,然后安装并启动tasklist feature。在该命令行之后,tasklist应用就应该运行起来了。
list
检查所有的tasklist的bundle都处于active状态。如果没有处于active状态,尝试启动它们,并检查log。
http:list
ID | Servlet | Servlet-Name | State | Alias | Url
-------------------------------------------------------------------------------
56 | TaskListServlet | ServletModel-2 | Deployed | /tasklist | [/tasklist/*]
应该显示出TaskListServlet。默认情况下,示例启动在http://localhost:8181/tasklist。
你可以创建一个文本文件来改变这个端口,即"etc/org.ops4j.pax.web.cfg",文件的内容是"org.osgi.service.http.port=8080"。这将告诉HttpService使用端口8080。现在tasklist应用就可以通过http://localhost:8080/tasklist访问了。
1.6 总结
在这个教程中,我们安装了Karaf,学习了一些命令行。然后我们创建了一个小的 OSGi应用,该应用演示了servlet,OSGi服务,blueprint和白板模式。
在下一个教程中,我们看看如何在OSGi中使用Apache Camel和Apache CXF。
- Karaf教程第1部分 安装Karaf与第一个应用
- Karaf教程第1部分 安装Karaf与第一个应用
- Karaf教程第6部分-数据库访问
- Karaf教程第8部分-分布式OSGi
- Karaf教程之安装和应用开发
- Karaf教程第2部分 使用Configuration Admin服务
- Karaf教程第4部分 OSGi中的CXF服务
- Karaf教程第7部分- Camel JPA和JTA事务
- Karaf教程第10部分 –声明式服务
- Karaf教程第2部分使用Configuration Admin服务
- Karaf教程第3部分 使用OSGi Metatype服务和Felix Webconsole改善配置编辑
- Karaf教程第5部分-在OSGi中运行 Apache Camel集成
- Karaf教程第9部分基于注解的blueprint和JPA
- karaf学习 (1)
- OSGI-karaf安装及使用
- Karaf 实践指南 Kafka 安装 Karaf 学习 Kafka 帮助
- Apache Karaf
- Karaf jetty
- mysql经典语句写法
- 回文字符串
- [LeetCode] 405.Convert a Number to Hexadecimal
- Sublime Text编辑器如何显示顶部的菜单栏
- Unity3d UI中对于鼠标的监听事件
- Karaf教程第1部分 安装Karaf与第一个应用
- WordPress Functions.php文件详解WordPress插件特点
- Data Binding
- spring通配符?,*,**
- (转载)Java并发编程:volatile关键字解析
- Linux 中将用户添加到组的指令
- jsp页面出现问题,无法解析
- 地图工具类
- Java并发编程:如何创建线程?