Apache Karaf离线打包
来源:互联网 发布:蒙泰软件视频教程 编辑:程序博客网 时间:2024/06/11 12:20
概述
在使用Apache Karaf进行实际打包发布时,基于Maven的自动依赖环境可能会制约产品的打包发布。因为出于安全要求,要部署运行的环境往往不能 随意访问远程的Maven仓库,这时就需要将产品运行所需要的所有Feature及Bundle等进行离线打包。
Karaf对OSGi Bundle的组织采用Pax的 maven url 方式,这也隐性的继承了maven的特性,即,所有的依赖来自maven仓库, 在实际开发中,这大大的便利了项目结构的组织和维护,开发人员只要指明对某个bundle的maven依赖,karaf自动去选取和下载。
本文对之前写的一篇博客进行了简单整理,作为本系列的一部分。
Pax URL Mvn协议
在讨论karaf的maven依赖加载与管理之前,我们先了解一下Pax URL项目的Mvn协议:
mvn-uri := 'mvn:' [ repository-url '!' ] group-id '/' artifact-id [ '/' [version] [ '/' [type] [ '/' classifier ] ] ] ] repository-url := < rfc2396 uri > ; an url that points to a maven 2 repositorygroup-id := < maven groupId > ; group id of maven artifactartifact-id := < maven artifactId > ; artifact id of maven artifactversion := < maven version > | 'LATEST' | range ; version of maven artifactrange := ( '[' | '(' ) version ',' version ( ')' | ']' )type := < maven type> ; type of maven artifactclassifier := < maven classifier> ; maven artifact classifier
假设项目需要依赖Pax Web的service-0.2.0-SNAPSHOT.jar,对应的Mvn协议示例如下:
- mvn:org.ops4j.pax.web.bundles/service
- mvn:org.ops4j.pax.web.bundles/service/LATEST
- mvn:org.ops4j.pax.web.bundles/service/0.2.0-SNAPSHOT
- mvn:http://repository.ops4j.org/maven2!org.ops4j.pax.web.bundles/service/0.2.0
- mvn:file://c:/localRepo!org.ops4j.pax.web.bundles/service/0.2.0 # 从目录中加载
- mvn:org.ops4j.pax.web/pax-web-features/3.0.4-SNAPSHOT/xml/features # 标识pax-web-features-3.0.4-SNAPSHOT-features.xml构件
协议要点
- 如果版本(version)未指定,将使用默认值“LATEST”,并从可用的Maven元数据(metadata)中解析最新的版本,maven metadata的示例如下:
<?xml version="1.0" encoding="UTF-8"?> <metadata modelVersion="1.1.0"> <groupId>org.ops4j.pax.web</groupId> <artifactId>pax-web-features</artifactId> <version>3.0.4-SNAPSHOT</version> <versioning> <snapshot> <timestamp>20131113.170334</timestamp> <buildNumber>2</buildNumber> </snapshot> <lastUpdated>20131113170334</lastUpdated> <snapshotVersions> <snapshotVersion> <extension>pom</extension> <value>3.0.4-20131113.170334-2</value> <updated>20131113170334</updated> </snapshotVersion> <snapshotVersion> <classifier>features</classifier> <extension>xml</extension> <value>3.0.4-20131113.170334-2</value> <updated>20131113170334</updated> </snapshotVersion> </snapshotVersions> </versioning> </metadata>
如果version是SNAPSHOT版本,则采用与maven一致的策略来解析SNAPSHOT版本;
如果type未指定,默认值为JAR;
如果指定了一个type但没有指定version,则必须为version留有占位即:mvn:groups/artifact//type
Pax URL从0.3.0版本开始支持类别Classifier,如果类别classifier未指定,则不启用类别;
如果指定了类别,但没有指定版本version或类型type,则必须未版本和(或)类型留有占位,即:
mvn:groups/artifact///classifier
或
mvn:groups/artifact/version//classifier
或
mvn:groups/artifact//type/classifier
版本范围
从0.2.0版本开始,Pax URL Mvn支持版本范围,示例如下
- [1.2.3, 4.5.6) — 1.2.3 <= x < 4.5.6- [1.2.3, 4.5.6] — 1.2.3 <= x <= 4.5.6- (1.2.3, 4.5.6) — 1.2.3 < x < 4.5.6- (1.2.3, 4.5.6] — 1.2.3 < x <= 4.5.6
mvn协议的参数配置
可以通过两种方式来配置Mvn协议:1)通过OSGi CM;2)通过框架/系统变量。通过CM配置的参数具有高优先级。
Maven Settings配置查找
如果有必要且maven settings.xml可用,Pax URL Mvn按如下步骤查找settings.xml:
- 查找配置参数
- 如果未找到,查找 ${user.home}/.m2/settings.xml
- 如果未找到,查找 ${maven.home}/conf/settings.xml
- 如果未找到,查找 ${M2_HOME}/conf/settings.xml
Maven本地仓库的查找
Maven本地仓库的查找顺序如下:
- 查找配置参数定义;
- 如果未找到,在settings.xml中进行查找
- 如果未找到,默认认为仓库位于${user.home}/.m2/repository.
远端Maven仓库的解析
Maven仓库的解析顺序如下:
- 在配置参数中查找
- 在settings.xml中查找
如果配置参数中 org.ops4j.pax.url.mvn.repositories 的值以'+'开始,则来自settings.xml中的仓库地址也将附加到此配置的仓库列表中。
设定仓库包含release/snapshot
可以在参数配置的仓库URL中通过添加如下标识来指定仓库所含有的构件类型(不区分大小写):
启用snapshots — 添加 @snapshots禁用releases — 添加 @noreleases
示例如下:
- http://repository.ops4j.org ; 默认不包含任何标识,只查找releases, 不包括snapshots
- http://repository.ops4j.org/mvn-snapshots@snapshots ; 同时在此仓库查找releases和snapshots
- http://repository.ops4j.org/mvn-snapshots@snapshots@noreleases ; 仅查找snapshots, 不查找releases
默认仓库
在某些情况下,通过默认仓库配置,可以防止用户配置对下载构件造成影响。如果对org.ops4j.pax.url.mvn.defaultRepositories 进行了设置,则Pax URL Mvn首先检查此参数设定的默认仓库列表,如果未找到,则继续查找本地仓库和其它在 org.ops4j.pax.url.mvn.repositories 中配置的仓库。
Karaf中Maven仓库处理策略的配置
默认仓库处理策略
Karaf通过 OSGi CM(config admin) 服务对Pax URL Mvn协议处理进行参数配置,具体的配置是位于${karaf.home}/etc
下的 org.ops4j.pax.url.mvn.cfg
文件:
#org.ops4j.pax.url.mvn.certificateCheck=#org.ops4j.pax.url.mvn.settings=#org.ops4j.pax.url.mvn.localRepository=org.ops4j.pax.url.mvn.useFallbackRepositories=false# org.ops4j.pax.url.mvn.proxySupport=falseorg.ops4j.pax.url.mvn.defaultRepositories=\ file:${karaf.home}/${karaf.default.repository}@id=system.repository@snapshots, \ file:${karaf.data}/kar@id=kar.repository@multi@snapshots, \ file:${karaf.base}/${karaf.default.repository}@id=child.system.repository@snapshots# Use the default local repo (e.g.~/.m2/repository) as a "remote" repo#org.ops4j.pax.url.mvn.defaultLocalRepoAsRemote=falseorg.ops4j.pax.url.mvn.repositories= \ http://repo1.maven.org/maven2@id=central, \ http://repository.springsource.com/maven/bundles/release@id=spring.ebr.release, \ http://repository.springsource.com/maven/bundles/external@id=spring.ebr.external, \ http://zodiac.springsource.com/maven/bundles/release@id=gemini, \ http://repository.apache.org/content/groups/snapshots-group@id=apache@snapshots@noreleases, \ https://oss.sonatype.org/content/repositories/snapshots@id=sonatype.snapshots.deploy@snapshots@noreleases, \ https://oss.sonatype.org/content/repositories/ops4j-snapshots@id=ops4j.sonatype.snapshots.deploy@snapshots@noreleases, \ http://repository.springsource.com/maven/bundles/external@id=spring-ebr-repository@snapshots@noreleases
下面我们来看一下如何通过调整此配置文件,使得Karaf不再依赖远程Maven仓库和本地Maven仓库,让Karaf发布包随意离线部署成为现实。
首先我们来看一下在org.ops4j.pax.url.mvn.repositories配置中存在两个指向目录路径的仓库URL,即:
file:${karaf.home}/${karaf.default.repository}@id=system.repository
和
file:${karaf.data}/kar@id=kar.repository@multi。file:${karaf.home}/${karaf.default.repository}@id=system.repository
实际指向的是karaf安装目录下的 system目录(也可以根据需要自行调整,karaf.default.repository
参数位于etc/system.properties 文件中);
file:${karaf.data}/kar@id=kar.repository@multi
实际指向的是karaf安装目录下的 data/kar 目录。
离线处理策略
通过禁用其他仓库URL,只启用这两个位置仓库,则karaf发布程序即可实现离线部署。
上面的org.ops4j.pax.url.mvn.cfg
文件按下面具体配置进行调整:
org.ops4j.pax.url.mvn.settings=org.ops4j.pax.url.mvn.localRepository=file:${karaf.home}/${karaf.default.repository}@id=system.repository@snapshotsorg.ops4j.pax.url.mvn.defaultLocalRepoAsRemote=trueorg.ops4j.pax.url.mvn.repositories= \ file:${karaf.home}/${karaf.default.repository}@id=system.repository@snapshots, \ file:${karaf.data}/kar@id=kar.repository@multi
此模式下,Pax URL Mvn优先检查system仓库,如果不存在,则检查${user.home}/.m2下的配置,如果没有settings.xml和repository目录,则加载依赖失败。
在实际部署时,确保system仓库包含所有依赖的bundle即可。
通过此方案,如果发布包中的system目录包含了系统运行所需的所有依赖,则karaf将不再寻求从远程仓库加载依赖,从而实现离线部署。
离线依赖自动打包
通过上述方案实现karaf离线部署的同时产生了新的问题,如何确保system目录包含所有的依赖同时又不包含无用的冗余依赖?
这个问题可以通过karaf-maven-plugin提供的 features-add-to-repository 目标获得解决。在打包部署时,系统自动将Feature里的Bundle打包到system目录下。 下面来看一下配置:
<plugin> <groupId>org.apache.karaf.tooling</groupId> <artifactId>karaf-maven-plugin</artifactId> <executions> <execution> <id>install-kar</id> <phase>compile</phase> <goals> <goal>install-kars</goal> </goals> </execution> <execution> <id>features-add-to-repo</id> <phase>generate-resources</phase> <goals> features-add-to-repository </goals> <configuration> <descriptors> <descriptor>mvn:org.apache.karaf.features/standard/${karaf.version}/xml/features</descriptor> <descriptor>mvn:org.apache.karaf.features/spring/${karaf.version}/xml/features</descriptor> …… </descriptors> <features> <feature>http</feature> <feature>spring</feature> … </features> <repository>target/assembly/system</repository> </configuration> </execution> <execution> <id>package</id> <goals> <goal>instance-create-archive</goal> </goals> </execution> </executions></plugin>
通过此配置,系统在打包时,自动将karaf的standard feature库中的http feature及其依赖和spring feature库中的spring feature及其依赖下载到system目录中一起打包发布。
结论
通过上述方案,我们即可实现基于Karaf的项目自动打包、测试及发布。
- Apache Karaf离线打包
- Apache Karaf
- Apache Karaf用户指导
- Apache karaf端口配置
- Apache Karaf用户指导
- Apache Karaf自定义feature
- apache karaf quick start
- Apache Karaf Overview 特性 了解
- Apache Karaf配置远程调试
- Apache Karaf开启ssl Https
- Apache Karaf自定义console命令
- Apache Karaf配置远程调试
- 基于karaf的自动部署打包
- Apache Karaf安装带classifier的bundle
- maven karaf 4.0x中使用jetty部署web 应用;karaf 4.0 x离线使用
- 基于Karaf的项目离线封装与发布
- Apache Karaf集群(Cellar)安装和配置
- HBuilder离线打包教程
- OpenCV之feature2d 模块. 2D特征框架(1)Harris 角点检测子 Shi-Tomasi角点检测子 定制化创建角点检测子 亚像素级的角点检测 特征点检测
- Linux ssh远程登录到另一台机器命令
- 欢迎使用CSDN-markdown编辑器
- Oracle 11g笔记——参数
- AnyEvent::HTTP 介绍
- Apache Karaf离线打包
- mac中的sed用法的区别
- js正则表达式学习和总结
- 进程的概念和特征
- 【Breeze】【Scala】基于梯度下降的简单逻辑回归编程实现 Logistic Regression - GD
- es的几个重要接口的应用
- 自定义shape的使用(矩形弧角Button)
- Git 使用方法
- c++.dll打印日志到c#界面,使用回调函数