Using Maven in Oracle ADF ( as build tool )

JDev ver. 11.1.1.2.0
Maven 2.2.1

(本文所述不是严格意义上的maven在Oracle ADF应用开发中的使用,仅尝试使用maven作为ADF开发的每日编译工具。)

JDeveloper
11.1.1.2.0以插件的形式为JDeveloper
11g带来了maven的支持。这种支持在11.1.1.2.0中仅限于对常规开发的maven支持,而对于如何为ADF应用添加maven的支持以解决
诸如ADF应用对于Library的依赖、ADF应用打包为ADF Library Jar
File、ADF应用之间的依赖等问题并未提出解决方案。Oracle官方表示在11.1.1.2.0中maven尚属于技术预览,尚未完成。


某特定ADF应用中,将ADF应用分为主应用、模块、功能,主应用为不包含BC的ADF应用,用于解决登录、Session管理等内容;应用分为模块进行
开发,如系统管理模块,每个模块具体分为功能进行开发,如用户管理、组管理等。进行应用构建时,将每个功能打包为ADF Library Jar
File,将同一模块的所有功能jar包合并为该模块的ADF Library Jar File,再以jar library的形式将该ADF
Library Jar
File加入主应用,最后将主应用打包为EAR进行部署。出于每日构建的需要及考虑到未来可能的模块间依赖,希望引入maven以解决该问题。

解决问题的基本思路如下:
首先依照maven的设计思想,设置构建结构如下:
如此则每次构建父项目,将自动按序构建功能项目 -> 模块项目 -> 主项目。具体应用中一个主项目依赖于数个模块项目,一个模块项目依赖于数个功能项目。
该结构下功能项目均将具体ADF项目打包为ADF Library Jar File,模块项目将该模块所依赖的所有功能项目打包为一个Jar,而主项目构建时将所有打包的模块项目引入并最终打包为EAR。


于不了解ADF Library Jar File/ADF
EAR打包的具体内容,故使用Oracle官方提供的命令行打包工具ojdeploy进行ADF Library Jar
File及EAR的打包,使用另外开发的Jar合并程序进行ADF Library Jar File的合并。故需要开发Maven插件如下:

1. 用于调用 ojdeploy 的 maven-adfdeploy-plugin。
2. 用于将 ADF Library Jar File 合并的 maven-jarmerger-plugin。

合Maven进行项目管理的构建生命周期,由于本次只使用其作为每日构建工具,则只需实现package阶段即可,考虑到未来解决依赖的需要,亦实现
install及deploy阶段,分别用于将maven项目部署至本地repository及远程repository。

maven-adfdeploy-plugin
maven-jarmerger-plugin
jarmerger(maven-jarmerger-plugin依赖于此)

使用实例:

1. 首先将插件安装至本地repository,按照jarmerger -> maven-jarmerger-plugin -> maven-adfdeploy-plugin的顺序进行安装,进入每个目录运行mvn install即可。
2. 构建父maven项目pom.xml文件,按照前述图示结构将模块项目、功能项目均作为父maven项目的模块,并指定使用1.6版本JDK进行编译。
3. 构建功能项目pom.xml
件,设定父项目为第2步所创间的项目,设定打包类型为adfdpl.jar,并应用maven-adfdeploy-plugin插件,由于调用
ojdeploy进行编译打包,故需要使用JDeveloper在ADF应用中设定好对应的Deploy
Profile,并以据文件中注释所示进行配置。
4. 构建模块项目pom.xml文件,设定父项目为第2步所创间的项目,设定打包类型为hadfmerge.jar,并应用maven-jarmerger-plugin插件,设置针对第3步创建的功能项目的依赖,并依据文件中注释进行配置。
5. 构建主项目对应的pom.xml文件,同样调用ojdeploy进行实现,设置方式类似于步骤3。

设置成功后,只需在父maven项目的pom.xml所在文件夹运行mvn package即可完成项目打包。结合Hudson等持续集成工具及SVN,即可完成每日构建的任务。

已知的问题:

由于调用ojdeploy进行编译及打包,则这种思路下不可能解决项目编译时自动寻找/解决依赖的问题,仍需要手工调整每日构建所用的构建源码所引入的包/库。 插件没有实现构建生命周期中的unit test及report阶段,仍需完善。