本文目的
Apache Karaf项目在基于OSGi的组件框架应用开发中为开发者和架构师提供了一个便利的基础运行和部署框架。通过Karaf的Feature定义及Kar打包,开发者可以自由的定义OSGi Bundle的分组并按需定制细粒度的打包定义,在系统发布时,通过自由组合这些feature及kar,可以快速发布针对性的产品或特定的发布包。
Karaf通过与maven相结合,可以为用户基于OSGi Bundle的模块化开发、测试、集成和持续交付提供方便和快速的解决方案。
本文为主要探讨在开发阶段如何快速搭建基于maven的自定义的karaf开发调试环境提供一种方案,对于想对karaf的配置环境进行自定义和裁剪的开发人员可以参考此方案。
Karaf概念基础
关于Karaf项目为OSGi基础运行环境提供的功能请参考其官方网站。这里,我重点提一下Karaf的Feature定义和Kar打包。
Karaf的Feature定义
Karaf的Feature概念可以看作是一个系统的子系统实现。我们知道OSGi是基于Bundle和Service进行开发的,对于Bundle的粒度控制需要开发人员根据项目和系统功能凭借经验自己控制。在一个大的系统中,可能存在成百上千的Bundle,这么多Bundle如果聚合在一起,如何区分和维护将是一个巨大的挑战,这往往导致一些开发人员和架构师对OSGi模块化望而却步。而通过Karaf的Feature定义,最小单元的OSGi Bundle可以根据功能部分聚合在一起形成一个功能Feature,多个Feature可以聚合在一起形成一个大的Feature,最终所有的OSGi Bundle就有序的组合起来,就可以形成清晰的,可重复利用的一个个功能Feature,实现系统的真正模块化开发和组件的重复利用。
现在,我们来看一个Karaf的Feature定义:
<feature resolver="(obr)" description="Implementation of the OSGI HTTP Service" version="3.0.0-SNAPSHOT" name="http"> <feature version="3.0.4-SNAPSHOT">pax-http</feature> <bundle start-level="30">mvn:org.apache.karaf.http/org.apache.karaf.http.core/3.0.0-SNAPSHOT</bundle> <bundle start-level="30">mvn:org.apache.karaf.http/org.apache.karaf.http.command/3.0.0-SNAPSHOT</bundle> </feature>
从这个Feature定义可以看到,此Feature定义了OSGi中提供Http服务的功能,Feature里有karaf的两个http功能相关的bundle,同时,这个feature也对ops4j的Pax web项目提供的一组bundle组成的feature “pax-http”具有依赖关系。
当Karaf运行时,如果加载了此feature(位于Karaf的standard feature库中)和其所依赖的pax-http feature(位于pax-web-features库中),同时指定启动http featue,则Karaf启动时自动加载并启动这一组相关的bundle集。
Karaf Kar打包
Karaf的Kar打包功能存在于karaf的karaf-maven-plugin插件中。通过此插件,karaf可以将featue定义中的所有bundle及其依赖打包到一个以.kar为后缀的压缩文件中,形成可发布的组件包。通过karaf-maven-plugin插件与maven打包相关的其它插件配合,用户可以自由定义发布包的结构。
对于多个已定义的kar分发包,通过maven依赖,可以在一个最终的maven发布工程中打包在一起,形成一个产品的发布包。
基于Maven的Karaf自定义调试环境搭建过程
下面简要讲述一下基于maven的Karaf自定义调试环境的搭建过程。通常,基于OSGi的开发,开发人员往往依赖Eclipse的插件开发环境,实际上,基于maven的OSGi插件开发(Felix的maven-bundle-plugin插件)同样方便、快速和高效,而且不受开发环境的限制。基于maven的OSGi开发,这里推荐使用Netbeans IDE,Netbeans对maven项目具有原生支持,可以自动解析maven的pom构建工程。
第一步,在pom中配置对karaf的依赖和启动配置
<?xml version="1.0" encoding="UTF-8"?> <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> <parent> <artifactId>karaf</artifactId> <groupId>ossu.sandbox.karaf</groupId> <version>2.0.0-SNAPSHOT</version> </parent> <groupId>ossu.sandbox.karaf</groupId> <artifactId>karaf.launcher</artifactId> <packaging>pom</packaging> <name>Ossu Sandbox :: Karaf :: Launcher</name> <description>Run karaf instance or debug karaf instance</description> <dependencies> <dependency> <groupId>org.apache.karaf.features</groupId> <artifactId>framework</artifactId> <type>kar</type> </dependency> <dependency> <!-- scope is runtime so the feature repo is listed in the features service config file, and features may be installed using the karaf-maven-plugin configuration --> <groupId>org.apache.karaf.features</groupId> <artifactId>standard</artifactId> <classifier>features</classifier> <type>xml</type> <scope>runtime</scope> </dependency> <dependency> <!-- scope is runtime so the feature repo is listed in the features service config file, and features may be installed using the karaf-maven-plugin configuration --> <groupId>org.apache.karaf.features</groupId> <artifactId>spring</artifactId> <classifier>features</classifier> <type>xml</type> <scope>runtime</scope> </dependency> <dependency> <groupId>ossu.sandbox.karaf</groupId> <artifactId>karaf.boilerplate.framework</artifactId> <type>kar</type> <version>${project.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.karaf.tooling</groupId> <artifactId>karaf-maven-plugin</artifactId> <executions> <execution> <id>process-resources</id> <phase>process-resources</phase> <goals> <goal>install-kars</goal> </goals> </execution> </executions> <configuration> <installedFeatures> <feature>wrapper</feature> </installedFeatures> <bootFeatures> <feature>framework</feature> <feature>standard</feature> <!--<feature>obr</feature>--> <feature>region</feature> <!--<feature>spring</feature>--> </bootFeatures> </configuration> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <executions> <execution> <goals> <goal>exec</goal> </goals> </execution> </executions> <configuration> <executable>java</executable> <workingDirectory>${project.basedir}/target/assembly</workingDirectory> <arguments> <argument>-classpath</argument> <argument>${project.basedir}/target/assembly/conf${path.separator}${project.basedir}/target/assembly/lib/karaf-jaas-boot.jar${path.separator}${project.basedir}/target/assembly/lib/karaf-jmx-boot.jar${path.separator}${project.basedir}/target/assembly/lib/karaf-org.osgi.core.jar${path.separator}${project.basedir}/target/assembly/lib/karaf.jar</argument> <argument>-Xmx512m</argument> <argument>-XX:MaxPermSize=512m</argument> <argument>-Dkaraf.startRemoteShell=true</argument> <argument>-Djava.net.preferIPv4Stack=true</argument> <argument>-Dderby.system.home=${project.basedir}/target/assembly/data/derby</argument> <argument>-Dderby.storage.fileSyncTransactionLog=true</argument> <argument>-Dcom.sun.management.jmxremote</argument> <argument>-Dkaraf.startLocalConsole=true</argument> <argument>-Djline.WindowsTerminal.directConsole=false</argument> <argument>-Dkaraf.home=${project.basedir}/target/assembly</argument> <argument>-Dkaraf.base=${project.basedir}/target/assembly</argument> <argument>-Dkaraf.etc=${project.basedir}/target/assembly/etc</argument> <argument>-Dkaraf.instances=${project.basedir}/target/assembly/instances</argument> <argument>-Djava.io.tmpdir=${project.basedir}/target/assembly/data/tmp</argument> <argument>-Djava.endorsed.dirs=${project.basedir}/target/assembly/lib/endorsed</argument> <argument>-Dkaraf.data=${project.basedir}/target/assembly/data</argument> <argument>-Djava.util.logging.config.file=${project.basedir}/target/assembly/etc/java.util.logging.properties</argument> <!-- Debug configuration --> <argument>-Xdebug</argument> <argument>-Djava.compiler=NONE</argument> <argument>-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005</argument> <argument>org.apache.karaf.main.Main</argument> </arguments> </configuration> </plugin> </plugins> </build> </project>
通过这个pom,我们既可以在maven环境中启动karaf并进行调试。下面做一下详细说明:
1)依赖部分
主要包括对karaf Framework kar的依赖,这是karaf框架的kar发布包,通过对其依赖,在运行时,karaf的基础目录结构将被创建(位于该pom所在工程的target/assembly下);
对karaf的standard Feature库和spring feature库进行依赖,通过对这两个feature库进行依赖,karaf在运行时可以知道到这两个feature库中查找具体的feature定义
对ossu.sandbox.karaf:karaf.boilerplate.framework这个kar工程的依赖(这个kar是对karaf的具体裁剪,后面会讲到)。
2)编译运行部分
编译运行部分主要包括两个maven插件:karaf-maven-plugin和exec-maven-plugin。
karaf-maven-plugin
此插件对依赖(jar、kar等)进行打包,生成发布kar包,并可以指定启动哪些feature
<bootFeatures> <feature>framework</feature> <feature>standard</feature> <!--<feature>obr</feature>--> <feature>region</feature> <!--<feature>spring</feature>--> </bootFeatures>
exec-maven-plugin
此插件用于在maven工程中启动一个java虚拟机,此处主要是配置了karaf的启动参数并通过org.apache.karaf.main.Main入口启动Karaf。
3)启动Karaf
命令行环境下输入:
mvn clean package exec:exec
输出如下:
在Netbeans IDE环境中启动执行,如下图所示,右键点击工程,在弹出菜单中选择定制——目标:
在弹出窗口中输入:
clean package exec:exec
如下图所示
点击“确定”,执行结果如下图
注意的几点
1)限于篇幅,对于karaf的裁剪和自定义,将在后续文章中探讨。
2)karaf启动时开启了5005调试端口,可以连接上进行代码调试
3)此示例工程代码位于github的https://github.com/xqttrc/sandbox工程下
4)此工程代码对https://github.com/xqttrc/nebula项目下的parent工程有依赖,可以将此工程下的pom拿下来单独编译,也可以自行调整。
相关推荐
"构建基于Maven的SSH原型项目"这个主题,旨在帮助初学者理解和掌握如何使用这些技术搭建一个基础的Web应用。 首先,Maven是Apache开发的一个项目管理工具,它通过一个项目对象模型(Project Object Model,POM)来...
### Maven环境搭建与配置详解 #### 一、Maven简介 Maven是Apache下的一个开源项目,它是一种项目管理和理解工具。通过一个中心信息管理的方式,Maven能够管理项目的构建、报告和文档。Maven使用描述性的XML文件来...
在本文中,我们将基于maven创建一个web项目,首先我们需要搭建maven环境,包括安装Myeclipse2013、Tomcat8.0、Jdk1.8和apache-maven-3.3.9。然后,我们需要配置jdk和maven的环境变量,包括设置JAVA_HOME和MAVEN_HOME...
1. **环境搭建**:安装Maven、IDE(如IntelliJ IDEA或Eclipse),设置好开发环境。 2. **创建Maven项目**:使用Maven的archetype插件生成SSM的初始项目结构。 3. **配置项目**:编写pom.xml,配置Spring、Spring MVC...
### Maven开发环境搭建详解 ...通过上述步骤,你可以成功地在Eclipse中搭建基于Maven的Java Web项目开发环境,并进行调试和服务配置。这不仅能够提高开发效率,还能够帮助开发者更好地管理项目的依赖关系。
本资源是《基于 maven 的 ssm 项目搭建》系列文章的阶段代码,截止于《基于 maven 的 ssm 项目搭建六:整合 druid 和 mybatis》,文章原地址:http://blog.csdn.net/xz2001/article/details/73240835
本篇文章将详细探讨如何使用Maven构建一个自定义标签库,并在Web应用中使用它。 自定义标签库是JSP 2.0引入的一个特性,它允许开发者创建自己的标签,这些标签可以封装复杂的逻辑或重复使用的代码,从而提高代码的...
在本文中,我们将详细讨论如何搭建Maven工程开发环境以及进行一些基本的操作。Maven是一个强大的Java项目管理和构建工具,它简化了构建过程,管理依赖关系,并提供了标准化的项目结构。以下是搭建Maven环境和进行...
提供了基于Nexus搭建Maven私服所需要的一切资源和个人经验,搭建后可maven deploy 上传自己的jar包。别人如何在自己的maven项目中引用我将单独再上传一份。
maven私服搭建文档里简单介绍了maven私服的搭建及配置
本文将详细讲解如何使用Maven构建工具来搭建一个基于SSM的项目。 首先,我们需要理解SSM框架的各个组成部分: 1. **Spring**:这是一个全面的Java应用框架,提供依赖注入(DI)、面向切面编程(AOP)、事务管理等...
在这个基于Maven的SSH框架搭建实例中,我们将探讨如何利用这些框架以及Maven构建工具来搭建一个完整的Web项目。 首先,Spring框架是核心,它提供了依赖注入(DI)和面向切面编程(AOP)的功能,以实现松耦合和更好...
标题中提到的"Maven搭建Kafka Java开发环境需要的jar包",意味着我们需要为Maven项目配置Kafka的依赖。首先,我们需要在项目的`pom.xml`文件中添加Kafka的相关依赖。例如,如果我们需要使用Apache Kafka 2.8版本,...
总的来说,自定义Maven插件是提升开发效率、实现个性化需求的重要手段。开发者需要理解Maven的生命周期和插件机制,才能灵活地设计和实现自定义插件。同时,良好的文档和测试也是确保插件质量的关键。
Myeclipse 配置 Maven 环境搭建的步骤包括 Maven 的下载安装准备工作、Maven 环境配置、配置调试、修改本地仓库配置和 Myeclipse 结合 Maven 快速配置搭建 Web 项目等几个方面。通过这些步骤,可以实现 Myeclipse 和...
maven搭建web项目hello world
本部分文档详细介绍了如何利用Maven工具搭建一个基于Spring框架、SpringMVC和Mybatis的Java Web应用程序的开发环境。以下是对所给文件内容的知识点详尽阐述: 1. 开发环境需求: - 开发工具:Eclipse IDE,一个...