sábado, 4 de febrero de 2017

Desplegar en Weblogic con Maven

Para permitir el despliegue en Weblogic con Maven, es necesario instalar el plugin de Oracle.
La instalación debe hacerse desde la consola de Maven, en una instalación stand-alone de Maven se accede a la consola, y si se usa el Maven integrado en el Eclipse, se puede hacer a través del IDE.
En ésta entrada se mostrará a través de Eclipse.

(NOTA: Si no tiene experiencia con Maven, es recomendable realizar éste tutorial después de haber terminado el tutorial Hola Mundo de Spring para estar familiarizado con los conceptos del POM.)

Ubicar la librería

Ubicar la librería: oracle-maven-sync-12.2.1.jar en su directorio de instalación de Weblogic 12c Local, por ejemplo:
C:\Oracle\Middleware122100\Oracle_Home\oracle_common\plugins\maven\com\oracle\maven\oracle-maven-sync\12.2.1

Crear un proyecto dummy en Eclipse

Crear un proyecto Dummy de Maven, sin arquetipos llamado Lib:
En Eclipse New --> Maven Project

Una vez creado el proyecto, ir a la ubicación del proyecto y copiar los dos archivos de la librería desde C:\Oracle\Middleware122100\Oracle_Home\oracle_common\plugins\maven\com\oracle\maven\oracle-maven-sync\12.2.1 a la ruta raíz del proyecto Lib.

Instalar la librería

Ejecutar desde Eclipse el siguiente comando de Maven:
Menu Run --> Run Configurations

Sobre Maven Build --> New:

Aparece:

Asignar un nombre como: Install_WeblogicSync
Con el botón Workspace, seleccionar el proyecto dummy Lib creado.

Finalmente en el campo Goals pegar el comando:
install:install-file -DpomFile="oracle-maven-sync-12.2.1.pom" -Dfile="oracle-maven-sync-12.2.1.jar"


--> Apply --> Run...
Esta debería ser la salida de la consola indicando que la instalación se hizo satisfactoriamente:
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building Lib 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-install-plugin:2.4:install-file (default-cli) @ Lib ---
[INFO] Installing C:\eclipse_work\workspace\Lib\oracle-maven-sync-12.2.1.jar to C:\Users\Marìa juliana\.m2\repository\com\oracle\maven\oracle-maven-sync\12.2.1-0-0\oracle-maven-sync-12.2.1-0-0.jar
[INFO] Installing C:\eclipse_work\workspace\Lib\oracle-maven-sync-12.2.1.pom to C:\Users\Marìa juliana\.m2\repository\com\oracle\maven\oracle-maven-sync\12.2.1-0-0\oracle-maven-sync-12.2.1-0-0.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.845 s
[INFO] Finished at: 2016-09-24T21:02:36-05:00
[INFO] Final Memory: 6M/155M
[INFO] ------------------------------------------------------------------------

Para verificar la instalación se puede ejecutar el siguiente comando repitiendo los pasos anteriores:
help:describe -Dplugin="com.oracle.maven:oracle-maven-sync" -Ddetail

El resultado final debería ser similar a:
To override the localRepository target used by the plugin, you can specify
    the following option on the command-line:
    -Dmaven.local.repo=/alternate/path/to/repository
    
    To supply an alternate settings.xml for purposes of this operation, use the
    --settings option. For example:
    
     mvn --settings /alternate/path/settings.xml ... 
    ...or in your POM like this:
     
         com.oracle.maven
         oracle-maven-sync
         12.2.1-0-0
         
           /home/mark/Oracle/Middleware
           false
         
        

For more information, run 'mvn help:describe [...] -Ddetail'

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9.992 s
[INFO] Finished at: 2016-09-24T21:07:09-05:00
[INFO] Final Memory: 11M/133M
[INFO] ------------------------------------------------------------------------



Iniciar sincronización con Oracle

De la misma manera que los comandos anteriores, desde eclipse, ejecutar el comando Maven de Sincronización, donde se usa el comando push para la instalación del repositorio local del plugin.
El parámetro DoracleHome especifica la ruta de instalación de su Weblogic:

C:\Oracle\Middleware122100\Oracle_Home
com.oracle.maven:oracle-maven-sync:push -DoracleHome=C:\Oracle\Middleware122100\Oracle_Home

--> Apply --> Run...
Este proceso puede tardar un poco porque sincroniza el repositorio local de Maven (.m2) con el repositorio de Oracle. La salida deberá ser similar a:
SUMMARY
[INFO] ------------------------------------------------------------------------
[INFO] PUSH SUMMARY - ARTIFACTS PROCESSED SUCCESSFULLY
[INFO] ------------------------------------------------------------------------
[INFO] Number of artifacts pushed: 4540
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] PUSH SUMMARY - ERRORS ENCOUNTERED
[INFO] ------------------------------------------------------------------------
[INFO] No issues encountered.
[INFO] 
[INFO] IMPORTANT NOTE
[INFO] This operation may have added/updated archetypes in your repository.
[INFO] To update your archetype catalog, you should run:
[INFO] 'mvn archetype:crawl -Dcatalog=$HOME/.m2/archetype-catalog.xml'
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 10:24 min
[INFO] Finished at: 2016-09-24T21:26:26-05:00
[INFO] Final Memory: 11M/89M
[INFO] ------------------------------------------------------------------------

Como indica la salida del paso anterior, ([INFO] To update your archetype catalog, you should run: [INFO] 'mvn archetype:crawl -Dcatalog=$HOME/.m2/archetype-catalog.xml')se debe ahora realizar la actualización del catálogo local con el siguiente comando siguiendo nuevamente los mismos pasos:
archetype:crawl -Dcatalog=C:/Users/[su_usuario]/.m2/archetype-catalog.xml

Donde se debe especificar la ubicación del directorio .m2 local.

--> Apply --> Run...

La salida deberá ser similar a:
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 26.524 s
[INFO] Finished at: 2016-09-24T21:35:17-05:00
[INFO] Final Memory: 11M/223M
[INFO] ------------------------------------------------------------------------



Modificar /.m2/settings.xml


Se debe agregar el plugin group a /.m2/settings.xml​:
Abrir el archivo /.m2/settings.xml​, ubicar las etiquetas <pluginGroups> y adicionar:
<pluginGroups>
    <!-- pluginGroup
     | Specifies a further group identifier to use for plugin lookup.
    <pluginGroup>com.your.plugins</pluginGroup>
    -->
 <pluginGroup>com.oracle.weblogic</pluginGroup>
  </pluginGroups>


Uso del plugin



Para usar el plugin desde Eclipse existen dos formas, apoyándose en el POM.xml y con parámetros desde comandos. En este ejemplo para mostrar las dos formas se configurará el DEPLOY desde POM, y el UNDEPLOY desde comandos.

Uso con POM.XML
Si existe la etiqueta: <pluginManagement> dentro de la etiqueta <build> eliminarla.

Adicionar en la lista de plugins, la configuración del plugin weblogic-maven-pluginDonde se especifica, servidor Weblogic, usuario y contraseña, fuente, destino, etc. En éste ejemplo para no repetir el nombre del war se ha creado la variable DName en la etiqueta de propiedades, de manera similar a como se usa para manejar versiones:
<properties>
        <java.version>1.8</java.version>
        <DName>SpringRest01</DName>
  </properties>
El fragmento del plugin dentro de la lista de plugins de la etiqueta build quedará similar a:
   <!-- Oracle Weblogic -->
   <plugin>
        <groupId>com.oracle.weblogic</groupId> 
        <artifactId>weblogic-maven-plugin</artifactId> 
        <version>12.2.1-0-0</version>
        <executions>         
          <!--Deploy the application to the server-->
          <execution>
            <id>wls-deploy</id>
            <phase>pre-integration-test</phase> 
            <goals> 
              <goal>deploy</goal>
            </goals>
            <configuration> 
              <!--The admin URL where the app is deployed. Here use the plugin's default value t3://localhost:7001-->
              <!--adminurl>http://localhost:7001</adminurl-->
              <user>weblogic</user> 
              <password>weblogic1</password>
              <!--The location of the file or directory to be deployed-->
              <source>${project.build.directory}/${DName}.${project.packaging}</source>
              <!--The target servers where the application is deployed. Here use the plugin's default value AdminServer-->
              <targets>ClusterHome</targets>
              <verbose>true</verbose> 
              <!--The deployment name of the application-->
              <name>${DName}</name>
            </configuration>             
          </execution> 
        </executions>
    </plugin>


Donde se especifica: El GAV del plugin y los detalles de la ejecución para el goal deploy
Allí se especifica servidor, usuario y contraseña. Además la fuente que para el caso usa la variable DName creada, y referencia a project.build.directory que es el directorio target del proyecto, y define la extensión con project.packaging que para el caso es WAR según como se definió en el POM <packaging>war</packaging>.

Adicionar la etiqueta distributionManagement que especifica la URL del repositorio local de Maven, es decir el directorio .m2.
<!-- distribution -->
  <distributionManagement>
   <repository>
    <uniqueVersion>false</uniqueVersion>
     <id>WLIntegr</id>
     <name>WLS Integrate</name>
    <url>file:///C:/Users/SU_USUARIO/.m2/repository/</url> 
        <layout>default</layout>
   </repository>
  </distributionManagement>
Para éste ejemplo el POM.XML completo queda similar a:
<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>spring.io.guide01 </groupId>
  <artifactId>spring.io.guide01 </artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  <packaging>war</packaging>
  
  <dependencies>
    <!-- Spring MVC -->
  <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.3.2.RELEASE</version>
  </dependency>
  
  <!-- Jackson Core (Conver to JSON) -->
  <dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.5.3</version>
  </dependency>
  
  <!-- Servlet -->
  <dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>javax.servlet-api</artifactId>
   <version>3.1.0</version>
  </dependency>  
  </dependencies>
  
  <properties>
        <java.version>1.8</java.version>
        <DName>SpringRest01</DName>
  </properties>
  
  <!-- distribution -->
  <distributionManagement>
   <repository>
    <uniqueVersion>false</uniqueVersion>
     <id>WLIntegr</id>
     <name>WLS Integrate</name>
    <url>file:///C:/Users/SU_USUARIO/.m2/repository/</url> 
        <layout>default</layout>
   </repository>
  </distributionManagement>
    
  <build>   
    <plugins>
    
    <!-- MavenCompiler  -->
    <plugin>
            <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.5.1</version>
      <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
                
    <!-- WAR config  -->
  <plugin>
   <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-war-plugin</artifactId>
      <version>2.4</version>
   <configuration>
    <warSourceDirectory>src/main/webapp</warSourceDirectory>
    <warName>${DName}</warName>
    <failOnMissingWebXml>false</failOnMissingWebXml>
   </configuration>
  </plugin>
  
  <!-- Oracle Weblogic -->
  <plugin>
        <groupId>com.oracle.weblogic</groupId> 
        <artifactId>weblogic-maven-plugin</artifactId> 
        <version>12.2.1-0-0</version>
        <executions>         
          <!--Deploy the application to the server-->
          <execution>
            <id>wls-deploy</id>
            <phase>pre-integration-test</phase> 
            <goals> 
              <goal>deploy</goal>
            </goals>
            <configuration> 
              <!--The admin URL where the app is deployed. Here use the plugin's default value t3://localhost:7001-->
              <!--adminurl>http://localhost:7001</adminurl-->
              <user>weblogic</user> 
              <password>weblogic1</password>
              <!--The location of the file or directory to be deployed-->
              <source>${project.build.directory}/${DName}.${project.packaging}</source>
              <!--The target servers where the application is deployed. Here use the plugin's default value AdminServer-->
              <targets>ClusterHome</targets>
              <verbose>true</verbose> 
              <!--The deployment name of the application-->
              <name>${DName}</name>
            </configuration>             
          </execution> 
        </executions>
      </plugin>
    
     </plugins>
  </build>
  
</project>
Se debe actualizar el proyecto Maven (ALT  + F5) para que tome los cambios en el POM.XML

Ejecutar el despliegue
Como se ha visto anteriormente se hará la ejecución vía Run --> Run Configurations
  • Name: Deploy
  • Base Directory: En Workspace seleccionar el proyecto.
  • Goals: compile package deploy


Apply --> RunLa consola deberá tener una salida similar a:
…
…
[INFO] --- weblogic-maven-plugin:12.2.1-0-0:deploy (wls-deploy) @ spring.io.guide01.noBoot ---
[INFO] Command flags are: -noexit -deploy -username weblogic -password ******* -name SpringRest01 -source C:\eclipse_work\workspace\spring.io.guide01.noBoot\target\SpringRest01.war -targets ClusterHome -verbose -adminurl t3://localhost:7001
weblogic.Deployer invoked with options:  -noexit -deploy -username weblogic -name SpringRest01 -source C:\eclipse_work\workspace\spring.io.guide01.noBoot\target\SpringRest01.war -targets ClusterHome -verbose -adminurl t3://localhost:7001
<25 10:33:28="" am="" cot="">     
Task 42 initiated: [Deployer:149026]deploy application SpringRest01 on ClusterHome.
Task 42 completed: [Deployer:149026]deploy application SpringRest01 on ClusterHome.
Target state: deploy completed on Cluster ClusterHome

Target Assignments:
+ SpringRest01  ClusterHome
[INFO] 
[INFO] --- maven-install-plugin:2.4:install (default-install) @ spring.io.guide01.noBoot ---
[INFO] Installing 
…
…
[INFO] 
[INFO] --- maven-deploy-plugin:2.7:deploy (default-deploy) @ spring.io.guide01.noBoot ---
[INFO] Downloading: file:///C:/Users/USER/.m2/repository/spring/io/guide01/noBoot/spring.io.guide01.noBoot/0.0.1-SNAPSHOT/maven-metadata.xml
…
… file:///C:/Users/USER/.m2/repository/spring/io/guide01/noBoot/spring.io.guide01.noBoot/maven-metadata.xml (308 B at 75.2 KB/sec)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 33.521 s
[INFO] Finished at: 2016-09-25T10:33:44-05:00
[INFO] Final Memory: 31M/462M
[INFO] ------------------------------------------------------------------------
Y el despliegue se deberá ver reflejado en la lista de despliegues de Weblogic en el destino seleccionado, por ejemplo:


Uso con comandos
Como ya se tiene definida la variable DName en las propiedades del POM, se pueda hacer uso de la misma en los comandos.
Para hacer el unDeploy, se debe construir el comando especificando PLUGIN:GOAL + PARAMETROS. Para el ejemplo queda de la siguiente manera:
com.oracle.weblogic:weblogic-maven-plugin:undeploy -Duser=weblogic -Dpassword=weblogic1 -Dname=${DName}  -Dadminurl=http://localhost:7101


Donde se ha especificado:
  • Usuario: -Duser=weblogic
  • Contraseña -Dpassword=weblogic1
  • Nombre del despliegue a eliminar: -Dname=${DName}

Ejecutar nuevamente desde Run à Run Configurations:
  • Name: undeploy
  • Base Directory: En Workspace seleccionar el proyecto.
  • Goals: El comando indicado.



Apply --> RunLa consola deberá tener una salida similar a:
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building spring.io.guide01.noBoot 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- weblogic-maven-plugin:12.2.1-0-0:undeploy (default-cli) @ spring.io.guide01.noBoot ---
weblogic.Deployer invoked with options:  -noexit -undeploy -username weblogic -name SpringRest01 -adminurl t3://localhost:7001
<25 11:01:39="" am="" cot="">     
Task 43 initiated: [Deployer:149026]remove application SpringRest01 on ClusterHome.
Task 43 completed: [Deployer:149026]remove application SpringRest01 on ClusterHome.
Target state: undeploy completed on Cluster ClusterHome

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 18.207 s
[INFO] Finished at: 2016-09-25T11:01:42-05:00
[INFO] Final Memory: 30M/442M
[INFO] ------------------------------------------------------------------------


Referencias