메이븐다운(?) 방법으로 웹어플리케이션을 원격서버로 전송하기 위해서 이것저것 찾아보다가 알게 된 거 정리해본다.

1. deploy:deploy
packaging한 artifacts를 리모트의 메이븐저장소로 전송한다. 원격 저장소는  <distributionManagement>엘리먼트의 <repository>에 설정한다. 임의의 파일을 전송하는 건 불가능하다. package 가 war 이고 저장소 경로가 ftp://repository.mycompany.com/repository 라면, 실제로 war 파일은 저장소 layout에 맞춰서 ~/repository/groupId/artifactId/version 디렉토리에 전송된다.

2. site:deploy
 site phase에서 생성된 사이트를 리모트 (웹)서버로 전송한다. 리모트 서버정보는<distributionManagement>엘리먼트의 <site>에 설정한다. inputDirectory 옵션을 통해 target/site 디렉토리가 아닌 다른 디렉토리의 파일들을 전송할 수 있다. 그러나 <site>는 하나만 설정가능하기 때문에 2군데 이상의 서버로 파일들을 전송하는 건 불가능하다.

3. cargo 플러그인
일부 컨테이너에 대해 remote container에 expanded war(war 파일의 압축을 풀어놓은 것. exploded war)를 배포할 수 있다고 cargo 웹사이트에 나온다. 하지만 과연 이게 가능할지는 의구심이 든다. 실제로 작동여부를 테스트해봐야 할 듯하지만, 아마도 war 파일만 원격배포가 가능하지 않을까 싶다. 아직 최신 버전의 상용 WAS에 대한 지원이 미비하다.

4. myfaces의 wagon-maven 플러그인 
임의의 디렉토리 내의 파일들을 원격 서버로 전송한다. 임의의 디렉토리를 2군데 이상의 원격서버에 전송할 수 있다. 실제 프로젝트에서 개발서버 배포를 이 플러그인으로 처리했다. target/webapp 디렉토리의 파일들은 WAS서버로 전송하고, target/htdocs 디렉토리의 파일들은 WEB서버로 전송하도록 말이다. 
아쉽다면, 지정된 디렉토리 내의 모든 파일들을 전송하며 그 디렉토리의 몇몇 파일들만 골라서 전송할 수는 없다는 것이다. 즉 fileset 개념이 없다(사실 이건 이 플러그인의 문제라기 보다 이 플러그인이 이용하는 메이븐 wagon의 문제이다. 몇몇파일만 골라내는 건 ant copy를 써서 target/htdocs처럼 별도의 디렉토리에 전송할 대상만 따로 모아놓으면 해결할 수 있다).
이 플러그인의 장점이라면 디렉토리를 압축하여 전송후 리모트에서 압축을 해제하는 방식의 wagon 기능을 이용하기 때문에 전송할 파일이 많은 경우에 ant의 ftp/scp 타스크를 이용하는 것보다 전송시간이 현저히 줄어든다는 거.
아래는 실제 pom.xml의 일부인데 별거 아닌게 내용이 긴거 같아 맘이 편하지만은 않다.

   <plugin>
    <groupId>org.apache.myfaces.buildtools</groupId>
    <artifactId>myfaces-wagon-plugin</artifactId>
    <version>1.0.0</version>
    <executions>
     <!-- config 배포 작업 -->
     <execution>
      <id>deploy-conf</id>
      <phase>pre-integration-test</phase>
      <goals>
       <goal>deploy</goal>
      </goals>
      <configuration>
       <id>deploy-config</id>
       <url>
        scp://${wasserver.username}:${wasserver.password}@${wasserver.ip}:${wasserver.config.dir}
       </url>
       <inputDirectory>${config.home.dir}</inputDirectory>
      </configuration>
     </execution>
     <!-- 웹어플리케이션 배포 작업 -->
     <execution>
      <id>deploy-web</id>
      <phase>pre-integration-test</phase>
      <goals>
       <goal>deploy</goal>
      </goals>
      <configuration>
       <id>deploy-web</id>
       <url>
        scp://${wasserver.username}:${wasserver.password}@${wasserver.ip}:${wasserver.web.dir}
       </url>
       <inputDirectory>${web.output.exploded.dir}</inputDirectory>
      </configuration>
     </execution>
     <!-- 웹파일 배포 작업 -->
     <execution>
      <id>deploy-html</id>
      <phase>pre-integration-test</phase>
      <goals>
       <goal>deploy</goal>
      </goals>
      <configuration>
       <id>deploy-html</id>
       <url>
        scp://${webserver.username}:${webserver.password}@${webserver.ip}:${webserver.htdocs.dir}
       </url>
       <inputDirectory>${web.output.html.dir}</inputDirectory>
      </configuration>
     </execution>
    </executions>
   </plugin>


현재까지 패턴을 적용하여 임의의 파일/디렉토리를 내 맘대로 전송할 수 있는 방법은 메이븐에서는 antrun을 이용하는 방법밖에 없는 듯싶다. maven의 wagon api와 file management api 이용하여 직접 플러그인을 만드는 것도 재밌을거 같다.

Posted by 에코지오
,

mvn site 명령을 날리면 site phase 발생전에 compile phase가 먼저 실행되어 황당할 때가 있다.
원래 site 단계는 compile 단계의 실행을 필요로 하지 않는다.

FindBugs 플러그인를 사용할 때 이런 일이 발생하는데, 소스를 분석하기 위해 compile 단계를 실행하는 것 같다.

   <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>findbugs-maven-plugin</artifactId>
    <version>1.2</version>
   </plugin>
Posted by 에코지오
,
메이븐이 만들어 내는 site 문서를 열어보면 프로젝트 설명이라든가  등등에서 한글이 깨져서 나오기도 하는데

site 문서의 html 소스를 까보면 한글이 깨지는 이유를 알게된다.

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />

html 문서의 charset은 maven-site-plugin의 outputEncoding 설정을 통해 바꿀 수 있다.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-site-plugin</artifactId>
    <version>2.0-beta-6</version>
    <configuration>
     <outputEncoding>euc-kr</outputEncoding>
    </configuration>
</plugin>

그러나 이걸로도 한글이 깨지는 걸 피할 수 없는 리포트가 있는데 StatSCM 리포트가 그렇다.
stat-scm 플러그인은 소스버전관리 저장소의 활동내역을 통계 리포트로 생성하는 플러그인이다.
   <plugin>
    <groupId>net.sf</groupId>
    <artifactId>stat-scm</artifactId>
    <version>1.2.0</version>
   </plugin>

여러가지 멋진 통계그래프를 만들어주는 간지나는 플러그인이다. 다만 아쉬운 것이 CVS접속 계정이 한글인 경우
site 인코딩을 euc-kr로 하든 utf-8로 하든 뭔 지랄을 해도 한글이 깨진다는 것이다.



근데 재밋게도 차트안에 들어가는 한글은 안깨지고 잘 나온다. 거참 희한하다.

ps. 위에 실명이 나와서 좀 거시기한데.. 설마 이 글을 보지는 않겠지?
Posted by 에코지오
,
pom.xml에서 모든 의존 라이브러리가 system 스코프로 설정된 경우 
site 문서 생성시 null point 에러가 발생한다.

c:\>mvn site
... ....
[INFO] Generating "Dependencies" report.
[INFO] ------------------------------------------------------------------------
[ERROR] FATAL ERROR
[INFO] ------------------------------------------------------------------------
[INFO] null
[INFO] ------------------------------------------------------------------------
[INFO] Trace
java.lang.NullPointerException
        at org.apache.maven.report.projectinfo.dependencies.renderer.DependenciesRenderer.printArtifactsLocations(DependenciesRenderer.java:1182)

메이븐의 프로젝트 기본정보 리포트 생성 플러그인(maven-project-info-reports-plugin)이 만들어 내는 리포트 중에 dependencies 리포트가  있는데 이 리포트를 생성하면서 에러가 나는 것이다.

http://jira.codehaus.org/browse/MPIR-131

해결 방법은 2가지가 있다.

1. system 스코프가 아닌 라이브러리를 하나 이상 추가한다.
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>3.8.2</version>
  </dependency>

2. site 문서에서 dependencies 리포트를 아싸리 빼버린다.
 <reporting>
  <plugins>
   <plugin>
    <artifactId>maven-project-info-reports-plugin</artifactId>
    <reportSets>
     <reportSet>
      <reports>
       <report>index</report>
       <report>summary</report>
       <report>project-team</report>
       <!-- 모든 dependency의 scope가 system인 경우 error 발생 -->
       <!-- report>dependencies</report -->
      </reports>
     </reportSet>
    </reportSets>
   </plugin>
....
....


Posted by 에코지오
,