IBM Worklight V5 是一种领先的移动企业应用程序平台(Mobile Enterprise Application Platform, MEAP),利用该平台,IBM 可以跨其产品组合扩展其整体移动能力。本文以企业开发和部署人员在 Worklight 平台下自动化构建 Worklight 应用为例,介绍 Worklight 应用自动化构建和部署,希望以此让大家了解 Worklight 的自动化构建部署开发方法。本文的目标读者对象:IBM Worklight 开发人员,部署人员,iOS 平台开发人员,Android 平台开发人员。

罗 奎, 软件工程师, IBM

罗奎,是IBM CDL Mobile Solution部门的软件工程师;主要从事IBM Worklight解决方案的设计和开发工作。



王 震, 软件工程师, IBM

王震,是IBM CDL Mobile Solution部门的软件工程师;主要从事IBM Worklight解决方案的设计和开发工作。



2012 年 8 月 30 日

免费下载:IBM® Worklight Mobile Platform
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。

Worklight 简介

IBM® Worklight® V5 是一种领先的移动企业应用程序平台 (Mobile Enterprise Application Platform, MEAP),利用该平台,IBM 可以跨其产品组合扩展其整体移动能力。如何写 Worklight 应用程序请参考文章 使用 Worklight,第 1 部分 : 开始使用您的第一个 Worklight 应用程序


Apache Ant 基础知识

Apache ant 是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于 Java 环境中的软件开发。更多关于 Apache Ant 的内容请参考 Apache Ant 手册


Worklight Ant tasks 介绍

Worklight 为了方便开发者自动构建个部署 Worklight 适配器和应用程序,创建了几个 Apache ANT 任务,app-builder、 app-deployer、adapter-builder、adapter-deployer、war-builder。

声明 worklight ant 任务

Worklight Ant 构建工具包中定义了用了执行构建和部署的 Ant 任务,在使用这些任务前,我们需要将 worklight-ant.jar 文件加载到 classpath,并引用 com/workight/ant/defaults.properties 声明 Ant 任务。

清单 1. 声明 Worklight Ant tasks
 <taskdef resource="com/worklight/ant/defaults.properties"> 
    <classpath> 
        <pathelement location="${buildToolDir}/worklight-ant.jar"/> 
    </classpath> 
 </taskdef>

构建 Worklight 应用

Worklight Ant 构建工具包中定义 app-builder 任务用于构建 Worklight 应用。

清单 2. 构建 Worklight 应用
 <target name="build_wl_apps" depends="change_Server_IP"> 
    <echo>build_wl_apps ${projectName}</echo> 
    <delete dir="${outputPath}"/> 
    <mkdir dir="${outputPath}"/> 
    <record name="${outputPath}/build.log" loglevel="verbose"   append="false"/> 
    <app-builder nativeProjectPrefix="${projectName}_" 
    applicationFolder="${projectPath}/apps/${appName}" outputFolder="${outputPath}"> 
    </app-builder> 
 </target>
表 1.app-builder 属性说明
属性描述默认值
applicationFolderWorklight 应用程序的目录build.xml 父目录 . 如果失败在根目录下寻找包含 application-descriptor.xml 文件的目录作为默认值
environments用逗号隔开的应用环境如:common, android,iphone所有在应用程序里的环境
appsBackupsFolder指定备份应用程序的目录Worklight 应用程序的目录的父目录
concatenate是否连接 web 资源
minifyResources是否最小化 web 资源
nativeProjectPrefix本地应用的前缀
当使用 iOS 环境时这个值必须设置
空值
worklightServerHostWorklight 服务主机,使用主机名或者 IP 地址application-descriptor.xml 里 worklightServerRootURL 的值
outputFolder放置 .wlapp 的目录applicationFolder/bin
deploy当设为 'true' 时,应用将被部署到 Worklight 服务端false
failOnError出现错误时终止整个构建任务true
debug设为‘ true ’时采用调试模式,这样会写日志文件false
displayName显示应用的名字来自于 application-descriptor.xml 的 displayName 标签
descriptionApplication's descriptor来自于 application-descriptor.xml 的 discription 标签
androidAPILevelAndroid API 的等级-1
mobileDeviceSSO让设备在应用中可以单点登录
false

部署 Worklight 应用

Worklight Ant 构建工具包中定义 app-deployer 任务用于部署 Worklight 应用到 Worklight Server。

清单 3. 部署 Worklight 应用
 <app-deployer deployable="${outputPath}/${appName}-all.wlapp"
 worklightServerHost="http://${wlServerHost}:${wlServerPort}${wlServerContext}"/>
表 2.app- deployer 属性说明
属性描述默认值
worklightServerHostWorklight 服务端的 URLapplication-descriptor.xml 里 worklightServerRootURL 的值
deployable.wlapp 文件的路径

构建 Worklight 适配器

Worklight Ant 构建工具包中定义 adapter-builder 任务用于构建 Worklight 适配器。

清单 4. 构建 Worklight 适配器
 <target name="build_wl_adapter"> 
    <echo>build_wl_adapter ${projectPath}</echo> 
    <record name="${outputPath}/build.log" loglevel="verbose" append="true"/> 
    <adapter-builder folder="${projectPath}/adapters/${YouAdapterName}" 
    destinationFolder="${outputPath}"> 
    </adapter-builder> 
 </target>
表 3. adapter-builder 属性说明
属性描述默认值
folder适配器源代码所在的目录
destinationfolder指定适配器输出目录

部署 Worklight 适配器

Worklight Ant 构建工具包中定义 adapter-deployer 任务用于部署 Worklight 适配器到 Worklight Server。

清单 5. 部署 Worklight 适配器
 <adapter-deployer 
 deployable="${outputPath}/WorklightStarterAdapter.adapter" 
   worklightServerHost="http://${wlServerHost}:${wlServerPort}${wlServerContext}"/>
表 4. adapter-deployer 属性说明
属性描述默认值
worklightServerHostWorklight 服务端的 URL application-descriptor.xml 里 worklightServerRootURL 的值
deployable.adapter 文件路径或者他的父目录

构建 Worklight 控制台服务

每个 Worklight 应用可以构建出一个 .war 文件用于提供 Worklight 控制台服务,构建出的 .war 文件能够部署到 Web 服务器上,比如 Jetty,tomcat 和 Websphere Application Server 等。Worklight Ant 构建工具包中定义 war-builder 任务用于构建 Worklight 服务。

清单 6. 构建 Worklight 控制台服务
 <target name="build-wl-war" depends="clean, compile-JavaSources"> 
    <war-builder projectfolder="${project.path}"  
    webxml="resources/war/web.xml"
 classesfolder="${java-classes-dir}" destinationfolder="${artifacts.dir}"> 
 <fileset dir="resources/jsp"/> 
    </war-builder> 
 </target>
表 5. war-builder 属性说明
属性描述默认值
projectfolderWorklight 项目的目录
classesfolder.adapter 文件路径或者他的父目录
destinationfolderWorklight 项目 war 文件放置的目录
webxml设置 Worklight 项目的 web.xml 文件/war/web.xml

部署 Worklight 服务端到 Websphere Application Server

采用 websphere 提供的 ant 任务来实现部署 worklight 服务端的 war 文件到 websphere,通过 python 来自动配置 worklight jee jar, 在 sample 里提供了一个 python 文件 changeConfig.py, 通过这个脚步文件会创建一个共享类,然后把这个共享类添加到 worklight server,设置类的加载顺序为 PARENT_LAST。

清单 7. 设置共享类和类加载顺序的程序清单如下
 <target name="saveConfig" description="save Config"> 
    <taskdef classname="com.ibm.websphere.ant.tasks.WsAdmin" name="wsAdmin" /> 
        <wsAdmin host="${was.hostname}" conntype="${was.conntype}"
		 lang="${language}" port="${was.hostport}" washome="${was.home}"
		  user="${was.username}"
		 password="${was.userpassword}" script="changeConfig.py"> 
		 <!-- worklight shared lib name --> 
		 <arg value="${config.websphere.sharedlib}"/> 
		 <!-- worklight shared lib path --> 
		 <arg value="${config.worklight.jee}"/> 
                  <!-- worklight server 的名字 --> 
		 <arg value="${projectName}"/> 
                  <!-- Websphere 节点的名字 --> 
		 <arg value="${config.websphere.node}"/> 
                  <!-- Websphere 服务器的名字 --> 
		 <arg value="${config.websphere.server}"/> 
 </wsAdmin> 
 </target>

在 build.xml 文件里还提供了 uninstallapp, installapp, startApp, stopApp 等任务,这些任务在 Windows 上需要使用 ${WAS_HOME}/bin/ws_ant.bat 来运行,在 Linux 上需要使用 sudo ${WAS_HOME}/bin/ws_ant.sh 来运行。

比如你可以使用下面的命令来运行 saveConfig:

  1. 把附件中的文件解压到到你的 worklight 项目的根目录下面
  2. 修改 application.xml, 用你的项目的名字替代 WorklightStarter_jQueryMobile
  3. 修改 build.properties 里和 Websphere 相关的项目,根据你自己的环境
  4. 打开 cmd,把当前目录设置为你的项目的目录,然后在命令行里输入 ${WAS_HOME}/bin/ws_ant.bat saveConfig

Worklight App 本地应用构建

完成 Worklight 应用构建后,在 Worklight 环境文件夹中会生成对应的本地应用目录,对应文件夹名称为 native。本节以 Android 和 iPhone 环境为例展示如何通过 Ant 脚本构建生成 Android 上的 apk 安装文件和 iPhone 上的 ipa 安装文件。

Android 本地应用构建

Worklight 的 Android 环境本地应用目录中不包含用于 Ant 构建所需要的 build.xml ( 文件位置是 ${projectPath}/apps/${appName}/android/native/build.xml),需要使用 Android SDK 中的 android 工具更新工程并指定用于编译的 Android 平台。

清单 8. 生成 Android 本地 build.xml 文件
 <target name="prepare_android_build"> 
    <!-- on windows --> 
    <exec executable="cmd" osfamily="windows"> 
        <arg value="/c ${androidSDK}/tools/android.bat update project 
        --path ${projectPath}/apps/${appName}/android/native --target 
         android-8"/> 
    </exec> 
    <!-- on linux and Mac --> 
    <exec executable="/bin/sh" osfamily="unix"> 
  <arg value="-c"/> 
        <arg value="${androidSDK}/tools/android update project 
        --path ${projectPath}/apps/${appName}/android/native 
        --target android-8"/> 
    </exec> 
 </target>
表 5. android 属性说明
属性描述默认值
pathAndroid 本地工程位置
target构建 APK 的 SDK 平台,例如 android-8

需要注意的是在 windows 平台下运行”cmd”命令并执行 android.bat 进行更新,而在 linux 平台和 Mac 平台下运行”/bin/sh”并执行 android 进行更新,更新后的 Android 工程文件夹中将产生用于 Android apk 文件构建的 build.xml 文件。如图 1 所示。

图 1. 使用 Ant 更新 Worklight Android 本地应用工程
图 1. 使用 Ant 更新 Worklight Android 本地应用工程

检查更新后的文件夹结构,确保 Android 工程目录中产生 build.xml 文件,如图 2 所示。

图 2.Worklight Android 本地应用工程构建文件:
图 2.Worklight Android 本地应用工程构建文件:

然后通过生成的 build.xml 进行 Android 本地 apk 文件构建。

清单 9. 构建 Android apk 应用
 <target name="build_android"
  depends="build_wl_apps, prepare_android_build"> 
    <ant antfile="${projectPath}/apps/${appName}/android/native/build.xml"
     target="debug" useNativeBasedir="true"/> 
    <copy todir="${outputPath}"> 
        <fileset dir="${projectPath}/apps/${appName}/android/native/bin"> 
            <include name="${appName}-debug.apk"/> 
        </fileset> 
    </copy> 
 </target>
表 6. 构建 apk 属性说明
属性描述默认值
antfile取值为更新 Android 工程后产生的 build.xml 文件路径
target Apk 文件构建类型,取值为 debug 或 release
debug:Debug 版本 APK
release:Release 版本 APK,需指定签名文件。
useNativeBasedir使用 Android 本地工程文件夹作为 build.xml 的 basedir
取值为 true 或 false
false

构建完成后 apk 文件保存在 Android 工程的 bin 文件夹下,可以通过 ANT 的 copy 命令将其复制到统一的输出文件夹中。

如果需要构建出 Release 版本的 APK 文件,请修改 target 参数值为 release,并在 Android 环境 native 文件夹中添加 build.properties 文件指定签名文件路径和对应的密码。

清单 10. 构建 Android apk Release 应用
 <target name="build_android" depends="build_wl_apps, prepare_android_build"> 
    <ant antfile="${projectPath}/apps/${appName}/android/native/build.xml"
     target="release" useNativeBasedir="true"/> 
    <copy todir="${outputPath}"> 
        <fileset dir="${projectPath}/apps/${appName}/android/native/bin"> 
            <include name="${appName}-release.apk"/> 
        </fileset> 
    </copy> 
 </target>

添加 build.properties 文件到 Android 环境的 native 文件夹 , 如图 3 所示。

图 3. 添加 build.properties 到 android 环境 native 文件夹
图 3. 添加 build.properties 到 android 环境 native 文件夹

使用在 Eclipse 中使用“导出 Android 应用”功能创建您的签名文件并设置密码,然后在 build.properties 文件中指定签名文件路径和对应的密码。

清单 11. 设置签名文件信息
 #Android 签名文件路径 , 例如 D:\\workLight\\AndroidKey\\key.keystore 
 key.store=YouKeystore 
 #Android 签名文件别名 , 例如 export 
 key.alias=YouAlias 
 #Android 签名文件密码
 key.store.password=YouPassword 
 #Android 签名文件密码
 key.alias.password=YouPassword

iOS 本地应用构建

构建 iOS 本地应用需要有一台 Mac 并安装 Xcode,本文使用 Mac OS x 10.7 和 Xcode4.3.3 进行 iPhone 应用构建。为了确保 Ant iOS 构建任务是运行在 Mac 平台上,您可以使用 Ant 来检查运行平台是否符合条件。本节添加一个 Ant target 来检查当前运行平台。

清单 12. 检查 Ant 运行平台信息
 <target name="init"> 
	 <condition property="isWindows"> 
		 <os family="windows"/> 
	 </condition> 
	 <condition property="isMac"> 
		 <os family="mac"/> 
	 </condition> 
	 <condition property="isLinux"> 
		 <os family="unix"/> 
	 </condition> 
 </target>

执行 ant init,当前的运行平台信息会保存在对应的变量中,检查平台是 Mac OS 后就可以进行 iOS 本地应用构建。iOS 目标任务构建包含两部分,构建本地应用和打包本地应用为 ipa 文件。完整的 iOS 构建程序清单如下。

清单 13. 构建 iOS 本地应用
 <target name="build_iOS" if="isMac"
  depends="init, build_wl_apps, prepare_iOS_build"> 
	 <property name="wlappdir" value="${projectPath}/apps/${appName}" /> 
	 <property name="xcodebuildCMD" value="/usr/bin/xcodebuild" /> 
	 <property name="iosPackageCMD" value="xcrun" /> 
	 <property name="xcodebuildCMDlog" value="${outputPath}/xcodebuildCMD.log" /> 
	 <property name="iosPackageCMDlog" value="${outputPath}/iosPackageCMD.log" /> 
	 <property name="configuration" value="Ad Hoc" /> 

 <!-- 构建 iPhone native app --> 
	 <exec 
		 dir="${wlappdir}/iphone/native"
		 executable="${xcodebuildCMD}"
		 failonerror="false"
		 output="${xcodebuildCMDlog}"
		 resultproperty="xcodebuildCMDResult" > 

		 <arg line=" -configuration '${configuration}' -sdk iphoneos5.1" /> 
	 </exec> 

	 <!-- Package into IPA --> 
	 <exec 
		 dir="${wlappdir}/iphone/native"
		 executable="${iosPackageCMD}"
		 failonerror="false"
		 output="${iosPackageCMDlog}"
		 resultproperty="iosPackageCMDResult" > 

		 <arg value="-sdk" /> 
		 <arg value="iphoneos" /> 
		 <arg value="PackageApplication" /> 
		 <arg value
     ="${wlappdir}/iphone/native/build/Release-iphoneos/${appName}.app" /> 
		 <arg value="-o" /> 
		 <arg value="${outputPath}/${appName}.ipa" /> 
		 <arg value="--sign" /> 
		 <arg value="${certificate}" /> 
		 <arg value="--embed" /> 
		 <arg value="${provisioningProfile}"/> 
		 <arg value="-verbose" /> 
	 </exec> 
 </target>

构建 iOS ipa 应用需要指定开发者账号 provisioning profile 和 certificate,你可以在 worklight 工程根目录下的 build.properties 文件中指定开发者 provisioning profile 和 certificate。

清单 14. 指定 iOS 开发者信息
 #iOS provisioning profile. Update this for iOS build 
 provisioningProfile=/Users/YourUser/Library/MobileDevice/Provisioning 
 Profiles/E26327E9-A055-48A5-92A0-FB4850E335BA.mobileprovision 
 #iOS certificate. Update this for iOS build 
 certificate=iPhone Developer: Your Name (XZLU45UFKZ)

Worklight 构建出的 iPhone 本地应用默认使用 Entitlements-Release.plist 作为命令行构建配置文件。如果您使用 Xcode4.3.3 执行 iOS 本地应用构建,需要将 Entitlements-Release.plist 文件中的 get-task-allow 属性值修改为 true, 否则生成的 ipa 文件将不能安装到您的 iOS 设备上。

清单 15. 修改 Entitlements-Release.plist
 <target name="prepare_iOS_build" if="isMac" depends="init"> 
	 <echo> set 
	 iOS Entitlements-Release.plist get-task-allow=true</echo> 
    <replace file 
    ="${projectPath}/apps/${appName}/iphone/native/Entitlements-Release.plist"
            token="false"
            value="true"/> 
 </target>

由于 Entitlements-Release.plist 中 get-task-allow 属性值默认为 false,且整个文件中仅有一个值为 false,可以使用 ANT 的 replace 任务按照关键字直接查找 false 替换为 true。

关于 replace 任务详细介绍可以参考 http://ant.apache.org/manual/Tasks/replace.html


部署本地应用到 Worklight App Center

打包好的 Android apk 程序和 iOS ipa 程序可以通过 Ant 发布到 Worklight App Center 上,用户能够直接访问 Worklight App Center 进行安装。在发布本地应用程序前,需要安装并启动 Worklight App Center server,请参考 Application Center User ’ s Guild 完成 Worklight App Center 安装。

Worklight App Center 没有直接定义部署本地应用文件的 Ant 任务,需要复制并修改位于 tools 目录中的 build.xml 完成通过 Ant 发布应用。该目录位于 Worklight 安装目录下 ${install.dir}/ApplicationCenter/tools。

为方便修改 App Center Ant 部署任务,本文直接复制 tools 目录下的 build.xml 文件并重命名为 appcenter.xml, 放置到 sample 的根目录下,如图 4 所示。

图 4. 添加 appcenter.xml
图 4. 添加 appcenter.xml

在 build.xml 添加 Ant target 调用 appcenter.xml 进行本地应用发布。

清单 16. 调用 appcenter.xml 部署 Worklight 本地应用
 <target name="deploy_to_appcenter"> 
	 <echo message="deploy to application center"/> 
	 <ant antfile="${projectPath}/appcenter.xml" target="upload.AllApps"> 
		 <property name="server.path"
		  value="http://${appCenterHost}:${appCenterPort}"/> 
		 <property name="context.path" value="${appCenterContext}"/> 
		 <property name="install.dir" value="D:/workLight/Worklight"/> 
		 <property name="workspace.root" value="${outputPath}"/> 
		 <property name="login.user" value="demo" /> 
		 <property name="login.pass" value="demo" /> 
	 </ant> 
 </target>
表 7. 调用 appcenter.xml 属性说明
属性描述默认值
server.pathWorklight App Center 服务器地址http://localhost:9080/
context.pathWorklight App Center 服务上下文路径applicationcenter
login.userApp Center 访问用户名appcenteradmin
login.passApp Center 访问密码admin
install.dirWorklight App Center 部署工具目录
workspace.root需要发布的本地应用父目录

结束语

关于 IBM Worklight 自动化构建和部署的介绍到此就结束了,希望本篇文章能够对使用 IBM Worklight 在开发中进行自动化构建、部署有所帮助和启发。

参考资料

学习

  • 访问“IBM Worklight 主页”,可以下载 IBM Worklight 相关的软件,获取更多关于 Worklight 的安装,部署和开发信息。
  • IBM developerWorks 中国 WebSphere 专区:为使用 WebSphere 产品的开发人员准备的技术信息和资料。这里提供产品下载、how-to 信息、支持资源以及免费技术库,包含 2000 多份技术文章、教程、最佳实践、IBM Redbook 和在线产品手册。

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere, 移动开发
ArticleID=832473
ArticleTitle=Worklight 自动化构建
publish-date=08302012