之前的Opendoc中没有涉及过此部分的内容,maven又是现在非常流行的java的工具,再加上到目前为止搭建OSGi Maven开发和部署的环境还是比较的麻烦,觉得有必要写篇这样的blog,:),在这篇blog中来看下如何搭建一个比较好用的OSGi Maven开发和部署环境,看看我在搭建一个这样的环境中的痛苦历程。
首先说下我期望的OSGi Maven开发/部署的环境:
1、META-INF中的manifest.mf文件可以自己控制;
Eclipse 对插件工程的开发支持的很好了,在IDE中可以很方便的去修改这个manifest.mf,所以还是自己控制更爽,当然,打包的时候需要打入自己控制的这个manifest.mf。
2、在mvn eclipse:eclipse生成的.classpath中,能够不把所依赖的bundle的jar包放进去;
因为在OSGi环境中,已经不再通过直接在project的classpath中依赖其他bundle的jar了来调用其他bundle中的 package,而是通过在manifest.mf中增加imp
ort- package这样的方式,所以不能再把依赖的bundle的jar打到 classpath里了,否则会很奇怪,当然,这也源于eclipse有个很好的插件开发环境,让你可以在不依赖bundle jar的情况下直接写依赖其他bundle的package的代码。
3、在mvn clean package的时候能够把需要依赖的jar打到bundle jar中,并和META-INF/Manifest.mf文件中的Bundle-Classpath是匹配的;
在某些bundle中可能会依赖一些jar,在META-INF中通常会去指定依赖的这些jar,放入bundle-classpath中,因此要求在打包的时候能够把这些依赖的jar打入相应的路径下。
说完想法后,首先想到的是在OSGi界中支持maven环境的大名鼎鼎的maven-bundle-plugin( http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html ),maven-bundle-plugin基于Peter写的bnd实现,不说废话了,按照自己期望的环境来使用maven-bundle-plugin进行搭建:
步骤一
按照上面页面的指导,在pom.xml中增加maven-bundle-plugin先,接着按照自己的想法,要自己控制manifest.mf,于是在plugin的configuration中增加:
<_include>META-INF/MANIFEST.MF</_include>
满心欢喜的等待着完美的结果,可惜....不如人意呀,打包出来的jar里面的MANIFEST.MF已经物是人非了,完全不是自己控制的那个,插件给你 自动的加上了一堆的imp ort-package、private-package、export-package,我知道这个插件是基于bnd来写的, 但没想到竟然连自己控制的权力都不给我了,完全仍然是通过bnd来计算出imp ort-package、private-package什么的;
步骤二
好,在伤心过后接着仔细看,还好,在plugin的configuration中可以自己指定export-package、private- package这些,于是继续欣喜的使用,这两个倒是控制住了,但....imp ort- package自己是不能控制的,这个是不行的,这样就导致了必 须同时自己维护pom.xml以及project中的META-INF/MANIFEST.MF,让它们保持一致,否则可能导致打出来的包和你在 project中运行的表现不一致,并且bnd计算出来的imp ort-package并不是我想要的,有点太复杂了,还是自己控制比较好;
步骤三
伤心到极点了,其实到目前为止,已经可以确定maven-bundle-plugin,也是OSGi maven中唯一的插件,不能满足我的需求,不过还是继续看看这个插件其他方面的表现,惊喜的发现有一点倒是做的不错的,它支持一个<Embed-Dependency> *;scope=compile|runtime</Embed-Dependency>,有了这个标签后,它可以直接把依赖的jar打入bundle jar包中,并且相应的自动在bundle-classpath中加上了,这点倒是不错的,看起来与我期望的环境的第3点是比较匹配的,可惜了。
还有就是,很当然的,它没法做到控制mvn eclipse:eclipse时生成的.classpath不包含bundle jar的引用。
按照上面的三个步骤,总结下,有些时候智能是好事,但maven-bundle-plugin就是过于智能了,为什么不给点权力给使用者呢,因此这个插件 要提升到完全可用的情况的话,还需要提供下让使用者自己控制MANIFEST.MF的权力,相信这点要做到并不困难,而且做到这点后基本也就可以使用了。
继续寻找,于是静心分析了下自己的需求,貌似可以自己通过maven现有的几个插件来达成自己的愿望,于是开始了组合拳:
1、MANIFEST.MF文件自己控制
不就是要自己控制这个文件嘛,OK,干脆,就只用maven-jar-plugin,这个插件允许指定所使用的MANIFEST.MF文件,于是,尝试着在这个plugin的configuration中增加:
<archive>
<manifestFile>META-INF/MANIFEST.MF</manifestFile>
</archive>
恩,很顺利,开门红呀,打出来的jar包中的MANIFEST.MF文件就是自己的那个。
2、mvn eclipse:eclipse生成的.classpath中要去掉bundle jar的依赖
对于我这么一个对maven不是那么熟悉的人来讲,这个有点复杂,于是不断的google,甚至是翻看了maven-eclipse-plugin的源码...
最终终于功夫不负有心人,找到一个简单的办法:
首先将工程方式指定为pde,也就是eclipse插件工程,在maven-eclipse-plugin的configuration配置中增加<pde>true</pde>;
然后在pom.xml中将不希望生成到.classpath中依赖的scope指定为provided;
心惊胆战的开始运行mvn eclipse:eclipse,OH YEAH!,成功!
ps: 另外也可以通过在maven-eclipse-plugin的configuration中增加exclude配置,来将某些依赖从.classpath中去掉,当然,这方法没有上面的易用。
3、在mvn clean package的时候能够把需要依赖的jar打到bundle jar中,并和META-INF/Manifest.mf文件中的Bundle-Classpath是匹配的;
恩,这点,印象中貌似maven是有支持的,于是继续开始找,终于找到了maven- dependency-plugin(之前还找到了一个maven-shade-plugin,也很帅,不过不满足需求),通过这个插件可以把需要的依赖 的jar都复制到某个指定的目录中去,但记得把这个指定的目录加入到maven-jar-plugin的resources目录里面去,否则这些jar文 件是不会出现在你的bundle jar里的。
OK,通过上面这套组合拳,终于达成了目的,看来有必要找个时间写个好用点的maven的OSGi插件,否则真的忒折腾了,上面这个方法仍然有几个痛苦的地方:
1、如果你的bundle中需要export其中依赖的lib的package的话;
mvn eclipse:eclipse之后你会发现其他bundle即使import 了这个package,也会调用不到,这里的原因在于生成 的.classpath中所依赖的那个lib的exported属性没有设置为true,google了maven eclipse插件,貌似这是它的一个缺失的功能,因此在目前只能是mvn eclipse:eclipse后,再到build path里把这些lib exported出去。
2、还是得在插件的pom.xml中配置所依赖的其他的bundle;
这是为了让你在mvn clean package的时候能通过,这点还是挺郁闷的,如果能自己去找到的话就好了(Felix构建bundle repo是有潜质做到这点的),:),这样导致了在每次在import package后,还得记得去修改了pom,否则的话在eclipse compile什么都正常,到了maven里就挂了。
因此,如果能解决上面两点的话,那将更加完美。
分享到:
相关推荐
在本篇文章中,我们将详细介绍如何使用Maven构建一个OSGi项目,包括项目的创建、容器的启动、Bundle的导入与创建等方面。 #### 开发环境 - Eclipse 3.6 或更高版本 - Maven - OSGi框架(例如Equinox或Felix) - ...
由于没有直接的描述,我们可以推测这可能涉及到如何在OSGi环境中使用Maven进行构建和管理Java项目。 【标签】:“源码”和“工具”这两个标签暗示了讨论可能涵盖了OSGi和Maven的基础概念、它们在实际开发中的应用,...
在文档集中的"OSGIʵս.pdf"可能详细介绍了OSGI的基础概念、框架结构以及如何利用OSGI进行开发。 **2. Maven** Maven是一个项目管理和综合工具,用于构建、依赖管理和项目信息管理。它通过一个项目对象模型...
在Eclipse中,使用Maven进行bundle打包通常涉及以下几个步骤: 1. **设置Maven项目**: 创建一个新的Maven项目或者将现有的Eclipse项目转换为Maven项目。在Eclipse中,可以通过右键点击项目 -> Configure -> Convert...
`mvn package`命令是使用Maven进行编译和打包的命令,这将在项目的“target”目录下生成一个捆绑包。而“将捆绑罐复制到OSGI容器,例如Felix或Faran”表明我们需要将生成的捆绑包部署到支持OSGi的容器中,如Apache ...
标题中的“基于virgo环境的OSGI+Maven的web开发代码下载”表明这是一个使用OSGi(模块化Java系统)和Maven构建的Web应用程序项目,运行在Virgo服务器上。Virgo是SpringSource推出的一个OSGi应用服务器,它支持Spring...
8. **部署和管理**:如何在OSGI运行时环境(如Equinox或Felix)中部署和管理bundle,以及如何使用OSGI的命令行工具或图形用户界面进行操作。 9. **实战应用**:"OSGI实战.pdf"可能包含实际项目案例,演示如何在真实...
2. **配置构建工具**:使用Maven或Gradle等构建工具,配置OSGi插件,以便生成符合OSGi规范的jar文件。 3. **创建启动配置**:定义一个启动配置,指定初始运行时需要的bundle及其依赖关系。 4. **打包**:使用如...
学习OSGI实战,你需要理解bundle的打包、部署和配置,以及如何使用OSGI命令行工具进行管理。 3. OSGI进阶: 进阶学习OSGI涉及到更深入的概念,如动态性、服务和事件模型。动态性意味着bundle可以在运行时安装、...
使用Maven原型创建项目后,开发者可以进入项目目录,执行编译和打包命令来构建项目,从而创建出可部署的Bundle。 总的来说,OSGi与Felix的结合为Java开发者提供了一种强大而灵活的方式,以模块化的方式进行应用开发...
通过阅读《OSGi and Apache Felix 3.0 Beginner's Guide》书籍,初学者可以掌握如何利用Felix框架创建OSGi应用程序,这包括如何设置开发环境、构建、打包和部署OSGi束,以及如何使用Maven进行项目管理。这本书为想要...
对于ServiceMix项目,我们通常关心的是打包阶段,Maven可以将项目打包成kar或bundle格式,这些格式是ServiceMix所接受的。 **5. 依赖管理** 在ServiceMix项目中,我们可能需要引用其他的服务或者组件,这些都可以...
5. **打包工具**:为了方便创建和管理OSGi bundle,有一些工具可以帮助开发者,如Apache Maven的maven-bundle-plugin或Gradle的osgi plugin。这些工具能够自动生成满足OSGi规范的MANIFEST.MF,并将依赖关系正确地...
3. 使用构建工具(Maven或Gradle)编译源代码并打包为OSGi bundle。 4. 将打包好的bundle复制到OSGi运行时的`bundles`目录。 5. 启动OSGi运行时,并观察控制台输出,确认bundle是否成功加载和启动。 6. 如果项目提供...
2. **创建bundle**:使用OSGi兼容的构建工具(如BndTools或Maven Bundle Plugin)将“myself”工程打包为bundle。在MANIFEST.MF文件中,定义Bundle-SymbolicName和Bundle-Version属性,以标识bundle的唯一性和版本。...
1. **创建bundle项目**:使用如BndTools这样的工具,或者直接使用Maven或Gradle的OSGi插件,来设置bundle的MANIFEST.MF文件,定义bundle的导出和导入包。 2. **定义服务和组件**:使用DS或Spring的XML配置,声明...
在Java开发领域,Maven是一个广泛使用的构建工具,它极大地简化了项目的构建、管理和依赖管理过程。Maven Plugin是Maven生态系统中的一个重要组成部分,它提供了多种功能,帮助开发者执行特定的任务,如编译代码、...
这涉及到理解JAR结构,以及如何使用工具如Apache Felix Bundle Plugin (BND)或Maven Bundle Plugin进行打包。 7. **调试与日志**:熟悉在OSGi环境中如何进行调试,以及如何配置和使用日志服务来记录bundle的运行...
这些组件可以打包成OSGI bundle,以便在Jetty中运行。 4. **配置Jetty**:在OSGI环境中,你可以通过编程方式或配置文件来设置Jetty。例如,定义监听端口、配置web.xml、设置会话管理等。这通常需要通过OSGI服务注册...