메이븐이 만들어 내는 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 에코지오
,

maven antrun plugin을 통해 ant의 scp 타스크를 이용하여 파일을 전송하기 위해 딸랑 jsch 라이브러리만 의존성에 추가하면 scp 타스크가 없다고 에러가 떨어진다. 

   <plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <executions>
     ... ...
    </executions>
    <dependencies>
     <dependency>
      <groupId>com.jcraft</groupId>
      <artifactId>jsch</artifactId>
      <version>0.1.38</version>
     </dependency>
    </dependencies>
   </plugin>

jsch 뿐 아리나 ant-jsch 아티팩트도 antrun 플러그인 의존성에 추가해야 한다. maven을 통하지 않고 순전히 scp작업을 build.xml에 정의해서 ant로 실행하면 jsch 라이브러리만 ant에 추가해주면 된다. ant-jsch.jar는 이미 ant에 포함되어 있기 때문이다.

   <plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <executions>
     <execution>
      <id>remote-exploded-deploy-scp</id>
      <phase>integration-test</phase>
      <goals>
       <goal>run</goal>
      </goals>
      <configuration>
       <tasks>
        <scp todir="user:user@myserver:/home/user/temp" trust="true">
         <fileset dir="${project.basedir}/temp" />
        </scp>
       </tasks>
      </configuration>
     </execution>
     <execution>
      <id>server-restart</id>
      <phase>integration-test</phase>
      <goals>
       <goal>run</goal>
      </goals>
      <configuration>
       <tasks>
        <sshexec host="myserver" username="user" password="user" trust="true"
         timeout="20000" failonerror="false" command="sh restart.sh" />
       </tasks>
      </configuration>
     </execution>
    </executions>
    <dependencies>
     <dependency>
      <groupId>org.apache.ant</groupId>
      <artifactId>ant-jsch</artifactId>
      <version>1.7.1</version>
     </dependency>
     <dependency>
      <groupId>com.jcraft</groupId>
      <artifactId>jsch</artifactId>
      <version>0.1.38</version>
     </dependency>
    </dependencies>
   </plugin>

마찬가지로 ftp 타스크를 쓸 때도 commons-net 뿐 아니라 ant-commons-net도 추가해주어야 한다.

   <plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <executions>
     <execution>
      <id>remote-exploded-deploy-ftp</id>
      <phase>integration-test</phase>
      <goals>
       <goal>run</goal>
      </goals>
      <configuration>
       <tasks>
        <ftp server="myserver" remotedir="/home/user/temp" userid="user"
         password="user">
         <fileset dir="${project.basedir}/temp" />
        </ftp>
       </tasks>
      </configuration>
     </execution>
    </executions>
    <dependencies>
     <dependency>
      <groupId>org.apache.ant</groupId>
      <artifactId>ant-commons-net</artifactId>
      <version>1.7.1</version>
     </dependency>
     <dependency>
      <groupId>commons-net</groupId>
      <artifactId>commons-net</artifactId>
      <version>1.4.1</version>
     </dependency>
    </dependencies>
   </plugin>
Posted by 에코지오
,

허드슨의 장점 중 하나가 여러가지 플러글인을 끼워넣어 기능을 확장할 수 있다는 것인데,
그런 플러그인 중에 ftp, scp 처럼 빌드 결과물을 서버로 전송할 수 있는 플러그인이 있다.

프로젝트 통신환경이 ssh라서 scp 플러그인을 설치하고 빌드 성공후 빌드 산출물을 서버에 업로드하도록
설정을 하고 빌드를 해보았다.

빌드는 성공했으나 실제로 산출물은 업로드가 되지 않았다.
콘솔 아웃풋도 에러업이 깨끗하였고 허드슨 로그를 뒤져보아도 scp 플러그인에서 에러가 났다는 내용은 없었다.

허탈한 마음에 구글링해보니 역시나...

http://www.nabble.com/Job-using-Maven-does-not-run-SCP-plugin-td17765416.html

현재 scp 플러그인은 job이 maven 스타일인 경우 작동하지 않는 버그가 있다고 한다.

The SCP plugin does not execute with the Maven2 job type, but works fine with a free style job type.


아직은 maven style job 보다는 free style job이 안정적인 거 같다.

ps. 사용한 hudson버전은 1.252다.

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 에코지오
,

지금 있는 프로젝트에서 package-info.java 라는 것을 처음 보게 되었는데,
이클립스에서 컴파일하면 잘되는 소스인데 메이븐으로는 컴파일오류가 발생하였다.

"package annotations should be in file package-info.java"

컴파일 환경은 윈도우 + jdk 1.5 + maven-compiler-plugin 2.0.2 조합이었고,
메이븐 컴파일러는 외부 jdk를 쓰기 위해 fork=true로 설정했다.

   <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
     <fork>true</fork>
     <executable>C:/bea/jdk150_11/bin/javac.exe</executable>
    </configuration>
   </plugin>

구글링해보니 maven-compiler 플러그인이 소스 경로에 디렉토리 구분자로 / 사용하는데 원인이 있었다.

http://jira.codehaus.org/browse/MCOMPILER-71

이건 jdk의 버그라고 생각할 수도 있다. 하여간에,

윈도우 환경에서 이 오류를 해결하는 방법은?

1. fork하지 않고 컴파일
2. cygwin을 통해 컴파일



Posted by 에코지오
,

maven-war-plugin 플러그인에서 웹소스의 기본 디렉토리 경로는 src/main/webapp이다.
이 경로를 warSourceDirectory 옵션을 통해 바꿀수가 있다.

   <plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1-alpha-2</version>
    <configuration>
     <warSourceDirectory>${project.basedir}/web</warSourceDirectory>
    </configuration>
   </plugin>

근데 문제는 경로를 ${project.basedir}/web 이런식으로 절대 경로로 줄 경우 M2Eclipse 플러그인이 요상한 WTP 경로를 만들어 내기도 한다.(그랬다가 안그랬다가 -.-;;)

org.eclipse.wst.common.component 파일을 열어보면 source-path가 아래처럼 자동수정이 된다.

<wb-resource deploy-path="/" source-path="/eclipse-3.3/workspace/MyProject/web"/>

이클립스에서 project view 나 package view 에서 프로젝트 모습이 이상하게 바뀐다..

이럴 땐 <warSourceDirectory>web</warSourceDirectory> 이런식으로 웹소스 디렉토리 경로를 상대경로로 주면 된다.
 

ps. 로컬에서 다시 재연해보니 soure-path의 경로가 안바뀌고 그대로 있다. 요상타... -.-;;
 

Posted by 에코지오
,
메이븐으로 컴파일하다가 java.nio.BufferOverflowException 에러가 발생하는 경우가 있다.

구글링해보니 여러가지 원인이 있을 수 있는데 메모리가 부족한 경우에도 발생할 수 있다는 얘기도 있으나
대부분은 운영체제의 기본 인코딩과 다른 인코딩의 소스를 컴파일할 때나 (소스안에 주어진 인코딩으로 인식불가능한 캐릭터가 들어있다든가 하는 식으로) 소스가 깨진 경우 에러가 발생한다고 나온다.

결론은 소스의 정확한 인코딩을 메이븐 maven-compiler-plugin에 알려줘야 한다는 것이다. 요렇게 설정하거나

   <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
     <encoding>UTF-8</encoding>
    </configuration>
   </plugin>

<maven.compiler.encoding>UTF-8</maven.compiler.encoding> 프로퍼티를 통해 인코딩을 설정할 수 있다.
Posted by 에코지오
,

Maven으로 많은 소스를 컴파일하거나 사이트 문서 생성시 메모리가 많이 필요한데,
기본 메모리로는 메모리 부족 오류가 날 수 있다.

Maven홈/bin/mvn.bat 파일에서 MAVEN_OPTS에 -Xmx 옵션을 주어 적당히 메모리를 늘려준다.

set MAVEN_OPTS=-Xmx512m

Hudson을 통해 Maven을 실행한다면 빌드Job 선택 후 Configure > Build > Advanced… > MAVEN_OPTS 필드에 아래처럼 설정한다.


Posted by 에코지오
,
아직 원격 maven 저장소에 등록돼있지 않은 jar 파일을 pom.xml의 의존성에 추가하는
방법 중 하나로 jar 파일을 로컬 저장소에 설치하는 방법이 있다.

로컬 설치는 install:install-file goal을 이용하면 되는데 사용법은 다음과 같은 곳에서 확인할 수 있다.

http://maven.apache.org/plugins/maven-install-plugin/usage.html
http://maven.apache.org/general.html#importing-jars
http://maven.apache.org/pom.html#Dependencies

근데 웃긴건 mvn install:install-file -Dfile=your-artifact-1.0.jar  이런식으로 -Dfile 파라미터만 주면
마치 로컬에 jar가 설치될 것처럼 사이트에서 설명하고 있다는 것이다. pom 레퍼런스 사이트에는
file, artifact, group, version 파라미터를 주어서 설치하는 예제가 나와있기도 하다.

그러나 막상 실행해보면 이런식으로 에러가 떨어진다.(maven 2.0.9에서 테스트해봄)
[INFO] [install:install-file]
[INFO] ----------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ----------------------------------------------------------------
[INFO] Missing group, artifact, version, or packaging information

결국 artifact, group, version, packaging 옵션은 선택이 아니라 필수라는 걸 알게된다. 이제 아래처럼 packaging, file, groupId, artifactId, version 옵션을 필수로 입력해야 제대로 설치된다.
mvn install:install-file -Dpackaging=jar -Dfile=non-maven-proj.jar -DgroupId=some.group -DartifactId=non-maven-proj -Dversion=1.x -DgeneratePom=true

그리고 기왕이면 generatePom=true로 설정하여 m2eclipse 플러그인에서 설치된 jar 파일이 검색이 되도록 pom 파일을 함께 생성하는 것이 좋다.(pom 파일이 없으면 m2eclipse에서는 검색이 안된다)
Posted by 에코지오
,
Rails의 ActiveRecord::Migration과 비슷한 기능을 가진 자바쪽 데이터베이스 리팩토링 라이브러리 2개.

* LiquiBase : http://www.liquibase.org/

리퀴베이스는 데이터베이스 변경이력을 XML로 관리한다. 그러나 이클립스의 기본 Data Explorer 플러그인에
다양한 DB 리팩토링 메뉴를 추가한 플러그인을 제공하기 때문에 직접 XML 파일을 편집할 필요는 별로 없다.
DB 마이그레이션이 아니더라도 여러가지 DDL 작업을 GUI 모드로 실행할 수 있어서 좋은 거 같다.
이클립스 외에 Ant 타스크 및 Maven 플러그인도 제공한다.

리퀴베이스 이클립스 플러그인



* migrate4j : http://migrate4j.sourceforge.net/

자바코드로 변경을 기록한다. Rails의 db:migrate와 유사하지만 아직은 문서도 부족하고 여러모로
딸리는 듯한 느낌이다.

사용자 삽입 이미지


두 라이브러리 모두 애자일에서 말하는 데이터베이스 리팩토링 개념을 구현한 도구로 이해할 수 있을 거 같은데,
구체적으로 어떻게 써먹어야 할지는 아직 감이 잘 오지 않는다.

그외 읽을꺼리.
- 하이버네이트를 사용한 애자일 데이터베이스 리팩토링
- Evolutionary Database Design
- 리팩토링 데이터베이스
Posted by 에코지오
,