自动化构建与部署步骤

日期: 2008-08-05 作者:Indrajit Poddar 来源:TechTarget中国 英文

  构建和部署涉及很多服务组件体系结构(Service Component Architecture,SCA)模块、Java 2 Platform Enterprise Edition(J2EE)包和数据库层组件的组合应用程序,通常会需要进行很多手动步骤。实现这些构建与部署步骤的自动化,可减少应用程序出错的几率,从而更适应从开发到生产的过渡过程。作者在此将给出一个使用IBM Rational Application Developer提供的Apache Ant任务的自动代码构建解决方案和一个使用IBM WebSphere Application Server Ant部署任务的自动部署解决方案。


  背景知识


  可以通过在面向服务的体系结构(Service-Oriented Architecture,SOA)框架中对多个不同的服务和数据存储区进行松散耦合来创建组合应用程序。SCA规范(请参见参考资料部分中提供的链接)描述了用于使用SOA构建和组装应用程序和系统的模型。组合应用程序经常使用Rational工具(如IBM Rational Application Developer)作为独立的项目开发,然后使用IBM Websphere Integration Developer组装为SCA模块。最后,将这些组装好的包部署在包含IBM WebSphere Portal Server、IBM WebSphere Process Server容器和IBM DB2数据库服务器的宿主环境中。不过,在Rational Application Developer和Websphere Integration Developer中的很多构建和导出步骤以及WebSphere Portal Server和WebSphere Process Server中的部署步骤都是手动的GUI指向-点击步骤。在本文中,您将了解如何实现这些手动步骤的自动化。


  组合应用程序WebSphere运行时环境


  在部署环境中使用了WebSphere服务器的以下版本:


  ·IBM WebSphere Process Server V6.0.1,其中包括IBM WebSphere Application Server V6.0.2
  ·IBM WebSphere Portal Server V6.0
  ·IBM DB2 Universal Database V8.2
  ·IBM Directory Server V5.2


  自动构建将使用以下版本的IBM构建工具:


  ·IBM Rational Software Architect V6.0.1,其中还包括IBM Rational Application Developer V6.0.1
  ·IBM WebSphere Portlet Factory V6.0
  ·IBM WebSphere Integration Developer V6.0.1


  自动构建解决方案


  Apache Ant是基于Java的构建工具,开发人员通常将其用于实现Java程序的自动化(有关Apache Ant Project的更多信息,请参见参考资料)。Eclipse将Ant支持作为缺省功能提供(有关Eclipse Ant支持的更多信息,请参见参考资料)。在此解决方案中,将使用Rational Application Developer中的runAnt工具来启动headless Eclipse工作区,并执行Ant构建脚本(相关内容,请参见参考资料中提供的链接)。WebSphere Integration Developer和Rational Application Developer提供了处理不同类型的组合应用程序项目的Eclipse构建程序。在WebSphere Integration Developer和Rational Application Developer内创建的这些项目的例子包括业务集成模块、Enterprise JavaBeans(EJB)项目、动态Web项目和Portlet项目。可以在项目的顶级目录中的.project文件中找到每个项目对应的一组构建程序。在构建自动化流程中,可以将这些构建程序与Rational Application Developer、WebSphere Integration Developer及WebSphere Portlet Factory提供的Ant任务一起重用。


  构建自动化流程将使用以下Ant任务:


  ·svn checkout,用于从SubVersion(SVN)团队存储库签出项目源代码。
  ·projectSetImport,用于将项目集导入Eclipse工作区。
  ·projectSetBuild,用于使用Eclipse构建程序构建项目集。
  ·WebSphere Portlet Factory Ant脚本,用于将Portlet打包为WAR文件。
  ·earExport,用于将Web服务和EJB组件与JAR文件一起打包为EAR文件。
  ·moduleExport,用于将WebShpere Integration Developer中的SCA模块项目和依赖项目打包为压缩文件。


  以下内容对这些任务进行了详细的说明,可以参考下面具体的示例。


  组合应用程序中的组成应用程序可以驻留在不同的源代码管理(Source Code Management,SCM)存储库中。清单1显示了如何在SVN存储库中从不同的位置为不同的组合应用程序提取源代码(有关Subversion的信息,请参见参考资料中提供的链接)。


  清单1. 用于从源代码控制系统中签出代码的SVN Ant任务
               
  <taskdef resource=”svntask.properties”/>
  <property name=”urlRepos”        value=”https://svn.yourcompany.com/svn/jivaro2/trunk”/>
  <target name=”checkout”>
    <svn>
   <checkout url=”${urlRepos}/asset”   destPath=”${output.dir}/src/asset”/>
    </svn>
    <svn>
   <checkout url=”${urlRepos}/wps” destPath=”${output.dir}/src/wps”/>
    </svn>
    <svn>
   <checkout url=”${urlRepos}/webservice” destPath=”${output.dir}/src/webservice”/>
    </svn>
    <svn>
   <checkout url=”${urlRepos}/portal”   destPath=”${output.dir}/src/portal”/>
    </svn>
  </target>    
   
  清单2显示了旨在使用projectSetImport将签出的项目导入Eclipse工作区的Ant。


  清单2. 将项目集导入到Eclipse工作区
               
  <target name=”importAllProject” depends=”init” >
     <!– ### projectSet Import and Build (all normal projects) ### –>
        <echo message=”${ant.project.name} importAllProject STARTED …”/>
        <projectSetImport ProjectSetFileName=”${projectSetFileName}”
           failOnError=”${failonerror}”
           autodeleteExistingProjects=”${autodeleteExistingProjects}” />
        <echo message=”ProjectSet   ImportedProjectNames=${ImportedProjectNames}”  />
        <echo message=”${ant.project.name} importAllProject DONE.”/>       
  </target>
    
  projectSetImport任务使用Eclipse Project Set文件来指定要导入的项目及其在文件系统中的位置,如清单3中所示。


  清单3. 指定组合应用程序组件的Eclipse项目在文件系统中的位置
               
  <psf version=”2.0″>
  <provider id=”antimportProjectSet”>
    <project reference=”1.0,antimportProjectSet,
                 ./tmp/src/wps/CWYBC_JDBC,CWYBC_JDBC”/>
    <project reference=”1.0,antimportProjectSet,
               ./tmp/src/wps/CWYFF_FlatFile,CWYFF_FlatFile”/>
    <project reference=”1.0,antimportProjectSet,
                 ./tmp/src/wps/DynamicServiceLibrary,DynamicServiceLibrary”/>
    <project reference=”1.0,antimportProjectSet,
                 ./tmp/src/wps/SasBankSharedWebServiceLib,SasBankSharedWebServiceLib”/>
  </provider>
  </psf>
    
  每个WebSphere Portlet Factory Portlet项目均包含用于导出为WAR文件的Ant脚本。清单4显示了如何调用Portlet项目的Ant脚本。


  清单4. 将WebSphere Portlet Factory Portlet Eclipse项目导出为WAR文件
               
  <target name=”exportWPFWar” depends=”importAllProject”>
     <ant dir=”${src.portal}/J2BWPFPortlets/WEB-INF/bin/deployment/jsr168″
               antfile=”${src.portal}/J2BWPFPortlets/WEB-INF
               /bin/deployment/jsr168/build_deployment.xml”>
         <property name=”output.location” value=”${dist}”/>
         <property name=”rootDirectory”   value=”${src.portal}/J2BWPFPortlets/WEB-INF”/>
         <property name=”warfile” value=”J2BWPFPortlets.war” />
         <property name=”webxmlFile” value=”./web.xml” />
     </ant>
   .
   .
  </target>
    
  清单5显示了如何使用Ant任务earExport来构建和将Web服务与EJB实现打包为EAR文件。


  清单5. 用于构建和将Web服务与EJB实现打包为EAR文件的earExport
               
  <target name=”buildWebservice” depends=”importAllProject” >
     <projectSetBuild ProjectSetFileName=”${webserviceSetFileName}” useBuildXML=”false”
              failOnError=”${failonerror}”/>
     <antcall target=”exportWebServiceEarFiles”/>
  </target>


  <target name=”exportWebServiceEarFiles” >
     <earExport EARProjectName=”SaasBankUserGroupEJBProjectEAR”
        EARExportFile=”${dist}/SaasBankUserGroupEJBProjectEAR.ear” Overwrite=”true” />
     <earExport EARProjectName=”NewCreditCheckEJBProjectEAR”
           EARExportFile=”${dist}/NewCreditCheckEJBProjectEAR.ear” Overwrite=”true” />
  .
 .
  </target>
    
  清单6显示了如何使用Ant任务moduleExport在WebSphere Integration Developer中构建和打包SCA模型项目。注意:需要调用ServiceDeploy Ant任务来生成可部署的SCA模块。另外,需要从developerWorks单独下载moduleExport Ant任务。请参见“Develop an Automated Build Engine Using WebSphere Integration Developer”(developerWorks,2006年11月)。


  清单6. 调用ServiceDeploy Ant任务来生成可部署SCA模块
               
  <taskdef name=”moduleExport”   classname=”com.ibm.wbit.anttasks.IntegrationModuleZipExport”
              classpath=”${basedir}/IntegrationModuleZipExport.jar:${wid.home}/eclipse
                      /plugins/org.eclipse.ui.ide_3.0.1/ide.jar”/>


  <target name=”moduleExport” depends=”importAllProject” >
    <moduleExport project=”${workspace}/SasBankWSselectors”
          output=”${output.dir}/SasBankWSselectors.zip” />
  </target>


  <target name=”exportSCAEar” depends=”moduleExport” > 
    <&#101xec dir=”${buildscripts.dir}” &#101xecutable=”${service.deploy}” >
       <arg line=” ${output.dir}/SasBankWSselectors.zip -outputApplication
       ${dist}/SasBankWSselectors.ear -cleanStagingModules -noj2eedeploy -ignoreErrors” />
    </&#101xec>
 .
 .
  </target>   


  自动构建流程的最后,要将这些EAR和WAR文件打包为单个压缩文件,如清单7中所示。


  清单7. 将文件打包为单个zip文件
               
  <property name=”zipName” value=”${basedir}/JivaroBankingV2.zip”/>


  <target name=”buildzip” depends=”clean,checkout,cleanSVNPath,
                     buildWebservice,buildAsset,buildPortal,buildWPS”>
      <zip destfile=”${zipName}” basedir=”${buildDir}”/>
  </target>


  WebSphere Process Server的自动部署解决方案


  在我们的部署拓扑中,将使用WebSphere Process Server实例承载SCA模块、J2EE包,并使用独立的WebSphere Portal Server实例来承载门户组件。之所以这样,是因为WebSphere Portal Server会消耗大量的Java堆。使用实用工具pcatWindows.exe来在WebSphere Process Server中创建独立的WebSphere配置文件,以承载SCA模块。调用此实用工具时,要指定用于进行静默安装的响应文件(请参见参考资料中提供的指向“Creating a JDBC Provider and a DataSource Using Java Management Extensions API and the Scripting Tool”的链接)。清单8中的Ant任务演示了如何从Ant脚本调用此实用工具。


  清单8. 在WebSphere Process Server中创建用于承载SCA模块的独立WebSphere配置文件
               
  <!– Set global properties –>
  <property name=”wasHome” value=”D:IBMRationalSDP6.0runtimesbi_v6″/>
  <property name=”wasBin” value=”${wasHome}bin”/>
  <property name=”profileName” value=”pf2″/>
  <property name=”profilePath” value=”D:IBMWebSpherepf2″/>
  <property name=”cell” value=”widCell”/>
  <property name=”node” value=”widNode”/>
  <property name=”host” value=”localhost”/>
  <property name=”server” value=”server1″/>


  <target name=”createWBIProfile” >
      <&#101xec &#101xecutable=”${wasBin}ProfileCreator_wbipcatWindows.exe” failonerror=”on”>
   <arg line=”-options ${basedir}responsefile.txt -silent”/>
      </&#101xec>
  </target>
    
  接下来,在WebSphere Process Server中创建数据源,以连接到数据库层。“Creating a JDBC Provider and a DataSource Using Java Management Extensions API and the Scripting Tool”(请参见参考资料)说明了如何使用WebSphere WsAdmin Java Command Language(JACL)脚本自动创建数据源。将从Ant脚本内使用WebSphere Application Server Ant任务WsAdmin调用WsAdmin脚本,如清单9中所示。


  清单9. 在WebSphere Process Server中创建数据源
               
  <!– Set global properties –>
  <property name=”wasHome” value=”D:WebSphereProcServer”/>
  <property name=”conntype” value=”none”/>
  <property name=”host” value=”localhost”/>
  <property name=”script” value=”sasDataSourcecreate.jacl”/>
  <property name=”node” value=”PoddarPCNode01″/>
  <property name=”server” value=”server1″/>
  <property name=”dbuser” value=”db2admin”/>
  <property name=”dbpassword” value=”ondemand”/>
  <property name=”dbserver” value=”localhost”/>
 
  <taskdef name=”WsAdmin” classname=”com.ibm.websphere.ant.tasks.WsAdmin”/>


  <target name=”createDataSource” >
  <WsAdmin wasHome=”${wasHome}” script=”${script}”>
     <arg value=”-node” />
     <arg value=”${node}” />
     <arg value=”-server”/>
     <arg value=”${server}” />
     <arg value=”-dbuser”/>
     <arg value=”${dbuser}” /> 
     <arg value=”-dbpassword” />
     <arg value=”${dbpassword}” /> 
     <arg value=”-dbname” />
     <arg value=”SASBNKDB” />
     <arg value=”-dbserver”/>
     <arg value=”${dbserver}” /> 
     <arg value=”-dsname” />
     <arg value=”ebankdb” />
     <arg value=”ebankdb” />
     </WsAdmin>
  </target>
    
  WebSphere Application Server提供了名为ws_ant的实用工具,用于将WsAdmin之类的WebSphere特定的Ant任务与内置Apache Ant任务一起打包。可使用ws_ant实用工具和WebSphere Application Server Ant任务wsInstallApp将WebSphere流程模块、Web服务及EJB应用程序部署到WebSphere Process Server中,如清单10中所示。


  清单10. 部署WebSphere流程模块
               
  <!– Set global properties –>
  <property name=”temp” value=”${basedir}/tmp”/>
  <property name=”wasHome” value=”D:IBMRationalSDP6.0runtimesbi_v6″/>
   <property name=”conntype” value=”SOAP”/>
  <property name=”host” value=”localhost”/>
  <property name=”port” value=”8880″/>
  <property name=”user” value=”wpsbind”/>
  <property name=”password” value=”wpsbind”/>


  <taskdef name=”wsInstallApp”   classname=”com.ibm.websphere.ant.tasks.InstallApplication”/>


  <target name=”installApps” depends=”unZipPack,unInstallApps”>
   <wsInstallApp wasHome=”${wasHome}”   ear=”${temp}/CEIEventEmitterRouterEAR.ear”   
              conntype=”${conntype}”
                  host=”${host}”
                  port=”${port}”
                  user=”${user}”
      password=”${password}”
         failonerror=”false”/>


 <wsInstallApp wasHome=”${wasHome}”   ear=”${temp}/CEIQueryServiceEAR.ear”   
              conntype=”${conntype}”
                  host=”${host}”
                  port=”${port}”
                  user=”${user}”
      password=”${password}”
         failonerror=”false”/>
  .
  .
  .
  </target>
    
  WebSphere Portal Server的自动部署解决方案


  组合应用程序中的Portlet经常要求与WebSphere Process Server中的人工任务管理器进行交互。要部署这些Portlet,请首先在WebSphere Portal Server中创建WebSphere Process Server配置文件(请参见参考资料,其中提供了指向“Creating a Stand-Alone Server Profile Silently”的链接)。此配置文件允许WebSphere Portal Server和WebSphere Process Server在相同的应用服务器实例内运行。


  门户主题和皮肤经常用于提供属于不同企业的独特门户外观(请参见参考资料,其中提供了指向“Deploying Customized Themes and Skins”的链接)。可以使用Ant自动部署门户主题和皮肤,如清单11中所示。


  清单11. 使用Ant脚本将主题和皮肤部署到WebSphere Portal Server中
               
  <target name=”checkout” unless=”USE_CVS”>
  <svn>
      <checkout url=”${urlRepos}/installation/InstallationFiles/ThemesSkins”
           destPath=”${temp}”/>
  </svn>
  </target>
 
  <target name=”copyThemesSkins” depends=”clean” >
  <copy todir=”${destTheme}/SasBankBank1AdminTheme” overwrite=”true”>
   <fileset dir=”${temp}/SasBankBank1AdminTheme” />
  </copy>
  <copy todir=”${destTheme}/SasBankBank1Theme” overwrite=”true”>
  <fileset dir=”${temp}/SasBankBank1Theme” />
  </copy>
  <copy todir=”${destTheme}/SasBankBank2Theme” overwrite=”true”>
   <fileset dir=”${temp}/SasBankBank2Theme” />
  </copy>
  <copy todir=”${destSkin}/SasBankBank1Skin” overwrite=”true”>
   <fileset dir=”${temp}/SasBankBank1Skin” />
  </copy>
  <copy todir=”${destSkin}/SasBankBank2Skin” overwrite=”true”>
 <fileset dir=”${temp}/SasBankBank2Skin” />
  </copy>
  </target>
    
  在自动构建流程执行期间,会将Portlet导出为WAR文件。可以使用WebSphere Portal Server XML配置接口来部署Portlet和Portlet的配置。此接口会在WebSphere Application Server安装目录的installableAppes子目录中查找Portlet WAR文件。可以使用清单12中的Ant脚本来将Portlet WAR文件放到恰当的目录中。


  清单12. 用于将Portlet WAR文件放入相应的目录中的Ant脚本
               
  <property name=”portalServer” value=”Z:sasPortalServer”/>
  <property name=”portalInstallable”    value=”${portalServer}/installableApps”/>


  <target name=”unZipPack”>
   <unzip src=”${basedir}/JivaroBankingV2.zip” dest=”${temp}/war”>
  <patternset>
   <include name=”**/*.war”/>
   </patternset>
   </unzip>
  </target>


  <target name=”copyWarToPortal” depends=”unZipPack”>
   <copy todir=”${portalInstallable}” overwrite=”true”>
  <fileset dir=”${temp}/war” />
   </copy>  
  </target>
    
  可以在WebSphere Application Server中使用虚拟门户来在单个应用服务器实例中承载多个承租者。清单13中的Ant脚本说明了如何在WebSphere Portal Server中创建虚拟门户。


  清单13. 在WebSphere Portal Server中创建虚拟门户
               
  <target name=”setConfigCommand”>
      <condition property=”WPSConfig” value=”WPSConfig.bat”>
      <and>
         <os family=”windows”/>
      </and>
      </condition>
      <condition property=”WPSConfig” value=”WPSConfig.sh”>
    <and>
         <os family=”unix”/>
      </and>
      </condition>
  </target>


  <target name=”createVirtualPortal” depends=”setConfigCommand”>
      <&#101xec dir=”${portalConfig}” &#101xecutable=”CMD” >
         <arg line=”/C ${WPSConfig} create-virtual-portal -DVirtualPortalTitle=bank1
                        -DVirtualPortalRealm=bank1 -  DVirtualPortalContext=bank1″/>
      </&#101xec>
      <&#101xec dir=”${portalConfig}” &#101xecutable=”CMD” >
         <arg line=”/C ${WPSConfig} create-virtual-portal -  DVirtualPortalTitle=bank2
                         -DVirtualPortalRealm=bank2 -  DVirtualPortalContext=bank2″/>
      </&#101xec>
      <&#101xec dir=”${portalConfig}” &#101xecutable=”CMD” >
         <arg line=”/C ${WPSConfig} create-virtual-portal -  DVirtualPortalTitle=bank3
                         -DVirtualPortalRealm=bank3 -  DVirtualPortalContext=bank3″/>
      </&#101xec>
  </target>
    
  最后,清单14中的Ant脚本说明了如何使用WebSphere Portal XML配置接口为每个虚拟门户部署门户配置。


  清单14. 使用WebSphere Portal Server XML配置接口配置每个虚拟门户
               
  <target name=”importBanks”   depends=”copyThemesSkins,copyWarToPortal,createVirtualPortal,
                                   setXmlAccessCommand,copyWarToPortal”>
       <&#101xec dir=”${portalBin}” &#101xecutable=”CMD” >
 <arg line=”/C ${xmlAccess} -in ${basedir}banksrelease.xml
     -user wpsadmin -pwd wpsadmin  -url http://  ${host}:${port}/wps/config”/>
       </&#101xec>
       <&#101xec dir=”${portalBin}” &#101xecutable=”CMD” >
   <arg line=”/C ${xmlAccess} -in ${basedir}bank1release.xml
     -user wpsadmin -pwd wpsadmin  -url http://  ${host}:${port}/wps/config/bank1″/>
       </&#101xec>
       <&#101xec dir=”${portalBin}” &#101xecutable=”CMD” >
   <arg line=”/C ${xmlAccess} -in ${basedir}bank2release.xml
     -user wpsadmin -pwd wpsadmin  -url http://  ${host}:${port}/wps/config/bank2″/>
       </&#101xec>
  </target>
    
  可以使用WebSphere Portal Server XML配置接口(请参见参考资料,其中提供了指向“Moving from a Test to Production Server Using the XML Configuration Interface”的链接)来将门户配置从开发/过渡环境导出到生产环境中。还可以使用WebSphere Portal发布构建程序工具(有关更多信息,请参见参考资料)来开发将门户配置部署到生产服务器所需的配置更改的测试版。清单15中的命令说明了如何使用xmlaccess和releasebuilder生成测试版XMLAccess配置文件。


  清单15. 使用xmlaccess和releasebuilder生成测试版XMLAccess配置文件
               
  xmlaccess.bat -in ExportRelease.xml -user wpsadmin -password wpsadminpwd
   -url http://testportalserver.yourco.com/wps/config -out REV1_config.xml
 Deploy portlets, themes and skins and create virtual portals.
 xmlaccess.bat -in ExportRelease.xml -user wpsadmin -password wpsadminpwd
    -url http://testportalserver.yourco.com/wps/config -out REV2_config.xml
 releasebuilder.bat -inOld REV1_config.xml -inNew REV2_config.xml
    -out outputfile.xml
    
  清单16说明了如何使用WebSphere Portal Server xmlaccess接口为Portlet配置主题和皮肤。


  清单16. 使用WebSphere Portal Server xmlaccess接口为Portlet配置主题和皮肤
               
  <?xml version=”1.0″ encoding=”UTF-8″?>


  <request   build=”wp5103_025″
    type=”update” version=”5.1.0.3″   xsi:noNamespaceSchemaLocation=”PortalConfig_1.3.1.xsd”>
      <portal action=”locate”>
          <skin action=”update” active=”true” default=”false”
                objectid=”_K_003II0L7N8022GN6_69″
                resourceroot=”SasBankBank1Skin” type=”default”>
              <localedata locale=”en”>
                  <title>Bank1Skin</title>
                  <description></description>
                </localedata>
          </skin>


          <theme action=”update” active=”true” default=”false”
                 defaultskinref=”_K_003II0L7N8022GN6_69″   objectid=”_J_003II0L7N8022GN6_69″
                 resourceroot=”SasBankBank1Theme”>
              <localedata locale=”en”>
                <title>Bank1Theme</title>
                <description></description>
            </localedata>
            <allowed-skin skin=”_K_00KC5030880624SK_35″ update=”set”/>
            <allowed-skin skin=”_K_00KC5030880624SK_39″ update=”set”/>
  .
  .
          </theme>
      </portal>
  </request>
    
  清单17中的XML代码片段说明了用于在WebSphere Portal Server中配置Portlet WAR文件的XMLAccess脚本的内容。配置信息包括要求有一些预先存在的门户安全性配置的访问控制配置(请参见参考资料,其中给出了指向“Section DB2 and Tivoli? Directory Server Configuration”的链接)。


  清单17. 使用XMLAcces 配置门户安全性
               
  <web-app action=”update” active=”true” objectid=”_1_00KC5030880624SK_IP”
      removable=”true”
      uid=”sasbankloanapprovalportlet.SasBankLoanApprovalPortletPortlet.9bdb2f3550.webmod”>
    <url>file://localhost/   $server_root$/installableApps/SasBankLoanApprovalPortlet.war</url>
      <access-control externalized=”false” owner=”undefined”   private=”false”>
        <role actionset=”Editor” update=”set”>
            <mapping subjectid=”cn=wpsadmin,cn=groups,dc=banks,dc=com”
                     subjecttype=”user_group” update=”set”/>
            <mapping subjectid=”cn=wpsadmins,cn=groups,dc=bank3,dc=com”
                     subjecttype=”user_group” update=”set”/>
            <mapping subjectid=”cn=bank1admins,cn=groups,dc=bank1,dc=com”
                     subjecttype=”user_group” update=”set”/>
        </role>
    </access-control>
    <servlet action=”update” active=”true” cache-expiration=”0″
             objectid=”_V_00KC5030880624SK_IP”
             referenceid=”Loan Approval Portlet.servlet”
             remote-cache-dynamic=”false”
             remote-cache-scope-private=”false”/>
    <portlet-app action=”update” active=”true” defaultlocale=”en”
          name=”sasbankloanapprovalportlet.SasBankLoanApprovalPortletPortlet.9bdb2f3550″
        objectid=”_2_00KC5030880624SK_IP”
            uid=”sasbankloanapprovalportlet.SasBankLoanApprovalPortletPortlet.9bdb2f3550″>
          <access-control externalized=”false” owner=”undefined” private=”false”/>
          <portlet action=”update” active=”true” defaultlocale=”en”
               name=”Loan Approval Portlet” objectid=”_3_00KC5030880624SK_IP”
             provided=”false” servletref=”_V_00KC5030880624SK_IP”>
              <access-control externalized=”false” owner=”undefined” private=”false”>
                  <role actionset=”Editor” update=”set”>
                    <mapping subjectid=”cn=wpsadmin,cn=groups,dc=banks,dc=com”
                             subjecttype=”user_group” update=”set”/>
                    <mapping subjectid=”cn=wpsadmins,cn=groups,dc=bank3,dc=com”
                             subjecttype=”user_group” update=”set”/>
                    <mapping subjectid=”cn=bank1admins,cn=groups,dc=bank1,dc=com”
                             subjecttype=”user_group” update=”set”/>
                </role>
            </access-control>
          </portlet>
      </portlet-app>
  </web-app>
    
  除了Portlet配置和主题与皮肤的配置外,包含在XMLAccess配置文件中的门户解决方案版本还包括门户配置数据,如内容树、页布局、访问控制列表等。


  DB2和Tivoli Directory Server配置脚本


  清单18显示了一个IBM目录服务器配置文件,该文件配置轻量级目录访问协议(Lightweight Directory Access Protocol,LDAP)服务器,以提供WebSphere Portal和WebSphere Process Server安全性。


  清单18. 使用轻量级数据交换格式(Lightweight Data Interchange Format,LDIF)脚本配置LDAP服务器,以提供WebSphere Portal和WebSphere Process Server安全性
               
  version: 1


  dn: dc=banks,dc=com
  objectclass: domain
  objectclass: top
  # Add lines according to this scheme that correspond to your suffix
  dc: banks,dc=com
  dc: banks


  dn: dc=bank1,dc=com
  objectclass: domain
  objectclass: top
  dc: bank1,dc=com
  dc: bank1


  dn: cn=users,dc=bank1,dc=com
  objectclass: container
  objectclass: top
  cn: users
  .
  .
  .
    
  可以使用清单19中的IBM Directory Server命令将此用户数据导入到目录服务器中。


  清单19. 将此用户数据导入目录服务器
               
  idsldif2db -i  AllBanks.ldif   -I  <your ids instance >
    
  可以使用清单20中的IBM DB2 Universal Database? Data Definition Language(DDL)脚本配置数据库层。


  清单20. 使用DDL脚本配置数据库层
               
  echo — create the CreditDB database —;
  create DATABASE CREDITDB;


  echo — connect to CREDITDB database —;
  CONNECT TO CREDITDB;


  create schema credit;


  – This table stores the basic customer information including credit score
  echo — drop the credit.customer table —;
  drop table credit.customer;
  echo — create the credit.customer table —;
  create table credit.customer(
  custID char(32) Not NULL,
  firstname varchar(32),
  lastname varchar(32),
  creditscore INT ,
  ssn          char(9) not null,
  statusdate Timestamp not null with default CURRENT_TIMESTAMP,
  phone        char(20) ,
  altphone  char(20),                        
  marital      char(1) ,
  sex          char(1),                         
  dob          DATE ,                            
  street       varchar(50),                                 
  city         varchar(32),                                 
  state        char(12),                                 
  zipcode      char(10), 
  country varchar(32),
  homeowner    smallint,                       
  primary key (custID)
  );
  echo — add unique constraint to the credit.customer table —;
  alter table credit.customer add unique (ssn);
    
  可以使用清单21中的DB2命令配置DB2数据库上的模式。


  清单21. 配置DB2数据上的模式
               
  db2 -f credit.ddl
    
  问题与解决办法


  设置自动构建和部署时可能会遇到一些问题:


  ·从WebSphere Process Server卸载业务流程执行语言(Business Process &#101xecution Language,BPEL)或HumanTask组件应用程序前,必须确保所有BPEL/HumanTask实例均已终止,否则就不能正确卸载。可以使用Business Process Choreographer Explorer来检查和终止流程的任何活动实例(有关使用Business Process Choreographer Explorer的更多信息,请参见参考资料)。
  ·Microsoft Windows中的长路径可能在部署期间导致WSAdmin中出现错误,包括[wsadmin] java.io.IOException: java.io.IOException: The URI length is greater than the Windows limit of 259 characters. Unable to create or update file.这通常都是无害的。
  ·在与WebSphere Process Server V6.0.1相同的Windows计算机上安装WebSphere Portal Server V5.1.0.3可能会导致出现问题。您可能需要在安装WebSphere Portal Server前删除文件c:Windowsvpd.properties。


  结束语


  在本文中,我们了解了如何为使用各种类型组件的组合应用程序开发自动构建和部署解决方案,这些组件包括Portlet、流程模块、Web服务、J2EE组件、数据库模式以及LDAP模式。我们使用了各个WebSphere产品(如 WebSphere Process Server)提供的Ant任务、WebSphere Portal和WebSphere Application Server支持的脚本语言、DB2及Tivoli LDAP目录服务器。我们已经作为示例了解了采用脚本的自动化解决方案的各个代码片段。请一定参阅“参考资料”部分提供的各个参考信息,以了解有关这些主题的更多信息。


  作者简介


  Indrajit Poddar是一位顾问软件工程师,现在是IBM软件部策略与技术团队的一名成员。他感兴趣的是采用面向服务的体系结构和IBM Software Group产品组合(WebSphere Application Server、Process Server, Portal Server和Tivoli and Rational产品)来设计复合应用程序的体系结构。他获得了宾夕法尼亚州立大学的计算机科学与工程学士学位,以及位于印度坎普尔市的印度科技大学计算机科学与工程硕士学位。
 
  Li(Tony)Wei是中国软件开发实验室(China Software Development Lab,CSDL)的一位软件工程师。他目前在从事SOA开发领域方面的工作。您可以通过weili@cn.ibm.com与他联系。
 
  DuoWei(David)Sun是IBM中国软件开发中心(CSDL)的一位高级软件工程师。他目前在从事SOA开发领域方面的工作。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐