안녕하세요 이정운 입니다.
이번 강좌에서는 조금 더 개발 입장으로 들어가 개발시에 많이 사용하시는 Maven 을 이용해서 애플리케이션 개발을 위한 Open Liberty 서버 연동에 대한 부분을 한번 살펴보도록 하겠습니다. 또한, 해당 부분은 향후 자동화나 이런 부분에서도 많이 사용하시니 참고해두시면 좋을듯 합니다.
Building a web application with Maven
https://openliberty.io/guides/maven-intro.html
본 강좌는 상단의 링크에서 제공하는 가이드를 기반으로 테스트하고 작성하였습니다.
(이번 강좌에서는 기본적으로 maven 과 git 은 설치되어 있다는 가정을 하고 강좌를 진행하도록 하겠습니다.)
#1) Maven 을 이용한 Open Liberty 서버 연동
우선 빠르고 간편한 시작을 위해서 어느정도 형태가 작성되어 있는 가이드 샘플을 github 에서 다운로드 받습니다.
git clone https://github.com/openliberty/guide-maven-intro.git
cd guide-maven-intro/start
다운로드된 소스를 보시면 아시겠지만 간단한 웹 애플리케이션을 위한 기본 구조를 가지고 있으며 샘플 소스가 포함되어 있습니다.
특히, /src/main/liberty/config 폴더를 확인해보시면 하단과 같이 Open Liberty 를 위한 서버 설정 파일인 server.xml 이 포함되어 있는 것을 확인하실 수 있습니다.
(해당 파일은 향후에 maven 컴파일과 빌드시에 애플리케이션과 Open Liberty 가 같이 빌드되는데 이때, Open Libety 의 서버 설정으로 사용됩니다.)
참고로 윈도우즈에서 테스트 하는 경우라면 반드시 server.xml 파일을 열어서 주석을 "<!---, --->" 에서 "<!--, -->" 로 변경해주셔야 maven 컴파일시에 오류가 발생되지 않습니다. 또한, maven 에서 지정된 설정으로 동적으로 server.xml 설정을 변경하시려면 하단과 같이 변수로 설정을 입력해 놓으시면 됩니다.
<server description="Sample Servlet server">
<featureManager>
<feature>servlet-3.1</feature>
</featureManager>
<httpEndpoint httpPort="${default.http.port}" httpsPort="${default.https.port}" id="defaultHttpEndpoint" host="*" />
<webApplication id="${app.context.root}" location="${app.context.root}.war" name="${app.context.root}"/>
</server>
기본 구조를 확인했으면 이제 본격적으로 maven 을 위한 기본 pom.xml 파일을 작성해보도록 하겠습니다. (pom.xml 에 대한 상세한 설명은 상단의 링크를 참고하시기 바라며 여기서는 Maven 강좌가 아니니 간단히만 설명드리겠습니다.)
<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.0http://maven.apache.org/maven-v4_0_0.xsd">;
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>net.wasdev.wlp.maven.parent</groupId>
<artifactId>liberty-maven-app-parent</artifactId>
<version>2.0</version>
</parent>
<!-- Add the rest of the POM below here. -->
</project>
기본 pom.xml 형식 에다 애플리케이션의 이름과 설명이 들어간 프로젝트 코디네이트 정보를 추가 합니다.
<groupId>io.openliberty.guides</groupId>
<artifactId>ServletSample</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
그리고 프로젝트에서 사용할 프로퍼티 정보를 하단과 같이 추가 합니다. 간략히만 설명드리면 Java 의 버전과(1.8) 인코딩 형식(UTF-8) 등에 대한 정보를 지정하며 이 설정을 가지고 실제 Maven 이 애플리케이션에 대한 컴파일을 수행할 것입니다.
이외에 Maven 에서 사용할 프로퍼티 정보가 더 있다고 보시면 됩니다. (예를 들어 Open Liberty 에서 사용할 포트정보)
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<app.name>${project.artifactId}</app.name>
<testServerHttpPort>9080</testServerHttpPort>
<testServerHttpsPort>9443</testServerHttpsPort>
<warContext>${app.name}</warContext>
<package.file>${project.build.directory}/${app.name}.zip</package.file>
<packaging.type>usr</packaging.type>
</properties>
다음으로 샘플 애플리케이션이 기본적으로 Servlet 을 사용할 거라 하단과 같은 dependency 를 추가합니다.
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
마지막으로 이 프로젝트를 빌드와 관련된 maven 플러그인 설정을 추가합니다.
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<packagingExcludes>pom.xml</packagingExcludes>
</configuration>
</plugin>
<plugin>
<groupId>net.wasdev.wlp.maven.plugins</groupId>
<artifactId>liberty-maven-plugin</artifactId>
<version>2.0</version>
<configuration>
<assemblyArtifact>
<groupId>io.openliberty</groupId>
<artifactId>openliberty-runtime</artifactId>
<version>17.0.0.3</version>
<type>zip</type>
</assemblyArtifact>
<serverName>${project.artifactId}Server</serverName>
<stripVersion>true</stripVersion>
<configFile>src/main/liberty/config/server.xml</configFile>
<packageFile>${package.file}</packageFile>
<include>${packaging.type}</include>
<bootstrapProperties>
<default.http.port>${testServerHttpPort}</default.http.port>
<default.https.port>${testServerHttpsPort}</default.https.port>
<app.context.root>${warContext}</app.context.root>
</bootstrapProperties>
</configuration>
<executions>
<execution>
<id>package-server</id>
<phase>package</phase>
<goals>
<goal>package-server</goal>
</goals>
<configuration>
<outputDirectory>target/wlp-package</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
여기까지 잘 따라오셨다면 기본적인 pom.xml 파일 작성이 완료된 것이며 하단과 같이 'mvn install' 을 수행합니다. 즉, maven 을 이용해서 pom.xml 에 지정된 형태로 컴파일과 빌드를 수행합니다.
mvn install
문제가 없이 정상적으로 수행이 완료되면 target 폴더에 하단과 같은 디렉토리 구조를 확인할 수 있습니다. (참고로 liberty 폴더에 Open Liberty 서버가 설치된 형태로 구성됩니다.)
그러면 이제 maven 명령을 이용해서 설치된 Open Liberty 서버를 구동해서 실제 서비스를 수행하기 위하여 "mvn liberty:start-server" 를 수행합니다.
이제 웹브라우저를 통해서 'http://localhost:9080/ServletSample/' 로 접속해보면 하단과 같이 샘플 Servlet 에 대한 결과를 확인 가능합니다.
참고적으로 Open Liberty 서버에 대한 변경없이 구동중인 상태에서 애플리케이션만 재배포 및 결과를 확인하고 싶으시다면 "mvn package" 명령을 사용하시면 됩니다. 또한, "mvn liberty:stop-server" 명령을 통해서 Open Liberty 서버에 대한 중지가 가능하며 그외의 다양한 liberty-maven-plugin 의 다양한 goal 은 하단의 링크를 통해서 확인해보시기 바라겠습니다.
ci.maven
https://github.com/WASdev/ci.maven
추가로 target/liberty/wlp/usr/servers/ServletSampleServer 폴더에 보시면 기존에 설명했던 server.xml 이외에 하단과 같은 형태의 bootstrap.properties 파일이 추가된 것을 확인할 수 있습니다. 보시면 아시겠지만 maven 에서 사용했던 변수들이며 이 설정을 이용해서 server.xml 의 변수를 치환해서 구동하는 형태입니다. (JVM 관련 옵션을 추가하시려면 jvm.options 파일을 추가해서 넣으면 됩니다.)
# Generated by liberty-maven-plugin
app.context.root=ServletSample
default.http.port=9080
default.https.port=9443
#2) Maven 에 JUnit 을 통한 Test 단계 추가
기존에는 maven 을 통해서 컴파일과 빌드만 수행했는데 요즘은 대부분 JUnit 을 통한 Test 단계를 기본적으로 수행하는 경우가 많습니다. 그래서 해당 부분에 대한 부분도 간단히 테스트해서 공유드리겠습니다.
우선 당연하겠지만 Test 를 위한 소스를 하단과 같이 작성합니다.
package io.openliberty.guides.hello.it;
import static org.junit.Assert.*;
import org.junit.BeforeClass;
import org.junit.Test;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
public class EndpointIT {
private static String URL;
@BeforeClass
public static void init() {
String port = System.getProperty("liberty.test.port");
String war = System.getProperty("war.name");
URL = "http://localhost:"; + port + "/" + war + "/" + "servlet";
}
@Test
public void testServlet() throws Exception {
HttpClient client = new HttpClient();
GetMethod method = new GetMethod(URL);
try {
int statusCode = client.executeMethod(method);
assertEquals("HTTP GET failed", HttpStatus.SC_OK, statusCode);
String response = method.getResponseBodyAsString(1000);
assertTrue("Unexpected response body", response.contains("Hello! How are you today?"));
} finally {
method.releaseConnection();
}
}
}
기본적으로 Test 를 위한 소스의 구조는 하단처럼 작성되면 되며 기존 프로젝트에 test 폴더가 추가된 형태입니다. 지금 작성된 소스는 "src/test/java/io/openliberty/guides/hello/it/EndpointIT.java" 여기에 두시면 됩니다.
그리고 기존 pom.xml 에 test 수행을 위한 maven 플러그인을 추가합니다.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.19.1</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
<configuration>
<includes>
<include>**/it/**</include>
</includes>
<systemPropertyVariables>
<liberty.test.port>${testServerHttpPort}</liberty.test.port>
<war.name>${warContext}</war.name>
</systemPropertyVariables>
</configuration>
</execution>
</executions>
</plugin>
마지막으로 실제 test 시에 사용되는 JUnit 과 같은 라이브러리에 대한 dependency 를 추가 합니다.
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
이제 이전 파트와 동일하게 mvn install 해보시면 하단과 같이 중간에 테스트 단계까지 거치는 것을 확인 가능하십니다.
그럼 이번 강좌는 여기서 마무리 하는 것으로 하겠습니다. 휘리릭~~~
'IBM - old > WAS Liberty 강좌' 카테고리의 다른 글
[Open]02.Eclipse 개발을 위한 Open Liberty 서버 플러그인 설치 및 테스트 (0) | 2017.10.14 |
---|---|
[Open]01.Open Liberty 설치 및 간단한 테스트 (0) | 2017.10.14 |
[Liberty]IBM WAS Liberty 의 PoT 자료 오픈 (0) | 2017.05.18 |
Monitoring and Analytics with IBM WAS Liberty (0) | 2016.12.14 |
Docker 를 이용한 IBM WAS Liberty 서버 활용하기 2/2 (0) | 2016.07.11 |
댓글