使用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,所以集成起来比较费劲。