layout title tags date categories
post
Apache Karaf构建动态模块化应用(6)--Karaf离线打包发布
osgi karaf maven
2015-08-04 12:15:45
osgi java

概述

在使用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 repository
group-id := < maven groupId > ; group id of maven artifact
artifact-id := < maven artifactId > ; artifact id of maven artifact
version := < maven version > | 'LATEST' | range ; version of maven artifact
range := ( '[' | '(' ) version ',' version ( ')' | ']' )
type := < maven type> ; type of maven artifact
classifier := < 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构件

协议要点

  1. 如果版本(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>  
  1. 如果version是SNAPSHOT版本,则采用与maven一致的策略来解析SNAPSHOT版本;

  2. 如果type未指定,默认值为JAR;

  3. 如果指定了一个type但没有指定version,则必须为version留有占位即:mvn:groups/artifact//type

  4. Pax URL从0.3.0版本开始支持类别Classifier,如果类别classifier未指定,则不启用类别;

  5. 如果指定了类别,但没有指定版本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配置的参数具有高优先级。

参数名称 描述
org.ops4j.pax.url.mvn.certificateCheck optional; true/false if the SSL certificate check should be done. Default false.
org.ops4j.pax.url.mvn.globalUpdatePolicy optional; 控制远程maven仓库的更新策略,maven通过本地POM的时间戳比对为依据。可选的策略包括:always, daily (default), interval:X (where X is an integer in minutes) or never.
org.ops4j.pax.url.mvn.localRepository optional; 指向本地仓库目录的路径
org.ops4j.pax.url.mvn.repositories optional; 以逗号分隔的仓库URL列表
org.ops4j.pax.url.mvn.defaultRepositories optional; 以逗号分隔的默认仓库URL列表
org.ops4j.pax.url.mvn.settings optional; 指向maven settings.xml的路径
org.ops4j.pax.url.mvn.proxySupport optional; true/false if the proxy support is enabled . Default true.

Maven Settings配置查找

如果有必要且maven settings.xml可用,Pax URL Mvn按如下步骤查找settings.xml:

  1. 查找配置参数
  2. 如果未找到,查找 ${user.home}/.m2/settings.xml
  3. 如果未找到,查找 ${maven.home}/conf/settings.xml
  4. 如果未找到,查找 ${M2_HOME}/conf/settings.xml

Maven本地仓库的查找

Maven本地仓库的查找顺序如下:

  1. 查找配置参数定义;
  2. 如果未找到,在settings.xml中进行查找
  3. 如果未找到,默认认为仓库位于${user.home}/.m2/repository.

远端Maven仓库的解析

Maven仓库的解析顺序如下:

  1. 在配置参数中查找
  2. 在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@snapshots
org.ops4j.pax.url.mvn.defaultLocalRepoAsRemote=true
org.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离线打包相关推荐

  1. apache karaf_未来是Apache Karaf上的微服务架构

    apache karaf 这是Jamie Goodyear的客座博客文章( 博客 , @ icbts ). 他是Savoir Technologies的开源倡导者,Apache开发人员和计算机系统分析 ...

  2. 未来是Apache Karaf上的微服务架构

    这是Jamie Goodyear的客座博客文章( 博客 , @ icbts ). 他是Savoir Technologies的开源倡导者,Apache开发人员和计算机系统分析师: 他为全球大型组织设计 ...

  3. Apache Karaf遇到Apache HBase

    介绍 Apache HBase是模仿Google Bigtable的开源,分布式,版本化,面向列的商店. 如果您是普通读者,那么您可能已经知道Apache Karaf是什么,但是对于那些不是的读者:A ...

  4. android没有界面app,Android离线打包 app处于原生界面 切换到桌面再点击app 原生界面被关闭...

    Android离线打包环境, 当app打开原生界面时,点击Home键到桌面,然后点击桌面图标打开app,原生界面被关闭,无论原生界面层级多少,都是返回到io.dcloud.PandoraEntry这个 ...

  5. android asset jar,android离线打包 可以使用,但总是报错 android_asset/null

    按照官网的教程配置了离线打包的项目 https://nativesupport.dcloud.net.cn/AppDocs/usesdk/android 但是总是报错: I/OpenGLRendere ...

  6. android之uniapp从0开始离线打包

    需求:一直都是使用HBuilder-Hello的模板进行离线打包,今天摸索了一下如何从0开始进行离线打包,并且实验成果. 记录一下过程. 第一步:使用android studio新建一个工程,删除ja ...

  7. uni-app项目Android离线打包UrlSchemes设置

    UrlSchemes配置 在uni-app项目中,UrlSchemes设置实现被第三方应用调用,主要有两种情况: 一.在线打包 在HBuilderX 中打开uni-app项目的manifest.jso ...

  8. karaf_未来是Apache Karaf上的微服务架构

    karaf 这是Jamie Goodyear的客座博客文章(博客, @ icbts ). 他是Savoir Technologies的开源倡导者,Apache开发人员和计算机系统分析师: 他为全球大型 ...

  9. uniapp离线打包

    基于uni-app的andiord 离线打包 开发工具及所需要的夹包 1.Android Studio 下载地址 Android Studio官网 2.HBuilderX下载地址 这里HBuilder ...

最新文章

  1. 解决Linux中java.net.UnknownHostException: oracledb.sys.iflashbuy.com问题
  2. hexo-cli博客 hexo-admin编辑器 next主题安装命令整理
  3. 年底要算绩效了,高校青椒有多难?
  4. 数据科学 IPython 笔记本 8.4 简单的折线图
  5. java run 方法_java线程中的run()方法能有几个啊?
  6. 发卡网shell漏洞_Apache Tomcat文件包含漏洞(CVE-2020-1938)复现
  7. c语言汇率转换代码_C语言人民币转换代码..doc
  8. tinymce的中文语言包
  9. windows存储空间清理,C盘空间清理教程,磁盘清理方法
  10. 向量叉积和点积混合运算_向量点积与叉积的意义
  11. HTML布局方式Flex属性详解
  12. 流媒体之播放flv格式的视频
  13. 英文歌曲推荐(lady gaga\Taylor swift\Adele等)
  14. mysql bigint 长度最大多少位_bigint 有多少位
  15. mybatis 配置多数据源 java,SpringBoot+MyBatisPlus配置多数据源读写分离
  16. Kubernetes Dashboard 设置用户密码登陆
  17. 大数据的四个成功案例(来自IT经理网)
  18. NOIP历年第二轮入门组真题集合
  19. 计算机与plc通信参数,PLC与PC计算机通信
  20. 中鑫优配股票配资平台的保障

热门文章

  1. 检测IE版本,提示升级浏览器
  2. 女友的话与背后男友的话
  3. worpdress3.4版本去掉分类目录前缀category
  4. JDBC基础(学习心得)
  5. 模拟器练车对实际驾驶帮助不大
  6. Switch Transformer
  7. Mq测试仪c语言版,mq? - 作业部落 Cmd Markdown 编辑阅读器
  8. Excel如何同时查找多个数据
  9. 总结2016苹果秋季发布会
  10. 【小知识点】MySql数据库增删改查常用语句命令