利用structs2 + felix 快速构建动态模块工程

来源:互联网 发布:nginx keepalived 编辑:程序博客网 时间:2024/06/06 11:02

使用structs2 + felix快速构建可热部署的工程

<1> 开发工具以及依赖jar:
eclipse 3.2 +
tomcat apache-tomcat-7.0.64
jdk : 1.7.0_80

jar版本

struts2.version : 2.3.16.3
org.osgi.compendium : 4.0.0
org.apache.felix.framework : 4.4.1
struts2-osgi-plugin : 2.3.16.3
org.apache.struts.xwork : 2.3.16.3

插件及版本
felix自带测试插件 : struts2-osgi-admin-bundle-2.3.16.3.jar(可监控服务的状态,具体使用方法,请参考网路)

热部署插件: org.apache.felix.fileinstall-3.5.2.jar(该插件可以设置自动监视的路径,开发者开发的插件按照一定得约束格式,拷贝到该目录下即可实现热部署:即无需重启tomcat即可实现服务的发布)
该目录的指定方式:

set JAVA_OPTS="-Dfelix.fileinstall.dir=D:/apache-tomcatVer1.0/apache-tomcat-7.0.64/webapps/webapp/WEB-INF/classes/deploy" 

<2> 开发约束以及注意事项

1: jsp,模板文件的路径问题

请再web.xml通过以下进行配置
    <context-param>            <param-name>TemplatePath</param-name>        <param-value>/login</param-value>    </context-param>

2:关于插件状态一直是starting 的状态

<Bundle-ActivationPolicy>lazy</Bundle-ActivationPolicy>

在maven-bundle-plugin中请将该条去掉,该条的意思为,标注此插件为懒加载模式,即使在别人引用的时候才去加载,不会主动地被加载。此问题的解决来源于http://eclipsesource.com/blogs/2013/01/23/how-to-track-lifecycle-changes-of-osgi-bundles/,该作者写的牛B,哈哈

3:关于版本osgi.ee; filter=”(&(osgi.ee=JavaSE)(version=1.8))之类的错误
关于这个版本问题真的很头疼,所以我的策略是不加任何版本约束信息,在maven-bundle-plugin中请做以下设置

<_noee>true</_noee>

<3> 完整地打包脚本

<plugin>                <groupId>org.apache.felix</groupId>                <artifactId>maven-bundle-plugin</artifactId>                <version>3.0.1</version>                <extensions>true</extensions>                <configuration>                    <instructions>                        <manifestLocation>META-INF</manifestLocation>                        <_noee>true</_noee>                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>                        <Bundle-Version>${project.version}</Bundle-Version>                        <DynamicImport-Package>*</DynamicImport-Package>                        <Export-Package>                            xxx.xxx.action;version=${project.version}                        </Export-Package>                        <Import-Package>!*</Import-Package>                        <Embed-Dependency>*</Embed-Dependency>                        <Embed-Directory>jars</Embed-Directory>                        <Struts2-Enabled>true</Struts2-Enabled>                        <Implementation-Vendor>Apache Software Foundation</Implementation-Vendor>                        <Implementation-Vendor-Id>org.apache.struts</Implementation-Vendor-Id>                        <Implementation-Version>2.3.16.3</Implementation-Version>                        <Bundle-Vendor>Apache Software Foundation</Bundle-Vendor>                        <Bundle-Description>Apache Struts 2</Bundle-Description>                        <Spring-Context>*;create-asynchronously:=true</Spring-Context>                    </instructions>                </configuration>            </plugin>

关于felix版本,和structs2的版本匹配问题,请参考我的上一篇博客,以上内容希望对大家有所帮助。

4: 在母版工程中,一定要启动的顺序是:bundle context –> spring context。
5:在母版的structs.xml中,注意:

<constant name="struts.objectFactory" value="osgi" />    <constant name="struts.objectFactory.delegate" value="springOsgi" />    <constant name="struts.convention.action.disableScanning" value="true"/>

之前没有加那句话(最后一行)之前,老是给我报:unable to scan the name package这样的错误,但是它又没有错,bundle能够正常启动。按照字面的意思,貌似要扫描解析action的包,既然我的action在spring.xml中有定义,那为什么我还要多此一举,所以直接屏蔽不让它扫描。
6 : 在此基础上如果想集成mybatis的小朋友,个人建议还是采用spring 的jdbc template,由于org.mybatis和org.apache.mybatis各自实现了一套sqlsession,所以集成起来比较费劲。

1 0
原创粉丝点击