Avançar para a área de conteúdo

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

Na primeira vez que você efetua sign in no developerWorks, um perfil é criado para você. Informações selecionadas do seu perfil developerWorks são exibidas ao público, mas você pode editá-las a qualquer momento. Seu primeiro nome, sobrenome (a menos que escolha ocultá-los), e seu nome de exibição acompanharão o conteúdo que postar.

Todas as informações enviadas são seguras.

  • Fechar [x]

Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

Todas as informações enviadas são seguras.

  • Fechar [x]

Automatizar o desenvolvimento e o gerenciamento de máquinas virtuais na nuvem

Saiba como automatizar a criação e a implementação do IBM SmartCloud Enterprise com o Apache Maven

Alex Amies, Senior Software Engineer, IBM
Alex Amies photo
Alex Amies é engenheiro de software senior no Laboratório de Desenvolvimento IBM GTS no laboratório de desenvolvimento da China. Ele é atualmente arquiteto e trabalha no design do Desenvolvimento e Teste de Negócios Inteligentes IBM na Nuvem IBM. Anteriormente, ele atuou como arquiteto e desenvolvedor de produtos de nuvem e de segurança em outros grupos na IBM.
Pan Xia Zou, Staff Software Engineer, IBM
Pan Xia Zou é engenheiro de software contratado na IBM e trabalha como arquiteto de automação de criação e implementação para o IBM SmartCloud Enterprise.
Yi Shuai Wang, Advisory Architect, IBM
Yi Shuai Wang é arquiteto consultivo da IBM e desenvolvedor líder para o desenvolvimento de serviços de suporte de negócios do IBM SmartCloud Enterprise.

Resumo:  Uma tendência recente é construir uma forte conexão entre aplicativo em nuvem e desenvolvimento e operações de serviço. Em particular, essa tendência está levando a uma integração mais firme e eficiente das ferramentas de application life cycle management (ALM) com computação em nuvem. Neste artigo, os autores mostrarão como usar a ferramenta de gerenciamento de criação do Apache Maven de software livre para automatizar a criação e implementação de projetos no IBM® SmartCloud Enterprise. Eles também demonstrarão como integrar o gerenciamento de máquinas virtuais na nuvem com o ciclo de vida de criação e implementação desenvolvendo um plug-in Apache Maven que se parece com e cria máquinas virtuais que executam um servidor de aplicativos J2EE na nuvem. Você também descobrirá melhores práticas para desenvolvimento e implementação na nuvem e como usar as APIs da IBM Cloud e o Maven para implementar essas práticas.

Data:  17/Nov/2011
Nível:  Intermediário Também disponível em :   Inglês
Atividade:  822 visualizações
Comentários:  


Automação de criação e implementação é crucial para a execução tranquila de qualquer projeto de desenvolvimento. Conforme os projetos ficam maiores, isso se torna mais importante. Uma tendência recente em application life cycle management tools (ALM) é construir uma melhor conexão entre desenvolvimento e operações e, em particular, a integração dessas ferramentas com as nuvens.

Uma das coisas maravilhosas dos recursos em nuvem em comparação com os recursos físicos é a possibilidade de criar recursos em nuvem sob demanda com APIs. As ferramentas ALM podem ser executadas na nuvem, aproveitar a nuvem de alguma maneira ou ser usadas para desenvolver aplicativos para a nuvem.

O IBM Rational® Desenvolvedor de aplicativos e ferramentas de desenvolvimento integradas são ideais para desenvolvimento de código, incluindo a realização de testes de unidade e construções locais, mas a criação de um processo de criação repetível é fundamental para o desenvolvimento de aplicativos em uma equipe maior que uma pessoa.

Há várias tarefas que frequentemente são agregadas ao ciclo de vida de criação e implementação, incluindo:

  • compilação
  • empacotamento
  • validação
  • teste de unidade
  • configuração de middleware
  • implementação

Em computação em nuvem, é possível levar a automação de implementação um passo adiante criando máquinas virtuais com software pré-instalado.

Há várias ferramentas de criação de software livre e comerciais que têm capacidade automação de criação e implementação, incluindo Ant, Maven e IBM Build Forge. neste artigo, focamos na ferramenta de software livre Apache Maven; ela tem definições para as fases da criação e implementação em que estamos interessados e inclui uma estrutura extensível. Além disso, contém padrões para várias melhores práticas e plug-ins para diversas tarefas de criação que são úteis.

Projeto J2EE de amostra

O catálogo IBM SmartCloud Enterprise inclui instâncias do IBM WebSphere® Application Server 7.0. Com isso, é possível usar um ambiente J2EE sem precisar instalar nenhum software e também desfrutar dos recursos extras que o WebSphere Application Server fornece além dos outros ambientes J2EE.

Ao solicitar um servidor WebSphere Application Server, você é solicitado a fornecer um nome de usuário e senha para o console de administração WebSphere Application Server. Anote isso porque será preciso mais tarde. Além disso, você será solicitado a escolher o perfil, como mostrado aqui.


Figura 1. Assistente de fornecimento de imagem do WebSphere, tela de parâmetros adicionais

Um perfil do WebSphere define um ambiente de tempo de execução, incluindo todos os arquivos que o servidor processa para determinar e armazenar informações de configuração. Escolha o perfil Development . Ele tornará o WebSphere Application Server mais conveniente para gerenciar através do IBM Rational Software Architect, como discuto mais adiante.

O WebSphere Application Server é iniciado por um breve período após a instância ter sido fornecida e inicializada. É possível visualizar o console de administração com este URL: https://host:9043/ibm/console/logon.jsp.

Todo o gerenciamento do WebSphere Application Server, exceto por iniciar e parar o servidor em si, pode ser feito a partir do console de administração da Web. É possível usar o IBM Rational Application Developer, o Eclipse ou vários outros ambientes de desenvolvimento integrados para criar aplicativos J2EE que possam executar no WebSphere Application Server. Para o Eclipse, use as Ferramentas Padrão J2EE, também conhecidas como J2EE versão Ferramentas do Desenvolvedor. Você também pode usar as imagens do IBM Rational Application Developer no catálogo IBM Cloud para aproveitar um ambiente pré-construído.

Para testá-lo no Rational Application Developer ou no Rational Software Architect, inicie um novo aplicativo corporativo no Eclipse usando o assistente de Projeto do Aplicativo EAR:


Figura 2. Assistente de Projeto do Aplicativo EAR do Eclipse

Chame o projeto CloudAPIClientEAR. Clique no botão Finish . A seguir, crie um projeto da web dinâmico; chame-o para CloudAPIClientWeb. Adicione o projeto da web dinâmico ao projeto CloudAPIClientEAR:


Figura 3. Assistente de projeto da web dinâmico do Eclipse

Agora vamos criar um arquivo HTML e um servlet para testar o aplicativo. Adicione um arquivo chamado index.html ao diretório de conteúdo da web com algum texto como "Meu aplicativo da Web". Ainda, adicione um servlet com código como a classe TestServlet:


Listagem 1. Adicionando um 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;

/**
 * Classe de implementação do Servlet 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");
     }
}

Se você usava o Rational Software Architect ou o Eclipse, seu arquivo web.xml do archive do aplicativo da web já deve estar configurado para você. Se não estiver, ele pode se parecer com isto:


Listagem 2. Seu archive do aplicativo da web deve se parecer com isto

<?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>

A seguir, exporte o arquivo. Clique como botão direito no projeto EAR e escolha Export to EAR. Atribua o nome de CloudAPIClientEAR.ear ao arquivo:


Figura 4. Assistente de Exportação EAR do Rational Software Architect

Para adicionar seu arquivo EAR do aplicativo corporativo:

  1. Acesse o console de administração do WebSphere no seu navegador.
  2. Navegue para Applications > New Application > New Enterprise Application e escolha Upload from Local file system. Carregue o arquivo EAR e clique em Next.
  3. Escolha a opção Fast Path .
  4. Escolha qualquer diretório para instalar o aplicativo.
  5. No painel Map Modules to Servers, selecione CloudAPIClientWeb.
  6. Salve as alterações.
  7. Acesse Applications > Application Types > WebSphere enterprise applications. Inicie o aplicativo.

Navegue para esta URL para visualizar a página HTML: http://host:9080/CloudAPIClientWeb/. Deve ser possível ver o texto "My web application" que você adicionou à página HTML acima. Para ver o servlet, insira este URL: http://host:9080/CloudAPIClientWeb/TestServlet. Deve ser possível ver o texto que você emitiu a partir de Writer no código TestServlet .

Implementar dessa maneira pode se tornar cansativo se você fizer isso mais de algumas maneiras. É possível economizar muito tempo usando os recursos de implementação remota no Eclipse ou IBM Rational Application Developer. Publicará automaticamente seu aplicativo J2EE para o servidor, em vez de exigir que você passe por todas as telas no console de administração do WebSphere. Use o assistente New Server para adicionar o servidor remoto, fornecendo o nome de host ou o endereço IP, o ID do usuário e senha de administração.

Agora vamos ver a configuração e usar o Apache Maven para facilitar a automação de criação.


Automação de criação com Maven

Para configurar o Apache Maven, faça o download do website do projeto e defina as variáveis de ambiente como mostrado.


Listagem 3. Definir as variáveis de ambiente do 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

É possível realizar a tarefa equivalente para o Linux®. Para verifique se o Maven está disponível, execute o seguinte comando:


Listagem 4. Verificar se o está disponível

>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, vendor: 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"

Você deve ver algo como as informações que aparecem depois do comando na Listagem 4.

No Maven, um arquétipo é um modelo para um projeto que inclui uma estrutura de projeto padrão que pode ser gerada. É bom saber disso; em nossos exemplos anteriores, você já tinha o próprio projeto criado no ambiente de desenvolvimento integrado e estava criando aplicativos da web e corporativos. Agora vamos ver como abordar isso e aprender um pouco mais sobre o Maven no processo.

No Maven, uma dependência, como uma biblioteca Java™ empacotada em um JAR, inclui pelo menos um groupId, um artifactId, uma versão e um scope. Para dependências de processo, o Maven procura no repositório local. Se a dependência não existir no repositório local, ela será transferido por download de um repositório externo para o repositório local. O repositório externo padrão está em http://repo1.maven.org/maven2/. É possível configurar seu próprio repositório remoto também, e a nuvem será um bom lugar para fazer isso.

Suponha que você tenha uma dependência em um arquivo JAR de terceiros. É possível adicioná-lo ao seu pom.xml com uma sub-rotina como:


Listagem 5. Adicionando uma dependência a um arquivo JAR de terceiros

<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.12</version>
  <scope>compile</scope>
</dependency>

Esse exemplo é para a biblioteca log4j.

Por questões de licenciamento, as bibliotecas J2EE e relacionadas não estão automaticamente disponíveis. Será preciso acessar o website relevante, concordar com os termos e condições e fazer o download dos arquivos JAR você mesmo. Então use este comando:


Listagem 6. Instalando as dependências de terceiros

> mvn install:install-file -Dfile=/opt/apache-tomcat70/lib/servlet-api.jar 
  -DgroupId=javax -DartifactId=servlet-api -Dversion=3.0 -Dpackaging=jar

Este exemplo são as APIs do servlet necessárias para compilar um projeto da web J2EE. Para criar um aplicativo da web com as estruturas de projeto padrão, digite o comando:


Listagem 7. Criar um aplicativo da web com o tipo de estrutura de projeto padrão

> mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes 
  -DarchetypeArtifactId=maven-archetype-webapp 
  -DgroupId=com.iotdata -DartifactId=my-webapp

O Maven cria a árvore do projeto no my-webapp do diretório, incluindo o arquivo pom.xml. Não vamos fazer isso; em vez disso, vamos usar o projeto que já foi criado na seção anterior. Adicione o arquivo pom.xml ao diretório superior do seu projeto de aplicativo da Web:


Listagem 8. Adicionando o arquivo pom.xml ao diretório superior do projeto de aplicativo da 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>

Observe que o pacote é um pacote WAR. O arquivo pom.xml usa o plug-in WAR do Maven que cria o pacote WAR. A estrutura do diretório é um pouco diferente da estrutura padrão, então adicione a identificação sourceDirectory , que é uma propriedade de build . Observe que foi usada a dependência para a API do servlet descrita anteriormente. O scope está configurado para provided de modo que não seja possível copiar o JAR da API do servlet para o aplicativo da Web.

Para construir isso, altere os diretórios para my-webapp e digite este comando:


Listagem 9. Iniciando a construção

> mvn package

É possível encontrar a saída no arquivo CloudAPIClientWeb.war no diretório de destino. Implemente isso no seu servidor de aplicativos, aponte o navegador para http://host:8080/CloudAPIClientWeb, e deverá ver uma página com o texto "Hello World!"

É possível gerenciar vários projetos de dentro de uma única estrutura de arquivos Maven usando vários arquivos pom.xml. Você desejará fazer isso por que o aplicativo da web será incluído em um aplicativo corporativo.

Crie um arquivo pom.xml como aquele mostrado na Listagem 10 acima dos diretórios CloudAPIClientEAR e CloudAPIClientWeb.


Listagem 10. Criando arquivos pom.xml adicionais para gerenciar projetos adicionais

<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>

Isso define módulos para cada um dos projetos CloudAPIClientweb e CloudAPIClientEAR.

A Listagem 11 mostra como criar um arquivo pom.xml para o projeto EAR:


Listagem 11. Criar um arquivo pom.xml para o projeto EAR

<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>

Esse arquivo pom.xml define um pai que faz referência ao pom.xml de nível superior. Também é preciso adicione essa sub-rotina ao pom.xml da Web. Desta vez o valor do pacote é ear e usa o plug-in de archive corporativo do Maven. Ele define o modelo da web a parti do projeto da web de antes.

Agora limpamos e reconstruímos todo o projeto com este comando:


Listagem 12. Limpar e reconstruir todo o projeto

> mvn clean install

O EAR é construído e inclui o arquivo WAR do aplicativo da Web.

É assim que se constrói uma criação que pode ser reproduzida. Isso é importante porque em ambientes de teste e produção, os desenvolvedores não têm permissão para conectarem-se ao servidor de aplicativos com seus ambientes de desenvolvimento integrados.

Agora vamos examinar como gerar um plug-in Maven que permite automatizar a criação e a implementação do servidor.


Plug-in Maven para automação de criação e implementação de servidor

Na seção Automação de criação com o Maven, descrevemos como trabalhar com o Maven para criar aplicativos J2EE. O Maven fornece uma estrutura extensível usando um mecanismo de plug-in.

Esta seção mostra como criar um plug-in Maven que procura ou cria uma máquina virtual na nuvem usando a API IBM SmartCloud:

  1. O plug-in primeiro tenta consultar a instância da máquina virtual.
  2. Se for encontrada, pode ser usada para fornecer o aplicativo J2EE.
  3. Caso contrário, uma nova máquina virtual é criada.

Para começar, gere um projeto de plug-in do Maven de amostra usando a linha de comando:


Listagem 13. Gerar o plug-in Maven

>mvn archetype:generate -DarchetypeArtifactId=maven-archetype-mojo 
 -DgroupId=com.ibm.cloud.enterprise.example 
 -DartifactId=sce-maven-plugin -DinteractiveMode=false

Isso cria uma árvore de diretório do projeto de plug-in com o tipo MOJO (Maven Old Java Object).

Importe o projeto para o ambiente de desenvolvimento integrado e adicione as bibliotecas de plug-in e núcleo do Maven ao seu caminho de criação do ambiente de desenvolvimento integrado. Os plug-ins Maven implementam a interface Mojo , normalmente estendendo a classe AbstractMojo . Adicione o código de origem para a classe SCEMojo :


Listagem 14. Adicionar código de origem para a classe 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;

}

O código já tem as importações para os métodos que serão adicionados abaixo. O JavaDoc no nível da classe tem uma identificação de @goal . Isso é obrigatório e indica o objetivo da criação, que é create_instance. Os campos privados user_name, password, name, data_center, image_id, key_name, was_admin_user e was_admin_password são parâmetros passados por usuários do plug-in. Os parâmetros são:

  • user_name:O nome de usuário para a conta de nuvem
  • password:A senha para a conta de nuvem
  • nome:O nome do servidor para consulta ou criação, valor padrão="app_server"
  • data_center:O datacenter no qual criar o servidor
  • image_id:O ID da imagem com o qual criar o servidor
  • key_name:O nome da chave SSH com o qual criar o servidor
  • was_admin_user:O nome do usuário administrativo do WebSphere
  • was_admin_password:O nome do usuário administrativo e senha do WebSphere

Classes implementando a interface Mojo devem implementar o método execute . Inclua o objeto execute :


Listagem 15. Adicionando o método 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());
     }
}

O método primeiro define as credenciais do usuário, então recupera uma lista de máquinas virtuais de propriedade do usuário. Ele itera sobre a lista de máquinas virtuais procurando uma instância ativa com o mesmo nome que o parâmetro fornecido pelo usuário.

Se uma máquina virtual for encontrada, está concluído. Caso contrário, é criada uma máquina virtual com o método createInstance() adicionando esse método à classe SCEMojo :


Listagem 16. Criando uma máquina virtual com createInstance() adicionando-a à classe SCEMojo

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, // Nome da instância
               data_center, // ID do datacenter
               image_id, // ID da imagem
               "COP32.1/2048/60", // Tipo de instância
               key_name, // Chave
               address, // Endereço
               volume, // Volume
               parameters, // Opções
               null, // ID VLAN
               secondaryAddresses, // Endereços IP secundários
               true); // Minimum ephemeral
     Instance instance = newInstances.get(0);
     log.info("ID: " + instance.getID());
}

O método cria a máquina virtual com os parâmetros fornecidos pelo usuário e grava o ID da instância ao log.

como mostrado na Listagem 17, agora crie um arquivo pom.xml para o plug-in:


Listagem 17. Criar um arquivo pom.xml para o plug-in

<?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>

O arquivo pom.xml usa um tipo de pacote maven-plugin . Ele define uma dependência maven-plugin-api e dependências da API IBM SmartCloud Enterprise Java e suas bibliotecas, Apache HTTP Client, Commons, Logging, Codec e Lang dependentes. As bibliotecas do Apache podem ser transferidas por download automaticamente pelo Maven a partir do repositório central do Maven.

Faça o download e instale a biblioteca de API SmartCloud no seu repositório local:


Listagem 18. Fazer o download da biblioteca de API SmartCloud para o repositório local

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

Agora, deve-se ajustar o parâmetro do arquivo para que seja consistente com o ambiente local.

A seguir, construa e instale o plug-in no repositório local:


Listagem 19. Construir e instalar o plug-in no repositório local

>mvn package
>mvn install

Agora é possível usar o plug-in para um projeto. Vamos gerar o aplicativo da nuvem de projeto com o comando generate do Maven:


Listagem 20. Gerar um projeto com o comando generate do Maven

mvn archetype:generate -DgroupId=com.ibm.cloud.enterprise 
 -DartifactId=cloud-app 
 -DarchetypeArtifactId=maven-archetype-quickstart 
 -DinteractiveMode=false

Importe o novo projeto para o seu ambiente de desenvolvimento integrado. Modifique o pom.xml gerado para adicionar uma configuração de plug-in e dependência:


Listagem 21. Modificar o pom.xml para adicionar configuração de plug-in e dependência

<?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>

Observe o uso dos parâmetros na seção configuration .

Agora você está pronto para testar o plug-in. Primeiro verifique com uma nova instância e uma instância existente; chame o plug-in com o objetivo do Maven mostrada abaixo.


Listagem 22. Chamar o plug-in

>mvn com.ibm.cloud.enterprise:sce-maven-plugin:1.0-SNAPSHOT:create_instance

Se você ainda não tem uma máquina virtual com o nome fornecido, deve ver uma saída como esta:


Listagem 23. Saída se você NÃO tem uma máquina virtual com o nome fornecido

[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] 
...

Se você já tem uma máquina virtual com o nome fornecido, deve ver uma saída como esta:


Listagem 24. Saída se você TEM uma máquina virtual com o nome fornecido

...
[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] ----------------------------------------------------------------------
...

Lembre-se de que se você executou recentemente o comando na Listagem 22 para criar um servidor, ele leva algum tempo para ser criado.

Até o momento neste artigo, essa foi uma boa maneira de ver como a nuvem pode se enquadrar no ciclo de vida de desenvolvimento e implementação, mas há mais algumas etapas para tornar esse processo ainda mais útil no ciclo de vida.

Demonstramos que leva algum tempo para criar um servidor. É preciso que o mecanismo de pesquisa espere isso ser concluído; entretanto, há um desafio adicional aqui, que é determinar quando o servidor de aplicativos em si foi ativado, o que será apenas após o fornecimento da máquina virtual e o sistema operacional ter iniciado. É possível usar as APIs wsadmin do WebSphere para isso. Quando houver um servidor ativo com o servidor de aplicativos executando, é possível implementar o nosso aplicativo J2EE nele. Quando tiver concluído o servidor WebSphere, é possível excluí-lo. Pode-se desejar adicionar isso à fase de limpeza do ciclo de vida ou em outro ponto.


Próximas etapas

Algumas outras tarefas que você pode desejar realizar ou incluir:

  • Criar um repositório Maven privado na IBM Cloud. Essa é uma tarefa importante, porque uma empresa normalmente deseja manter seus softwares não lançados, proprietários ou comprados comercialmente separados do software livre já lançado armazenado em repositórios públicos. Isso simplificará o compartilhamento de software dentro da empresa e com parceiros de negócio e o manterá isolado do público em geral.
  • Criar um modelo de projeto de API na nuvem. Um modelo de projeto é útil para simplificar a criação de vários projetos na nuvem, padronizar melhores práticas e eliminar a repetição.

Servidores de aplicativos J2EE têm vários recursos que ajudam a alcançar os objetivos de desempenho e disponibilidade. Um dos principais recursos é a habilidade de colocar servidores de aplicativos em cluster para carga distribuída. Um cluster é um grupo de nós de servidor de aplicativos ou servidores de aplicativos individuais que funciona como um grupo para balancear a carga de trabalho. Em computação em nuvem, existe a oportunidade de criar máquinas virtuais dinamicamente, e elas podem agir como nós no cluster.

O WebSphere Application Server é uma plataforma J2EE particularmente adequada para gerenciar clusters em grande escala. Todas as etapas que podem ser realizadas no console administrativo do WebSphere podem ser redigidas com comandos e ferramenta wsadmin, incluindo programas Java com os scripts Java Management eXtensions (JMX) e Jython. É possível combinar esse conhecimento do modelo de implementação de rede do WebSphere com o conhecimento da criação e personalização de imagens e o que você já aprendeu sobre a API REST do IBM SmartCloud Enterprise para automatizar o fornecimento de elementos de um cluster do WebSphere. Isso é feito da seguinte maneira:

  1. Inicie com uma imagem do WebSphere Application Server, então personalize o perfil com a Profile Management Tool e o servidor de aplicativos com o console administrativo.
  2. Salve a máquina virtual em uma instância com a interface com o usuário do IBM Cloud ou API REST.
  3. Use a API REST da IBM Cloud para fornecer novas máquinas virtuais.
  4. Use a ferramenta wsadmin para unir as máquinas virtuais ao cluster e sincronizar a implementação do aplicativo através dos nós, incluindo a implementação do seu aplicativo J2EE.

Conclusão

Este artigo apresentou uma amostra do projeto J2EE para você usar na IBM Cloud; uma imagem do WebSphere Application Server que fornece um ambiente J2EE sem precisar instalar nenhum software adicional. Descreveu as etapas para configurar o Apache Maven no seu ambiente e começar com a automação de criação. Descrevemos como trabalhar com o Maven para construir aplicativos J2EE. Foi mostrado como criar um plug-in Maven que procura ou cria uma máquina virtual na nuvem usando a API IBM SmartCloud. E, como um bônus, apresentamos o caminho para algumas outras tarefas similares que você pode desejar realizar, incluindo como criar um repositório Maven privado na IBM Cloud e como construir um modelo de projeto da API na nuvem.

O único ponto que faltou você fazer é experimentar.


Recursos

Aprender

Obter produtos e tecnologias

Discutir

Sobre os autores

Alex Amies photo

Alex Amies é engenheiro de software senior no Laboratório de Desenvolvimento IBM GTS no laboratório de desenvolvimento da China. Ele é atualmente arquiteto e trabalha no design do Desenvolvimento e Teste de Negócios Inteligentes IBM na Nuvem IBM. Anteriormente, ele atuou como arquiteto e desenvolvedor de produtos de nuvem e de segurança em outros grupos na IBM.

Pan Xia Zou é engenheiro de software contratado na IBM e trabalha como arquiteto de automação de criação e implementação para o IBM SmartCloud Enterprise.

Yi Shuai Wang é arquiteto consultivo da IBM e desenvolvedor líder para o desenvolvimento de serviços de suporte de negócios do IBM SmartCloud Enterprise.

Ajuda para Relatar Abuso

Relatar abuso

Obrigado. Esta entrada foi sinalizada para atenção do moderador.


Ajuda para Relatar Abuso

Relatar abuso

Falha no envio do Relatório de abuso. Tente novamente mais tarde.


developerWorks: Registre-se


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos de uso do developerWorks.

 


Na primeira vez que você efetua sign in no developerWorks, um perfil é criado para você. Informações selecionadas do seu perfil developerWorks são exibidas ao público, mas você pode editá-las a qualquer momento. Seu primeiro nome, sobrenome (a menos que escolha ocultá-los), e seu nome de exibição acompanharão o conteúdo que postar.

Selecione seu nome de exibição

Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

(Deve possuir de 3 a 31 caracteres.)


Ao clicar em Enviar, você concorda com os termos de uso do developerWorks.

 


Classificar este artigo

Comentários

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Industries, Tecnologia Java, Software livre
ArticleID=774378
ArticleTitle=Automatizar o desenvolvimento e o gerenciamento de máquinas virtuais na nuvem
publish-date=11172011

Conheça a IBM da sua cidade

Virtual Branch Office Brasil

A IBM está mais perto do que você imagina!


Tags

Help
Use o campo de pesquisa para encontrar todos os tipos de conteúdo no My developerWorks com essa tag.

Use a barra de rolagem para ver mais ou menos tags.

Tags populares mostra as principais tags para esta zona de conteúdo em particular (por exemplo, Java technology, Linux, WebSphere).

Minhas tags mostra suas tags para esta zona de conteúdo em particular (por exemplo, Java technology, Linux, WebSphere).

Use o campo de pesquisa para localizar todos os tipos de conteúdo no Meu developerWorks com essa tag. Tags populares mostra as tags principais para essa zona de conteúdo particular (por exemplo, tecnologia Java, Linux, WebSphere). My tags shows your tags for this particular content zone (for example, Java technology, Linux, WebSphere). Minhas tags mostra as suas tags para essa zona de conteúdo em particular (por exemplo, tecnologia Java, Linux, WebSphere).