自动化云虚拟机的开发和管理

学习如何使用 Apache Maven 在 IBM SmartCloud Enterprise 上实现自动化构建和部署

最近出现了一种趋势,即建立云应用程序和服务的开发与运营之间的紧密关系;特别是,这种趋势会导致应用程序生命周期管理 (ALM) 工具和云计算的集成变得更加紧密、更加高效。在本文中,作者将向您展示如何使用开源 Apache Maven 构建管理工具来自动化 IBM® SmartCloud Enterprise 上的构建和部署项目。作者将演示如何通过开发一个 Apache Maven 插件,将云上虚拟机的管理集成到构建和部署生命周期中,该插件能够查找并创建可以在云上运行 J2EE 应用服务器的虚拟机。您还会发现在云上进行开发和部署的最佳实践,以及如何使用 IBM Cloud API 和 Maven 来实现这些最佳实践。

Alex Amies, 高级软件工程师, IBM

/developerworks/i/p-aamies.jpgAlex Amies 是 IBM GTS 中国开发实验室的一名高级软件工程师。他目前是致力于设计 IBM Smart Business Development and Test on the IBM Cloud 的一名架构师。此前他在 IBM 其他部门担任过云计算和安全性产品方面的架构师和开发人员。



Pan Xia Zou (zoupx@cn.ibm.com), 软件工程师, IBM

邹盼霞,IBM 中国研发中心(CDL)GTS 部门软件工程师,主要从事云计算解决方案的开发。



Yi Shuai Wang (wangyis@cn.ibm.com), 软件工程师, IBM

王亦帅,具有8年Java开发经验。2006年加入IBM CDL部门,参与设计和开发J2EE应用程序。作者曾参与《数字图书馆》一书的写作并于2003年出版。



2012 年 2 月 02 日

构建和部署自动化对于所有开发项目的顺利执行都是至关重要的。项目越大,构建和部署自动化就越重要。生命周期管理工具 (ALM) 的最新趋势是在开发和运营之间建立更好的联系,尤其是集成这些工具和云时。

与物理资源相比,云资源的优势之一是能根据需要使用 API 创建云资源。ALM 工具可以在云上运行,以某种方式利用云,或者用来开发云应用程序。

对于代码开发(包括执行本地构建和单元测试)而言,IBM Rational® Application Developer 和集成开发工具是一个理想的选择,但与个人开发相比,创建可重复的构建过程对于团队应用程序开发要重要得多。

构建和部署生命周期一般包括以下几个步骤:

  • 编译
  • 打包
  • 验证
  • 单元测试
  • 中间件配置
  • 部署

在云计算中,您可以使用预安装的软件创建虚拟机,从而进一步实现部署自动化。

有很多开源和商业构建工具能够实现构建和部署自动化,这些工具包括 Ant、Maven 和 IBM Build Forge。在本文中,我们将重点关注 Apache Maven 开源工具;它提供了针对我们感兴趣的构建和部署阶段的一些定义,还提供了一个可扩展的框架。另外,它还包含很多最佳实践模式和构建任务插件,这些都非常有用。

Sample J2EE 项目样例

IBM SmartCloud Enterprise 目录下包含 IBM WebSphere® Application Server 7.0 实例。有了它,您无需安装任何软件就可以使用 J2EE 环境,同时还能享用 WebSphere Application Server 在其他 J2EE 环境中提供的额外特性。

当请求 WebSphere Application Server 服务器时,系统会提示您输入 WebSphere Application Server 管理员控制台的用户名和密码。请记住这些信息,因为以后会用到它们。此外,系统还会提示您选择配置文件,如下所示。

图 1. WebSphere 镜像配置向导 Additional Parameters Screen
WebSphere 镜像配置向导 Additional Parameters Screen

WebSphere 配置文件定义了一个运行时环境,其中包括服务器会用来确定和保存配置信息的所有文件。请选择 Development 配置文件,这会使让通过 IBM Rational Software Architect 管理 WebSphere Application Server 变得更方便,本文的后面部分将对此进行讨论。

配置好实例并启动它之后,很快就会启动 WebSphere Application Server。您可以通过以下 URL 进入管理员控制台:https://host:9043/ibm/console/logon.jsp。

所有的 WebSphere Application Server 管理,除了启动和停止服务器本身,都可以在 Web 管理员控制台上进行。您可以使用 IBM Rational Application Developer、Eclipse 或其他 IDE,创建可以在 WebSphere Application Server 上运行的 J2EE 应用程序。对于 Eclipse,您可以使用 J2EE Standard Tools,即 J2EE Developer Tools 版本。您可以使用 IBM Cloud 目录中的 IBM Rational Application Developer 镜像来利用预先构建的环境。

请在 Rational Application Developer 或 Rational Software Architect 中尝试使用该工具,在 Eclipse 中使用 EAR Application Project 启动一个新的企业应用程序:

图 2. Eclipse EAR Application Project 向导
Eclipse EAR Application Project 向导

调用项目 CloudAPIClientEAR。单击 Finish 按钮。在下一步中,创建一个动态 Web 项目;将其命名为 CloudAPIClientWeb。并将此动态 Web 项目添加到 CloudAPIClientEAR 项目中:

图 3. Eclipse Dynamic Web Project Wizard
Eclipse Dynamic Web Project Wizard

现在创建一个 HTML 文件和一个 servlet 来测试应用程序。将一个名为 index.html 的文件添加到 Web 内容目录,并在其中添加一些文字,如 “My web application”。此外,请添加一个 servlet,并添加与 TestServlet 类相似的代码:

清单 1. 添加一个 servlet
package com.ibm.cloud.examples.servlet;

import java.io.IOException;
import java.io.Writer;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class TestServlet
 */
public class TestServlet extends HttpServlet {
     private static final long serialVersionUID = 1L;

     protected void doGet(HttpServletRequest request, HttpServletResponse response) 
       throws ServletException, IOException {
          Writer writer = response.getWriter();
          writer.write("My web application");
     }
}

如果使用了 Rational Software Architect 或 Eclipse,那么 Web 应用程序的 web.xml 文件应该已经配置好了。如果没有设置好,请将它设置如下:

清单 2. 您的 Web 应用程序存档文件应该如下所示
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.5" 
 xmlns="http://java.sun.com/xml/ns/javaee" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
     <display-name>CloudAPIClientWeb</display-name>
     <servlet>
          <display-name>TestServlet</display-name>
          <servlet-name>TestServlet</servlet-name>
          <servlet-class>com.ibm.cloud.examples.servlet.TestServlet</servlet-class>
     </servlet>
     <servlet-mapping>
          <servlet-name>TestServlet</servlet-name>
          <url-pattern>/TestServlet</url-pattern>
     </servlet-mapping>
     <welcome-file-list>
          <welcome-file>index.html</welcome-file>
     </welcome-file-list>
</web-app>

下一步是导出文件。右键单击 EAR 项目并选择 Export to EAR。然后将该文件命名为 CloudAPIClientEAR.ear:

图 4. Rational Software Architect EAR Export Wizard
Rational Software Architect EAR Export Wizard

要添加您的企业应用程序 EAR 文件,请执行以下操作:

  1. 从浏览器进入 WebSphere 管理员控制台。
  2. 导航到 Applications > New Application > New Enterprise Application,选择 Upload from Local file system。然后上传 EAR 文件并单击 Next
  3. 选择 Fast Path 选项。
  4. 任意选择一个目录来安装此应用程序。
  5. 在 Map Modules to Servers 面板上,选择 CloudAPIClientWeb
  6. 保存修改。
  7. 转到 Applications > Application Types > WebSphere enterprise applications。启动应用程序。

导航到以下 URL 以便查看 HTML 页面:http://host:9080/CloudAPIClientWeb/。您会看到之前添加到 HTML 页面中的 “My web application” 文本。要查看 servlet,请输入以下 URL:http://host:9080/CloudAPIClientWeb/TestServlet。您应该能够看到在 TestServlet 代码的 Writer 中输入的文本。

如果需要多次重复此操作,那么这种部署方式可能会让人感到厌烦。您可以使用 Eclipse 或 IBM Rational Application Developer 中的远程部署功能。它会自动将 J2EE 应用程序发布到服务器上,不必经过 WebSphere 管理员控制台的所有屏幕。使用 New Server 向导来添加远程服务器,并提供主机名或 IP 地址以及管理员的用户 id 和密码。

现在我们看看如何安装和使用 Apache Maven 来实现构建自动化。


使用 Maven 实现构建自动化

要安装 Apache Maven,请从网站上下载它并定义环境变量,如下所示。

清单 3. 定义 Maven 的环境变量
set M2_HOME=D:\opt\apache-maven-3.0.3
set JAVA_HOME=D:\Program Files\IBM\SDP\jdk
set PATH=%JAVA_HOME%;%PATH%;%M2_HOME%\bin

可以对 Linux® 执行同样的操作。为了验证 Maven 是否可用,请执行以下的命令:

清单 4. 验证 Maven 是否可用
>mvn --version
Apache Maven 3.0.3 (r1075438; 2011-03-01 01:31:09+0800)
Maven home:D:\opt\apache-maven-3.0.3
Java version:1.6.0. range.IBM Corporation
Java home:D:\Program Files\IBM\SDP\jdk\jre
Default locale: en_US, platform encoding:GB18030
OS name:"windows xp", version:"5.1 build 2600 service pack 3", 
 arch:"x86", family:"windows"

在运行清单 4 中的命令后,您应该会看到类似的内容。

在 Maven 中,原型 是项目模板,它包含一个可以生成的标准项目结构。这是一个好消息;在之前的样例中,您已经在自己的 IDE 中创建了自己的项目,并创建了 Web 和企业应用程序。我们来看一下在此过程中如何处理并了解关于 Maven 的更多信息。

在 Maven 中,依赖关系就像打包成 JAR 的 Java™ 库一样,至少包含一个 groupIdartifactId、一个版本和一个 scope。为了处理依赖关系,Maven 会查找本地存储库。如果本地存储库中不存在依赖关系,则会从外部存储库将其下载到本地存储库中。默认的外部存储库位于 http://repo1.maven.org/maven2/。您可以设置自己的远程存储库,云是一个不错的选择。

假设依赖关系在第三方 JAR 文件中。您可以向 pom.xml 添加一个分段标记,如下所示:

清单 5. 将依赖关系添加到第三方 JAR 文件中
<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.12</version>
  <scope>compile</scope>
</dependency>

以 log4j 库为例。

由于授权的关系,J2EE 和相关库不是自动可用的。您需要访问相关网站,同意条款和条件,自己下载 JAR 文件。然后使用以下命令:

清单 6. 安装第三方依赖关系
> mvn install:install-file -Dfile=/opt/apache-tomcat70/lib/servlet-api.jar 
  -DgroupId=javax -DartifactId=servlet-api -Dversion=3.0 -Dpackaging=jar

此样例是用于编译 J2EE Web 项目的 servlet API。要创建带有标准项目结构的 Web 应用程序,请输入以下命令:

清单 7. 创建带有标准项目结构的 Web 应用程序
> mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes 
  -DarchetypeArtifactId=maven-archetype-webapp 
  -DgroupId=com.iotdata -DartifactId=my-webapp

Maven 会在 my-webapp 目录下创建项目树,该目录下包括 pom.xml 文件。我们不需要这么做,而是使用在之前章节中已经创建的项目。将 pom.xml 文件添加到您的 Web 应用程序项目的顶层目录:

清单 8. 将 pom.xml 文件添加到 Web 应用程序项目的顶层目录
<project xmlns="http://maven.apache.org/POM/4.0.0" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.iotdata</groupId>
  <artifactId>CloudAPIClientWeb</artifactId>
  <packaging>war</packaging>
  <version>1.0</version>
  <name>IoT Data Cloud API Client Web</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>javax</groupId>
      <artifactId>servlet-api</artifactId>
      <version>3.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
  <build>
    <finalName>${pom.artifactId}</finalName>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
          <warSourceDirectory>WebContent</warSourceDirectory>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

请注意这是 WAR 包。pom.xml 文件使用了创建 WAR 包的 Maven WAR 插件。您的目录结构与标准结构有一点不同,因此添加了 sourceDirectory 标记,它是 build 元素的属性。请注意,您使用了之前描述的 servlet API 依赖关系。如果将 scope 设置成 provided,就不必再将 servlet API JAR 复制到 Web 应用程序中。

为了能够构建它,请进入 my-webapp 目录并输入以下命令:

清单 9. 开始构建
> mvn package

您应该可以在目标目录下的 CloudAPIClientWeb.war 文件中看到输出内容。将输出内容部署到应用服务器上,将浏览器指向 http://host:8080/CloudAPIClientWeb,您会看到一个带有 “Hello World!” 文本的页面。

您可以通过使用多个 pom.xml 在一个 Maven 文件结构中管理多个项目。您可能会这么做,因为 Web 应用程序将会包含在企业应用程序中。

在 CloudAPIClientEAR 和 CloudAPIClientWeb 目录上创建一个 pom.xml 文件,如清单 10 中所示。

清单 10. 创建额外的 pom.xml 文件来管理额外的项目
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.iotdata</groupId>
  <version>1.0</version>
  <artifactId>app</artifactId>
  <packaging>pom</packaging>
  <modules>
    <module>CloudAPIClientWeb</module>
    <module>CloudAPIClientEAR</module>
  </modules>
</project>

它定义了 CloudAPIClientWeb 和 CloudAPIClientEAR 项目的所有模块。

清单 11 显示了如何创建 EAR 项目的 pom.xml 文件:

清单 11. 创建 EAR 项目的 pom.xml 文件
<project xmlns="http://maven.apache.org/POM/4.0.0" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
       http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.iotdata</groupId>
    <artifactId>app</artifactId>
    <version>1.0</version>
  </parent>
  <groupId>com.iotdata</groupId>
  <artifactId>CloudAPIClientEAR</artifactId>
  <packaging>ear</packaging>
  <version>1.0</version>
  <name>IoT Data Cloud API Client EAR</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
     <groupId>com.iotdata</groupId>
     <artifactId>CloudAPIClientWeb</artifactId>
     <version>1.0</version>
     <type>war</type>
    </dependency>
  </dependencies>
  <build>
    <finalName>${pom.artifactId}</finalName>
    <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-ear-plugin</artifactId>
       <version>2.4</version>
       <configuration>
         <earSourceDirectory>
          ${basedir}
         </earSourceDirectory>
         <modules>
           <webModule>
            <groupId>com.iotdata</groupId>
            <artifactId>CloudAPIClientWeb</artifactId>
            <bundleFileName>
              CloudAPIClientWeb.war
            </bundleFileName>
           </webModule>
          </modules>
       </configuration>
      </plugin>
    </plugins>
  </build>
</project>

pom.xml file 定义了一个指向顶层 pom.xml 的父节点。这一小段的内容也需要添加到 web pom.xml 中。此时,package 的值是 ear,它使用了 Maven ear 插件,并根据早期 Web 项目定义了 Web 模型。

现在,请使用以下命令清除并重新构建整个项目:

清单 12. 清除并重新构建整个项目
> mvn clean install

现在已经完成了 EAR 的重新构建,它包含来自 Web 应用程序的 WAR 文件。

以上就是创建可重复版本的方法;此方法很重要,因为在测试和生产环境中,不允许开发人员使用自己的 IDE 连接到应用服务器。

现在,我们看一下如何生成一个可以自动完成服务器创建和部署的 Maven 插件。


实现服务器创建和部署自动化的 Maven 插件

使用 Maven 实现构建自动化 一节中,我们描述了如何使用 Maven 构建 J2EE 应用程序。Maven 通过使用插件机制提供了一个可扩展的框架。

这一节将演示如何创建能在云上使用 IBM SmartCloud API 查找或创建虚拟机的 Maven 插件:

  1. 该插件首先查找虚拟机实例。
  2. 如果找到,则可以使用该实例来配置 J2EE 应用程序。
  3. 否则将创建一个新的虚拟机。

要开始使用,则需要使用以下命令创建一个 Maven 插件项目样例:

清单 13. 创建 Maven 插件
>mvn archetype:generate -DarchetypeArtifactId=maven-archetype-mojo 
 -DgroupId=com.ibm.cloud.enterprise.example 
 -DartifactId=sce-maven-plugin -DinteractiveMode=false

这样就创建了一个 MOJO (Maven Old Java Object) 类型的插件项目目录树。

将项目导入 IDE,并将 Maven 内核和插件库导入 IDE 构建路径中。Maven 插件实现了 Mojo 接口,这一般是通过扩展 AbstractMojo 类实现的。请添加 SCEMojo 类的源代码:

清单 14. 添加 SCEMojo 类的源代码
package com.ibm.cloud.enterprise.example;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.logging.Log;

import com.ibm.cloud.api.rest.client.DeveloperCloud;
import com.ibm.cloud.api.rest.client.DeveloperCloudClient;
import com.ibm.cloud.api.rest.client.bean.Address;
import com.ibm.cloud.api.rest.client.bean.Instance;
import com.ibm.cloud.api.rest.client.bean.Volume;
import com.ibm.cloud.api.rest.client.exception.*;

/**
 * @goal create_instance
 */
public class SCEMojo extends AbstractMojo {
     
     private DeveloperCloudClient client = DeveloperCloud.getClient();
     private Log log = getLog();
     
     /**
     * The user name for the cloud account
     * @parameter expression="${create_instance.user_name}"
     */
    private String user_name;
     
     /**
     * The password for the cloud account
     * @parameter expression="${create_instance.password}"
     */
    private String password;
     
     /**
     * The name of the server to lookup or create
     * @parameter expression="${create_instance.name}" default-value="app_server"
     */
    private String name;
     
     /**
     * The data center to create the server in
     * @parameter expression="${create_instance.data_center}"
     */
    private String data_center;
     
    /**
     * The image ID to create the server with
     * @parameter expression="${create_instance.image_id}"
     */
    private String image_id;
    
    /**
     * The name of the SSH key to create the server with
     * @parameter expression="${create_instance.key_name}"
     */
    private String key_name;

    /**
     * The name of the WebSphere administrative user
     * @parameter expression="${create_instance.was_admin_user}"
     */
    private String was_admin_user;
    
     /**
     * The name of the WebSphere administrative user password
     * @parameter expression="${create_instance.was_admin_password}"
     */
    private String was_admin_password;
    
}

该代码已经导入了您下面将要添加的方法。类级 (class-level) 的 JavaDoc 有一个 @goal 标记。该标记是必不可少的,它表示构建目标是 create_instance。私有字段 user_namepassword, namedata_centerimage_idkey_namewas_admin_userwas_admin_password 是由插件用户传入的参数。这些参数是:

  • user_name 云帐户的用户名
  • password 云帐户的密码
  • name要查找或创建的服务器的名称,默认值 = “app_server”
  • data_center在其中创建服务器的数据中心
  • image_id创建服务器的镜像 ID
  • key_name创建服务器的 SSH 键的名称
  • was_admin_userWebSphere 管理员用户名称
  • was_admin_passwordWebSphere 管理员用户密码名称

实现 Mojo 接口的类必须实现 execute 方法。请添加 execute 方法:

清单 15. 添加 execute 方法
public void execute() throws MojoExecutionException {
     try {
              log.info("Logging onto cloud with user name " + user_name);
              client.setRemoteCredentials(user_name, password);
              log.info("Looking for a server with name " + name);
          List<Instance> instances = client.describeInstances();
              log.info("Found " + instances.size() + " instances");
              boolean found = false;
              for (Instance instance: instances) {
                   if ((instance.getStatus() == Instance.Status.ACTIVE) &&
                        instance.getName().equals(name)) {
                        log.info("Found a server with name " + name);
                        found = true;
                   }
              }
              if (!found) {
                   log.info("No server with name " + name + " found");
                   createInstance();
              }
     } catch (Exception e) {
              log.warn(e);
          throw new MojoExecutionException(e.getMessage());
     }
}

该方法首先设置用户的凭证,然后检索此用户所有的虚拟机列表。它会遍历整个虚拟机列表,查找与用户提供的参数具有相同名称的活动实例。

如果找到匹配的虚拟机,这一步的操作就完成了。否则,会采用 createInstance() 方法,通过将此方法添加到 SCEMojo 类来创建一个虚拟机:

清单 16. 通过将 createInstance() 添加到 SCEMojo 类来创建 VM
private void createInstance() throws InsufficientResourcesException, 
              InvalidConfigurationException, PaymentRequiredException, 
              UnauthorizedUserException, UnknownErrorException, IOException {
     Address address = null;
     Volume volume = null;
     Address[] secondaryAddresses = new Address[0];
     Map parameters = new HashMap<String,Object>();
     parameters.put("WASAdminUser", was_admin_user);
     parameters.put("WASAdminPassword", was_admin_password);
     List<Instance> newInstances = client.createInstance(
               name, // Name of instance
               data_center, // Data center ID
               image_id, // Image ID
               "COP32.1/2048/60", // Instance type
               key_name, // Key
               address, // Address
               volume, // Volume
               parameters, // Options
               null, // VLAN ID
               secondaryAddresses, // Seconday IP addresses
               true); // Minimum ephemeral
     Instance instance = newInstances.get(0);
     log.info("ID:" + instance.getID());
}

此方法使用用户提供的参数创建虚拟机,并将实例 ID 写入日志。

如清单 17 所示,创建插件的 pom.xml 文件:

清单 17. 创建插件的 pom.xml 文件
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
 http://maven.apache.org/xsd/maven-4.0.0.xsd" 
 xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.ibm.cloud.enterprise</groupId>
  <artifactId>sce-maven-plugin</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>maven-plugin</packaging>
  <name>sce-maven-plugin Maven Mojo</name>
  <url>http://ibm.com/cloud/enterprise</url>
  <dependencies>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-plugin-api</artifactId>
      <version>2.0</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>commons-httpclient</groupId>
      <artifactId>commons-httpclient</artifactId>
      <version>3.1</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.1.1</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>commons-codec</groupId>
      <artifactId>commons-codec</artifactId>
      <version>1.3</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>commons-lang</groupId>
      <artifactId>commons-lang</artifactId>
      <version>2.3</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.ibm.cloud.enterprise</groupId>
      <artifactId>DeveloperCloud_API_Client</artifactId>
      <version>1.4.1</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
</project>

pom.xml 文件使用 maven-plugin 包类型。它定义了 maven-plugin-api 依赖关系和 IBM SmartCloud Enterprise Java API 上的依赖关系,还定义了依赖库、Apache HTTP Client、Commons、Logging、Codec 和 Lang。Maven 会自动从 Maven 中央存储库下载 Apache 库。

下载 SmartCloud API 库并将它安装到本地存储库:

清单 18. 下载 SmartCloud API 库并将它安装到本地存储库
mvn install:install-file -Dfile=/opt/sce/DeveloperCloud_API_Client_1.4.1.jar 
 -DgroupId=com.ibm.cloud.enterprise 
 -DartifactId=DeveloperCloud_API_Client 
 -Dversion=1.4.1 -Dpackaging=jar

立即调整参数,使其与本地环境一致。

在下一步中,将构建插件,并将它安装到本地存储库:

清单 19. 构建插件并将其安装到本地存储库
>mvn package
>mvn install

现在可以使用项目的插件。用 Maven generate 命令创建项目云应用程序:

清单 20. 用 Maven generate 命令创建项目
mvn archetype:generate -DgroupId=com.ibm.cloud.enterprise 
 -DartifactId=cloud-app 
 -DarchetypeArtifactId=maven-archetype-quickstart 
 -DinteractiveMode=false

将新项目导入 IDE。修改已生成的 pom.xml,以便添加依赖关系和插件配置:

清单 21. 修改 pom.xml,以便添加依赖关系和插件配置
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
 http://maven.apache.org/xsd/maven-4.0.0.xsd" 
 xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.ibm.cloud.enterprise</groupId>
  <artifactId>cloud-app</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>cloud-app</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.ibm.cloud.enterprise</groupId>
      <artifactId>sce-maven-plugin</artifactId>
      <version>1.0-SNAPSHOT</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>com.ibm.cloud.enterprise</groupId>
        <artifactId>sce-maven-plugin</artifactId>
        <version>1.0-SNAPSHOT</version>
        <configuration>
          <user_name>a.user@example.com</user_name>
          <password>****</password>
          <name>was</name>
          <data_center>101</data_center>
          <image_id>20015399</image_id>
          <key_name>july26</key_name>
          <was_admin_user>wasadmin</was_admin_user>
          <was_admin_password>***</was_admin_password>
        </configuration>
        <executions>
          <execution>
            <phase>compile</phase>
            <goals>
              <goal>create_instance</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

请注意 configuration 一节中的参数用法。

现在已经准备好使用插件,首先检查新的实例和已有实例;使用以下的 Maven 目标调用插件。

清单 22. 调用插件
>mvn com.ibm.cloud.enterprise:sce-maven-plugin:1.0-SNAPSHOT:create_instance

如果没有具有指定名称的虚拟机,则会看到以下输出:

清单 23. 如果没有具有指定名称的 VM,则会看到以下输出
[info] Logging onto cloud with user name a.user@example.com
[info] Looking for a server with name was
[info] Found 4 instances
[info] No server with name was found
[info] ID:112332
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] 
...

如果有指定名称的虚拟机,则会看到以下输出:

清单 24. 如果有指定名称的 VM,则会看到以下输出
...[INFO] --- sce-maven-plugin:1.0-SNAPSHOT:create_instance (default-cli) @ cloud-a
pp ---
[info] Logging onto cloud with user name aamies@cn.ibm.com
[info] Looking for a server with name was
[info] Found 5 instances
[info] Found a server with name was
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ----------------------------------------------------------------------
...

请记住,如果执行清单 22 中的命令来创建服务器,则需要花费一些时间来创建它。

目前为止,本文已经介绍了查看云如何融入开发和部署生命周期的一个好方法,但您还需要执行一些额外的步骤,才能让此过程在生命周期中更加有用。

我们已经演示了如何花费一些时间来创建服务器。需要一个轮询机制来等待此创建过程的完成;尽管如此,这里仍有其他一些挑战,比如确定应用服务器自身启动的时间,一般它只在虚拟机配置和操作系统启动后才会启动。您可以使用 WebSphere wasadmin API 来完成此操作。如果您有一个包含正在运行的应用服务器的活动服务器,则可以将 J2EE 应用程序部署到其中。在完成 WebSphere 服务器上的工作之后,您可能想删除它。您也许想将它添加到生命周期的清除阶段或其他地方。


后续步骤

您可能想完成的进一步的任务包括:

  • 在 IBM Cloud 中创建 Maven 存储库。这是一个重要的任务,因为企业通常会将其未发行的、专有或商务采购的软件与保存在公有存储库的已发布的开放源码软件相隔离。这会简化企业内部和业务伙伴之间的软件共享,将其与普通用户相隔离。
  • 创建一个云 API 项目模板。项目模板对于简化创建多个云项目、标准化最佳实践和消除重复非常有用。

J2EE 应用服务器有很多特性都可以帮助实现性能和可用性目标。主要特性之一是能够将应用服务器集群化,从而分担负载。集群 就是一组应用服务器节点或单个应用服务器,可以让它们充当一个小组来平衡工作负载。在云计算中,能够动态创建虚拟机并将其作为集群中的节点。

WebSphere Application Server 是尤其适合管理大型集群的 J2EE 平台。WebSphere 管理控制台中执行的所有步骤都可以用 wsadmin 工具和命令来改编,这些工具中包括带有 Java Management eXtensions (JMX) 和 Jython 脚本的 Java 程序。您可以将 WebSphere 网络部署模型的知识与创建和定制镜像的知识相结合,再加上您已掌握的关于 IBM SmartCloud Enterprise REST API 的知识,用这些知识来实现 WebSphere 集群元素配置自动化。您可以通过以下操作来实现此目标:

  1. 从一个基础 WebSphere Application Server 镜像开始,然后在管理员控制台使用 Profile Management Tool 和应用服务器来定制配置文件。
  2. 通过 IBM Cloud 用户界面或 REST API 将虚拟机保存到实例中。
  3. 使用 IBM Cloud REST API 配置新的虚拟机。
  4. 使用 wsadmin 工具将新的虚拟机添加到集群中,并同步各节点之间的应用程序部署,包括部署 J2EE 应用程序。

结束语

本文介绍了一个可在 IBM Cloud 上使用的 J2EE 项目样例;以及一个无需安装任何软件即可提供 J2EE 环境的 WebSphere Application Server 镜像。本文还概括了在您的环境中设置 Apache Maven 来实现构建自动化的步骤。我们描述了如何使用 Maven 构建 J2EE 应用程序。本文展示了如何创建能在云上使用 IBM SmartCloud API 查找或创建虚拟机的 Maven 插件。作为回报,我们还向您介绍了完成其他类似任务的方法,包括如何在 IBM Cloud 上创建私有 Maven 存储库,以及如何构建云 API 项目模板。

您只需动手体验一下即可。

参考资料

学习

获得产品和技术

讨论

条评论

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=Cloud computing, Java technology, Open source
ArticleID=791100
ArticleTitle=自动化云虚拟机的开发和管理
publish-date=02022012