45、深入探索Web服务与持续集成技术

深入探索Web服务与持续集成技术

1. Web服务开发

将Java类转变为SOAP端点时,需要提供Web服务部署描述符(WSDD),它能告知Axis运行时服务的属性。在描述符里,要对服务和实现它的类进行命名,同时明确可通过SOAP访问的类方法。还能为SOAP头注册处理程序,其类似于HTTP请求中的头信息,SOAP端点或其他服务器端代码可利用这些小信息片段来实现安全和会话等功能。尽管也能使用HTTP头,但SOAP头模型与基于XML的通信系统集成得更好,并且在使用如电子邮件等替代传输方式时也能正常工作。

若要进行复杂的SOAP处理,部署描述符文件是必不可少的,这意味着必须使用Java而非JWS文件来实现服务。应用部署完成后,需将WSDD文件注册到Axis管理Servlet。若不将服务器设置为可远程访问,就需要在服务器端运行代码来注册每个部署描述符,并且要列出所有需注册的WSDD文件。可以通过 <java> 从构建文件调用管理程序,这样本地构建的注册就很容易实现。

在编写服务类之前,严谨的做法是先编写XSD和WSDL文件。编写这些文件可能会有问题,CapeClear编辑器(http://www.capeclear.com/)是完成此任务的最佳工具。编写完WSDL文件后,使用 -server 属性调用 WSDL2Java ,该程序会为服务生成服务器端存根。可以使用这些生成的类并在其后实现Web服务。

2. 回顾Web服务开发

为应用添加SOAP支持的高级构建过程已设置完成。将Axis库和配置设置添加到现有Web应用相对简单,但这要求为缺少的类添加新的部署测试,可通过现有的 <happy> JSP页面实现。当库和配置都正常工作后,只需将带有 .jws 扩展名的Java源文件保存到主Web应用目录中,就能创建Web服务。

编写服务只是问题的一半,测试则是另一半。Axis客户端实用工具可根据服务的WSDL描述创建Java代理类。 WSDL2Java 类甚至能生成基本的JUnit测试用例,为手动编写的单元测试奠定基础。

3. 通过SOAP调用Ant

Web服务是一个热门的开发领域。Axis会不断发展,Sun也推出了自己的Web服务包,而且Ant必将获得包装任务,以简化使用Apache、Sun和其他工具包的构建阶段。

Rant(Remote Ant)是SourceForge上的一个项目(http://sourceforge.net/projects/remoteant/)。该项目包含一个Web应用程序,可通过SOAP接口实现远程Ant访问。可以从远程系统提交请求,指定要执行的构建文件和其中的目标。Servlet会执行构建并返回成功或失败信息。

以下是通过Ant任务触发远程构建的示例代码:

<taskdef name="rant"   
  classname="com.einnovation.rant.RantTaskDef">
  <classpath>
    <fileset dir="lib">
      <include name="*.jar"/>
    </fileset>
  </classpath>
</taskdef>
<property name="endpoint" 
  value="http://127.0.0.1:8080/rant/servlet/rpcrouter" />
<property name="target.file" location="../soap/soap.xml" />
<target name="default" >
  <rant buildFile="${target.file}"                    
      soapURL="${endpoint}"                           
      target="default"/>                              
</target>  

不过,不建议将Rant服务部署在通用的可访问Web服务器上,因为允许任何调用者调用系统中的任何Ant文件存在严重的安全问题。当前版本0.1还存在一些问题,比如服务不返回远程构建的输出,仅返回成功消息或失败异常,需要以XML形式返回日志以便进行后处理。此外,Rant使用的是原始的Apache SOAP产品,而非Axis,而Axis具有更好的互操作性。

4. 持续集成概述

当本地交互式构建正常工作后,就需要实现自动化了。在单开发者环境中,这种自动化可能有些过度,但大多数情况下,你可能是团队的一员(团队成员可能就在隔壁或世界各地)。为了控制大规模开发工作并保持理智,需要进行集成构建和常规部署。

Ant在持续集成方面能起到很大作用。利用操作系统的作业调度功能,可以轻松地对Ant构建进行调度和自动化,但这还不够。通过本章的技术和工具,构建可以实现以下功能:
- 自动化常规构建
- 捕获构建日志
- 将应用部署到测试服务器
- 运行容器内测试套件
- 直接向导致失败的开发者报告失败情况
- 构建编号
- 基于Web的报告

5. 使用操作系统调度Ant构建
5.1 Windows方式

在Windows NT系列系统(包括Windows XP)中,可以使用任务调度程序服务来调度常规作业。 AT 命令可将作业排队,服务会在指定的时间间隔执行这些作业。以下是一个简单的Windows build.bat 命令文件示例:

set OLDCP=%CLASSPATH%
set CLASSPATH=
cd \AntBook\app
cvs update -P -R -d 
call %ANT_HOME%\bin\ant.bat clean all
set CLASSPATH=%OLDCP%

要使用 AT 命令调度该文件,可执行以下命令行:

C:\>at 01:00 /every:M,T,W,Th,F,S,Su "c:\jobs\build.bat"
5.2 Unix方式

在Unix系统中,可先创建一个shell脚本,例如:

cd ~/Projects/Antbook/app
cvs update -P -R -d 
ant clean all

然后修改 crontab 文件(使用 crontab -e )来调度构建:

# run at 00:30 every day 30 0 * * * $HOME/Projects/AntBook/app/rebuild.sh
5.3 脚本的使用

利用操作系统的调度功能是自动化构建的快速方法,但需要编写shell、批处理或Perl包装脚本。若未将SCM项目代码获取功能集成到构建文件或包装脚本中,简单的自动化构建效果不大。可以通过以下几种方式改进这些定时构建,使其更健壮:
- 将SCM系统的更新命令放在包装脚本中,或放在使用Ant的SCM任务的单独构建目标中。
- 为Ant调用添加 MailLogger ,以便在构建失败和/或成功时发送电子邮件警报。
- 将 <junitreport> 的构建日志和JUnit测试结果发布到可通过内部网访问的目录。

6. CruiseControl

CruiseControl是ThoughtWorks的Martin Fowler及其同事开发的自动化构建支持工具。它能在检测到代码库发生更改后,持续重建和重新测试系统。它是一个开源项目,托管在SourceForge上(http://cruisecontrol.sourceforge.net/)。不过,在编写本文时可用的1.2.1a版本中,让它正常工作可能有些棘手。

6.1 工作原理

CruiseControl由两部分组成:一个运行构建的独立Java应用程序和一个报告构建状态的Web应用程序。其架构如下:

graph LR
    A[源代码仓库] --> B[CruiseControl运行器]
    B --> C[带有CruiseControl钩子的项目构建文件]
    C --> D[CruiseControl Web应用展示构建状态]
    C --> E[构建结果]

命令行Java应用程序驱动构建过程,它处于一个无限循环中,对项目的构建进行循环处理。每次进入新的循环时,它会运行构建文件中的两个特殊目标之一。大多数情况下,它运行主构建目标,该目标会从SCM进行增量更新。在经过指定次数的增量构建尝试后,它会定期运行清理构建目标。

6.2 让构建运行器工作

要让CruiseControl融入构建,可按以下标准步骤操作:
- 下载并安装CruiseControl发行版(使用的是1.2.1a版本)。
- 根据管理第三方任务的方案,将 cruisecontrol.jar 放置在合适的位置,或者直接将其留在安装目录中。
- 向项目构建文件中添加新目标: modificationset masterbuild cleanbuild 。这些目标可以从CruiseControl安装提供的示例构建文件中复制,有适用于不同SCM系统的示例,需根据环境选择合适的示例。

以下是一个完整的CruiseControl构建文件示例:

<project name="AntBook - CruiseControl" default="masterbuild" basedir=".">
  <property file="cruisecontrol.properties"                  
            prefix="cruisecontrol"/>                         
  <property name="test.data.dir"                             
            location="${cruisecontrol.logDir}/testresults"/>  

  <property environment="env"/>
  <!-- On Windows env.TEMP will already be set, 
       so set it for Linux-->
  <property name="env.TEMP" location="/tmp"/>


  <!-- The next few lines of loading property files is copied from
       build.xml - perhaps entity reference include is warranted -->
  <property name="user.properties.file" 
            location="${user.home}/.build.properties"/>
  <!-- Load the application specific settings -->
  <property file="build.properties"/>

  <!-- Load user specific settings -->
  <property file="${user.properties.file}"/>
  <property name="root.dir" location="${env.TEMP}"/>
  <!-- CVS Info -->
  <property name="cvs.username" value="${user.name}"/>                    
  <property name="cvs.host" value="localhost"/>                            
  <property name="cvs.root"                                                
         value=":pserver:${cvs.username}@${cvs.host}:/home/cvs/projects"/>
  <property name="cvs.passfile" value="../.cvspass"/>                     
  <property name="cvs.dir" location="${root.dir}"/>                       
  <property name="cvs.package" value="AntBook/app"/>                      
  <target name="init">
    <mkdir dir="${root.dir}"/>
    <echoproperties/>
  </target>
  <target name="clean">
    <echo>Cleaning build directory</echo>
    <delete dir="${root.dir}/AntBook/app"/>
  </target>
  <target name="modificationset" 
          depends="init"
          description="Check modifications since last build">
    <taskdef name="modificationset"
             classname="net.sourceforge.cruisecontrol.ModificationSet"
             classpath="lib/cruisecontrol/cruisecontrol.jar"
    />

    <!-- set the CruiseControl timestamp when it is not defined -->
    <tstamp>                                                        
      <format property="lastBuildAttemptTime"                       
              pattern="yyyy-MM-dd HH:mm:ss"                         
              offset="-24" unit="hour"                              
      />                                                            
    </tstamp>                                                       
    <echo>
      Checking for modifications since ${lastBuildAttemptTime}
    </echo>

    <modificationset lastbuild="${lastBuildAttemptTime}"            
                     quietperiod="60"                               
                     dateformat="yyyy-MMM-dd HH:mm:ss">             
      <cvselement cvsroot="${cvs.root}"                             
                  localworkingcopy="${root.dir}/${cvs.package}"     
      />                                                            
    </modificationset>                                              
  </target>
  <target name="checkout" depends="init">
    <cvs cvsRoot="${cvs.root}"                                      
         dest="${root.dir}"                                         
         package="${cvs.package}"                                   
         passfile="${cvs.passfile}"                                 
         failOnError="yes"                                          
    />
  </target>
  <target name="build" depends="checkout">
    <ant dir="${root.dir}/${cvs.package}"                           
         inheritAll="false">                                        
      <!-- accumulate test results into a global location -->       
      <property name="test.data.dir" location="${test.data.dir}"/>  

      <!-- force any properties we set here to propogate down -->   
      <property name="inheritAll" value="true"/>                    
    </ant>                                                          
  </target>
  <target name="masterbuild"  
          depends="modificationset,build" 
          description="CruiseControl master build"
  /> 
  <target name="cleanbuild"   
          depends="clean,masterbuild"
          description="CruiseControl clean build"
  />
</project>

配置好构建文件后,还需要配置CruiseControl运行时使用的属性。发行版提供了一个文档完善的初始 cruisecontrol.properties 文件,只需进行少量修改。例如,修改的部分属性如下:

antfile = cruisecontrol.xml
auxlogfiles = modificationset.file, test.data.dir
mailhost = <our mail server>

启动CruiseControl运行器时,发行版提供了 .bat .sh 启动脚本。在Windows机器上,可以以 cruiseControl.bat 为基础,将其重命名为 cc.bat ,并将其复制到应用程序目录中,然后修改以匹配环境。首次启动CruiseControl需要一些一次性初始化参数,例如:

cc.bat -lastbuild 20020101010101 -label 1.1.1

后续运行CruiseControl会从上一次停止的地方继续,不需要这些参数。如果未指定 -properties 参数,默认使用 cruisecontrol.properties 。构建运行器应用程序生成的典型输出如下:

[masterbuild] ***** Starting automated build process *****
Reading build information from : c:\AntBook\app\buildcycleinfo
[masterbuild] ***** Starting Build Cycle
[masterbuild] ***** Label: 1.1.1
[masterbuild] ***** Last Good Build: 20020101010101
[masterbuild]
[masterbuild] Opening build file: cruisecontrol.xml
[masterbuild] Using clean target: cleanbuild
clean:
     [echo] Cleaning build directory
init:
[echoproperties] #Ant properties
...
modificationset:
     [echo]
      Checking for modifications since 20020404110915
[CVSElement] Executing: cvs -d :pserver:erik@localhost:/home/cvs/projects
  -q log -N "-d>2002-04-04 16:09:15 GMT" C:/temp/AntBook/app
BUILD FAILED
C:\AntBook\app\cruisecontrol.xml:68: No Build Necessary
Total time: 14 seconds
[masterbuild]
[masterbuild] ***** Ending Build Cycle, sleeping 30.0 seconds until next
               build.
[masterbuild] ***** Label: 1.1.1
[masterbuild] ***** Last Good Build: 20020101010101
[masterbuild]

通过以上对Web服务开发和持续集成技术的介绍,我们可以看到这些技术在现代软件开发中的重要性和实用性。合理运用这些技术和工具,能够提高开发效率,保证软件质量。在实际应用中,还需要根据具体需求和环境进行适当的调整和优化。

深入探索Web服务与持续集成技术

7. Anthill

Anthill是一款商业的持续集成工具,它为软件开发团队提供了强大的自动化构建和部署功能。与CruiseControl相比,Anthill具有更丰富的特性和更友好的用户界面,适合大型项目和企业级应用。

7.1 主要特性
  • 可视化界面 :Anthill提供了直观的图形化界面,使得用户可以轻松地配置和管理构建任务。通过界面,用户可以方便地设置构建参数、监控构建状态和查看构建历史记录。
  • 多项目支持 :可以同时管理多个项目的构建任务,支持不同项目之间的依赖关系管理。这对于大型软件开发项目来说非常重要,能够确保各个子项目之间的协调和一致性。
  • 插件扩展 :拥有丰富的插件库,用户可以根据需要安装各种插件来扩展其功能。例如,支持与版本控制系统(如Git、SVN)、测试框架(如JUnit)和部署工具(如Maven)的集成。
  • 高级调度功能 :支持复杂的调度规则,如定时构建、触发式构建和依赖式构建。用户可以根据项目的需求灵活设置构建任务的执行时间和条件。
7.2 操作步骤

以下是使用Anthill进行持续集成的基本步骤:
1. 安装和配置 :从官方网站下载Anthill并进行安装,根据系统要求进行必要的配置,如数据库连接、服务器端口等。
2. 创建项目 :在Anthill界面中创建新的项目,指定项目的名称、描述和相关参数。
3. 配置构建任务 :为项目添加构建任务,包括编译代码、运行测试、生成文档等。可以使用内置的任务模板或自定义脚本。
4. 设置调度规则 :根据项目需求设置构建任务的调度规则,如每天定时构建、代码提交后触发构建等。
5. 监控和管理 :在Anthill界面中监控构建任务的执行状态,查看构建日志和结果。如果出现问题,可以及时进行调整和修复。

8. Gump

Gump是Apache软件基金会开发的持续集成工具,主要用于Apache项目的自动化构建和测试。它具有简单、高效的特点,能够确保项目的代码质量和稳定性。

8.1 特点
  • 轻量级 :Gump的设计简洁,占用资源少,适合在各种环境中运行。它不需要复杂的配置和管理,能够快速启动和运行。
  • 集成性强 :与Apache的其他工具和服务紧密集成,如Subversion、Maven和JUnit。可以方便地获取项目的源代码、编译代码和运行测试。
  • 分布式构建 :支持分布式构建,可以在多个节点上并行执行构建任务,提高构建效率。这对于大型项目来说尤为重要,能够缩短构建时间。
8.2 使用方法

使用Gump进行持续集成的步骤如下:
1. 安装和配置 :从Apache官方网站下载Gump并进行安装,根据项目需求进行必要的配置,如项目路径、构建脚本等。
2. 定义构建任务 :在Gump配置文件中定义构建任务,包括获取源代码、编译代码、运行测试等。可以使用Maven的插件来完成这些任务。
3. 设置触发条件 :设置构建任务的触发条件,如代码提交、定时任务等。当满足触发条件时,Gump会自动启动构建任务。
4. 查看结果 :在Gump界面中查看构建任务的执行结果,包括构建状态、测试报告和日志信息。如果出现问题,可以及时进行排查和修复。

9. 持续集成工具比较

为了帮助开发者选择适合自己项目的持续集成工具,下面对CruiseControl、Anthill和Gump进行了比较:
| 工具名称 | 类型 | 特点 | 适用场景 |
| ---- | ---- | ---- | ---- |
| CruiseControl | 开源 | 免费、功能较为基础,需要一定的配置和调试 | 小型项目、开源项目 |
| Anthill | 商业 | 功能丰富、可视化界面友好,适合大型项目和企业级应用 | 大型软件开发项目、企业级应用 |
| Gump | 开源 | 轻量级、集成性强,与Apache项目紧密结合 | Apache项目、轻量级项目 |

10. 总结

Web服务开发和持续集成技术在现代软件开发中扮演着重要的角色。通过使用Web服务,开发者可以实现不同系统之间的交互和数据共享;而持续集成则能够确保代码的质量和稳定性,提高开发效率。

在Web服务开发方面,我们介绍了如何将Java类转换为SOAP端点,以及如何使用Axis和相关工具进行开发和测试。同时,还探讨了通过SOAP调用Ant的方法和注意事项。

在持续集成方面,我们介绍了多种持续集成工具,包括使用操作系统调度Ant构建、CruiseControl、Anthill和Gump。每个工具都有其特点和适用场景,开发者可以根据项目的需求和规模选择合适的工具。

总之,合理运用Web服务和持续集成技术,能够帮助开发者更好地管理和开发软件项目,提高软件的质量和可靠性。在实际应用中,开发者还需要不断学习和探索,根据项目的实际情况进行优化和调整。

graph LR
    A[Web服务开发] --> B[SOAP端点转换]
    A --> C[Axis工具使用]
    A --> D[SOAP调用Ant]
    E[持续集成] --> F[操作系统调度]
    E --> G[CruiseControl]
    E --> H[Anthill]
    E --> I[Gump]

通过以上的总结和比较,希望能够为开发者在Web服务开发和持续集成方面提供一些参考和帮助。在未来的软件开发中,这些技术将继续发挥重要的作用,推动软件行业的发展。

本系统旨在构建一套面向高等院校的综合性教务管理平台,涵盖学生、教师及教务处三个核心角色的业务需求。系统设计着重于实现教学流程的规范化数据处理的自动化,以提升日常教学管理工作的效率准确性。 在面向学生的功能模块中,系统提供了课程选修服务,学生可依据培养方案选择相应课程,并生成个人专属的课表。成绩查询功能支持学生查阅个人各科目成绩,同时系统可自动计算并展示该课程的全班最高分、平均分、最低分以及学生在班级内的成绩排名。 教师端功能主要围绕课程成绩管理展开。教师可发起课程设置申请,提交包括课程编码、课程名称、学分学时、课程概述在内的新课程信息,亦可对已开设课程的信息进行更新或撤销。在课程管理方面,教师具备录入所授课程期末考试成绩的权限,并可导出选修该课程的学生名单。 教务处作为管理中枢,拥有课程审批教学统筹两大核心职能。课程设置审批模块负责处理教师提交的课程申请,管理员可根据教学计划资源情况进行审核批复。教学安排模块则负责全局管控,包括管理所有学生的选课最终结果、生成包含学号、姓名、课程及成绩的正式成绩单,并能基于选课成绩数据,统计各门课程的实际选课人数、最高分、最低分、平均分以及成绩合格的学生数量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值