hacking2009/09/08 01:40
크리에이티브 커먼즈 라이선스
Creative Commons License
docbkx-tools는 편리한 대신, xslt와 fop의 세밀한 옵션을 조절할 수 없다. 그래서 좀 더 삽질을 해봤다.

말이 maven이지 ant로 했다면 훨씬 간단했을 듯...하지만, maven에서 xslt나 fop를 다루는 예제라고 생각하면 뭐... 손해볼 건 없다.

1. maven-dependency-pluginunpack-dependencies 골을 실행하여 docbook 스타일 시트와 카탈로그를 작업 디렉토리에 풀어 놓자. 예제에서는 generated-resources 페이즈에 net.sf.docbook:docbook-xsl 아티팩트를 target/generated-resources 폴더 아래에 풀어 놓는다(말이 참 어려운데... 가만히 들여다 보면 별거 아니다):

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-dependency-plugin</artifactId>
    <executions>
      <execution>
        <id>unpack-shared-resources</id>
        <goals>
          <goal>unpack-dependencies</goal>
        </goals>
        <phase>generate-resources</phase>
        <configuration>
          <outputDirectory>${project.build.directory}/generated-resources</outputDirectory>
          <includeGroupIds>net.sf.docbook</includeGroupIds>
          <includeArtifactIds>docbook-xsl</includeArtifactIds>
          <includeClassifiers>resources</includeClassifiers>
          <excludeTransitive>true</excludeTransitive>
        </configuration>
      </execution>
    </executions>
</plugin>

2. xml-maven-plugintransform 골을 실행하여, 앞에서 풀어놓은 docbook 스타일 시트와 카탈로그들을 사용하여 xslt(여기서는 xalan을 사용했지만 saxon등 다른 xslt를 사용해도 된다)를 실행하여 fo 파일을 만든다.  예제에서는 generated-resources 페이즈에 src/docbook 디렉토리 아래에 manual.xml을 처리하여 처리하여 manual.fo인 파일을 만든다(parameters 요소를 사용하여 XSLT 파라메터를 지정할 수 있다):

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>xml-maven-plugin</artifactId>
   <version>1.0-beta-2</version>
   <executions>
    <execution>
      <goals>
        <goal>transform</goal>
      </goals>
      <!-- linked with generate-resources phase -->
      <phase>generate-resources</phase>
    </execution>
  </executions>
  <configuration>
      <catalogs>
        <catalog>${project.build.directory}/generated-resources/docbook/catalog.xml</catalog>
      </catalogs>
      <transformationSets>
        <transformationSet>
          <dir>src/docbook/</dir>
          <includes>
            <include>manual.xml</include>
          </includes>
          <stylesheet>${project.build.directory}/generated-resources/docbook/fo/docbook.xsl</stylesheet>
          <fileMappers>
            <fileMapper
 implementation="org.codehaus.plexus.components.io.filemappers.FileExtensionMapper">
            <targetExtension>.fo</targetExtension>
          </fileMapper>
        </fileMappers>
        <outputDir>${project.build.directory}/</outputDir>
        <!-- see http://docbook.sourceforge.net/release/xsl/current/doc/fo/ -->
        <parameters>
          <parameter>
            <name>body.font.family</name>
            <value>UnBatang</value>
          </parameter>
          <parameter>
            <name>sans.font.family</name>
            <value>UnDotum</value>
          </parameter>
          <parameter>
            <name>title.font.family</name>
            <value>hline</value>
          </parameter>
          <parameter>
            <name>monospace.font.family</name>
            <value>UnTaza</value>
          </parameter>
        </parameters>
      </transformationSet>
    </transformationSets>
  </configuration>
  <dependencies>
    <dependency>
      <groupId>net.sf.docbook</groupId>
      <artifactId>docbook-xsl-xalan</artifactId>
      <version>1.0.0</version>
    </dependency>
  </dependencies>
</plugin>


3. maven-antrun-plugin의 run 골을 실행하여, fop를 실행하여 앞에서 만들어진 fo 파일들을 처리하여 pdf를 만들어 낸다. 이 부분은 maven에서 ant 스크립트를 사용하는 전형적인 형태다. 예제에서는 pre-site 페이즈에 fop에 포함된 ant task를 사용하여 manual.fo를 처리하여 manual.pdf를 만든다(userconfig 속성를 통해 fop 설정 파일을 지정할 수 있다):

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-antrun-plugin</artifactId>
  <version>1.3</version>
  <dependencies>
    <dependency>
      <groupId>org.apache.xmlgraphics</groupId>
      <artifactId>fop</artifactId>
      <version>0.95-1</version>
    </dependency>
  </dependencies>
  <executions>
    <execution>
      <phase>pre-site</phase>
        <goals>
          <goal>run</goal>
        </goals>
      </execution>
    </executions>
  <configuration>
  <tasks>
    <echo message="processing docbook..." />
    <taskdef name="fop" classname="org.apache.fop.tools.anttasks.Fop">
    </taskdef>
    <fop
userconfig="src/docbook/fop-userconfig.xml"
format="application/pdf"
fofile="target/manual.fo"
outfile="target/manual.pdf" />
    </tasks>
  </configuration>
</plugin>

세삼 확인하게 되는 사실...
이런 류의 "절차적인" 삽질을 할때는 maven이 쥐약이라는 거...-,.-;;;

Posted by iolo
hacking2009/08/27 02:00
크리에이티브 커먼즈 라이선스
Creative Commons License
"maven and docbook"을 구글링하면 제일 먼저 나오는 녀석이 docbkx-tools인데, 그 덕분에 참고할 자료도 좀 있는 편이다.

pom.xml 파일에 다음의 내용을 추가해주고:

<plugin>
    <groupId>com.agilejava.docbkx</groupId>
    <artifactId>docbkx-maven-plugin</artifactId>
    <version>2.0.9</version>
    <executions>
        <execution>
            <goals>
                <goal>generate-pdf</goal>
                <goal>generate-html</goal>
            </goals>
             <!-- <phase>pre-site</phase> -->
        </execution>
    </executions>
    <dependencies>
    <dependency>
    <groupId>org.docbook</groupId>
    <artifactId>docbook-xml</artifactId>
    <version>4.4</version>
        </dependency>
    </dependencies>
    <configuration>
        <sourceDirectory>src/docbkx</sourceDirectory>
        <targetDirectory>target/docbkx</targetDirectory>
        <includes>**/*-manual.xml</includes>
        <entities>
            <entity>
                <name>version</name>
                <value>${pom.version}</value>
            </entity>
        </entities>
        <chunkedOutput>true</chunkedOutput>
        <highlightSource>1</highlightSource>
        <xincludeSupported>true</xincludeSupported>
        <!--  커스텀 스타일 시트 사용... -->
        <foCustomization>src/docbook/stylesheets/fo.xsl </foCustomization>
        <htmlCustomization>src/docbook/stylesheets/html.xsl </htmlCustomization>
        -->
        <!--  나눔 글꼴 설정 -->
        <bodyFontFamily>NanumMyeongjo</bodyFontFamily>
        <titleFontFamily>NanumGothic</titleFontFamily>
        <sansFontFamily>NanumGothic</sansFontFamily>
        <monospaceFontFamily>NanumGothic_Coding</monospaceFontFamily>
        <fonts>
            <font>
                <name>NanumMyeongjo</name>
                <style>normal</style>
                <weight>normal</weight>
                <embedFile>src/fonts/truetype/NanumMyeongjo.ttf </embedFile>
                <metricsFile>src/fonts/metrics/NanumMyeongjo-metrics.xml </metricsFile>
            </font>
            <font>
                <name>NanumMyeongjo</name>
                <style>normal</style>
                <weight>bold</weight>
                <embedFile>src/fonts/truetype/NanumMyeongjoBold.ttf </embedFile>
                <metricsFile>src/fonts/metrics/NanumMyeongjoBold-metrics.xml </metricsFile>
            </font>
            <font>
                <name>NanumGothic</name>
                <style>normal</style>
                <weight>normal</weight>
                <embedFile>src/fonts/truetype/NanumGothic.ttf </embedFile>
                <metricsFile>src/fonts/metrics/NanumGothic-metrics.xml </metricsFile>
            </font>
            <font>
                <name>NanumGothic</name>
                <style>normal</style>
                <weight>bold</weight>
                <embedFile>src/fonts/truetype/NanumGothicBold.ttf </embedFile>
                <metricsFile>src/fonts/metrics/NanumGothicBold-metrics.xml </metricsFile>
            </font>
            <font>
                <name>NanumGothic_Coding</name>
                <style>normal</style>
                <weight>normal</weight>
                <embedFile>src/fonts/truetype/NanumGothic_Coding.ttf </embedFile>
                <metricsFile>src/fonts/metrics/NanumGothic_Coding-metrics.xml </metricsFile>
            </font>
            <font>
                <name>NanumGothic_Coding</name>
                <style>normal</style>
                <weight>bold</weight>
                <embedFile>src/fonts/truetype/NanumGothic_Coding_Bold.ttf  </embedFile>
                <metricsFile>src/fonts/metrics/NanumGothic_Coding_Bold-metrics.xml </metricsFile>
            </font>
        </fonts>
    </configuration>
</plugin>

mvn docbkx:generate-pdf

명령을 실행하면 sourceDirectory(위의 예에서는 src/docbook) 아래에서 includes로 지정한 패턴(위의 예에서는 모든 하위디렉토리에서 -manual.xml로 끝나는 docbook 소스 파일을 처리해서 targetDirectory(위의 예에서는 target/docbook) 아래에 pdf로 만들어 준다.

덤으로 fop를 위한 폰트 매트릭을 만들어 주는 플러그인도 있다.

pom.xml 파일에 다음의 내용을 추가해주고:

<plugin>
    <groupId>com.agilejava.docbkx</groupId>
    <artifactId>docbkx-fop-support</artifactId>
    <!--
    <executions>
        <execution>
            <phase>generate-resources</phase>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>
    -->
    <configuration>
        <!-- <ansi>true</ansi> -->
        <sourceDirectory>src/fonts/truetype</sourceDirectory>
        <targetDirectory>src/fonts/metrics</targetDirectory>
    </configuration>
</plugin>

mvn docbkx-fop-support:generate

위의 명령을 실행하면 sourceDirectory(위의 예에서는 src/fonts/truetype)안에 있는 *.ttf 파일들을 처리해서  targetDirectory(위의 예에서는 src/fonts/metrics)에 파일 이름 끝에 -metrics.xml을 붙인 메트릭 파일을 생성한다.

위에서는 코멘트 쳐둔 excutions절을 사용하면 빌드 과정에 포함시킬 수 있지만, 시간도 꽤 오래걸리는 작업이고, 큰 글꼴의 경우엔 out of memory도 잘 나고, 결정적으로 대부분의 한글 글꼴들의 경우엔 폰트 헤더의 인코딩 때문에 문제가 있어서 수작업으로 처리했다.(그래서 targetDirectory가 target/...이 아니고 src/...다)

덧. 수작업이라는 건 만들어진 메트릭 파일에서 <family-name>...</family-name>사이에 들어 있는 요상한 문자들을 좋은 편집기(절때 notepad나 eclipse같은 멍청한 편집기 쓰면 안된다!)로 열어서 알아보기 쉬운 영어로 고쳐주던가... <family-name> 태그 자체를 날려버리면 된다.

Posted by iolo
hacking/web2008/07/20 16:54
크리에이티브 커먼즈 라이선스
Creative Commons License
웹 프로젝트에서 자바스크립트의 비중이 점점 커지면서, JSLint 같은 검증 도구의 필요성이 날로 높아지고 있다 이걸 매번 소스코드를 클립보드로 복사(copy)해서 jslint.com의 웹 폼에 붙여넣고(paste) 돌리는 짓을 하다가 귀찮아서 몇가지 방법을 찾아 보았다.

먼저, maven:

pom.xml에 이런거 대충 추가하자. 그러면 mvn site 돌릴때 같이 실행되서 target/site/jslint/index.html에 보고서가 만들어진다. 중간에 sourceDirectory는 잘 고쳐 주시길... 안고쳐주면 src/main/javascript 가 기본값이다.

    <reporting>
...
        <plugins>
...
            <plugin>
                <groupId>org.codehaus.mojo.javascript</groupId>
                <artifactId>javascript-report-maven-plugin</artifactId>
                <configuration>
                    <sourceDirectory>src/main/webapp/js</sourceDirectory>
                    <encoding>UTF-8</encoding>
                    <assumeBrowser>yes</assumeBrowser>
                </configuration>
            </plugin>
...
        </plugins>
...
    </reporting>

site까지 돌리지 않고 수시로 확인하고 싶다면, pom.xml에 이런거 대충 추가자. 그러면 mvn javascript-report:jslint 명령을 사용하여 수시로 확인할 수 있다.
    <build>
...
        <plugins>
....
            <plugin>
                <groupId>org.codehaus.mojo.javascript</groupId>
                <artifactId>javascript-report-maven-plugin</artifactId>
                <configuration>
                    <sourceDirectory>src/main/webapp/js</sourceDirectory>
                    <encoding>UTF-8</encoding>
                    <assumeBrowser>yes</assumeBrowser>
                </configuration>
            </plugin>
...
        </plugins>
...
    </build>

compile 페이즈에서 실행하고, 에러나면 중단해버리고 싶은데... 보시다시피 플러그인 이름부터 report용 플러그인이다보니... 잘 안된다.

아... 이 녀석이 아직 정식 릴리즈가 안되서.. mojo 홈페이지의 문서를 참조해서 mono의 snapshot 플러그인 리파지터리를 활성화시켜야 한다.

다음으로, ant:

사실 maven으로 하기전에 먼저 ant로 했었다.

build.xml에 이런거 대충 추가해주자. 그러면, ant verify 명령을 사용하여 수시로 확인할 수 있다.
    <target name="verify">
        <scriptdef name="jslint" src="etc/fulljslint-ant.js" language="javascript">
            <attribute name="options" />
            <element name="fileset" type="fileset" />
        </scriptdef>
        <jslint>
            <fileset dir="src/main/webapp/js">
                <include name="**/*.js" />
            </fileset>
        </jslint>
    </target>

중간에 있는 자바스크립트 소스 디렉토리는 잘 고쳐 주시길... 물론 이렇게 하지 않고 <property name="js.srcDir" location="src/main/webapp/js" /> 이런식으로 쓰게 되겠지만...

더 중요한 것은 위쪽에 있는 fulljslint-ant.js인데, JSLint 홈페이지에 있던 크록포드옹의 코드에를 다운받아서 다음의 코드를 추가한 것이다:
importClass(java.io.File);
importClass(java.io.FileInputStream);
importClass(java.io.InputStreamReader);
importClass(Packages.org.apache.tools.ant.util.FileUtils);

function checkFile(file, options) {
    var reader = new InputStreamReader(new FileInputStream(file), "UTF-8");
    var input = new String(FileUtils.readFully(reader));
    input = input.toString();
    if (!input) {
        print("Couldn't open file '" + file.toString() + "'.");
        return;
    }
    if (!JSLINT(input, options)) {
        print("Problems found in " + file.toString());
        for (var i = 0; i < JSLINT.errors.length; i += 1) {
            var e = JSLINT.errors[i];
            if (e) {
                print('Lint at line ' + (e.line + 1) + ' character ' +
                        (e.character + 1) + ': ' + e.reason);
                print((e.evidence || '').
                        replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1"));
                print('');
            }
        }
    } else {
        print("No problems found in " + file.toString());
    }
}

var options = attributes.get("options") || "{ browser:true }";
project.log('Running jslint....');
project.log('\toptions=' + options);
options = eval('(' + options + ')');

//var options = {eqeqeq : false, white: true, plusplus : false, bitwise : true, passfail: false, browser: true, evil: true, forin: true, newprimitive: true};
if (elements.get("fileset").size() > 0) {
    var fileset = elements.get("fileset").get(0);
    var ds = fileset.getDirectoryScanner(project);
    var srcFiles = ds.getIncludedFiles();
    for (var i = 0; i < srcFiles.length; i++) {
        var jsfile = new File(fileset.getDir(project), srcFiles[i]);
        checkFile(jsfile, options);
    }
}

코드가 좀 지저분해도 이해해주시길... =3=3=333

혹시, 아직도 jslint로 검사하지 않은 자바스크립트 코드를 deploy하고 있다면 지금 바로 가까운 벽으로 달려가서... 두 손 번쩍 들고... 반성하자. 그리고 지금이라도 (일단 간단하게 copy & paste로) jslint를 돌려보자.
사용자 삽입 이미지
좌절할 필요는 없다. 이제부터 고치면 된다.
사용자 삽입 이미지
참고로... 말해두지만... jslint.com에 괜히 이런 메시지가 있는게 아니다...

WARNING: JSLint may hurt your feelings.

=3=3=333
Posted by iolo
hacking/java2008/02/19 12:23
크리에이티브 커먼즈 라이선스
Creative Commons License
새로운 이클립스용 Maven2 플러그인 Q.. 줄여서 q4e가 등장했다.(고 하기엔 좀 오래된 얘기일지도...)

현재로썬(0.4) WTP 지원이 원할하지 않아서 M2WTPlibcopy같은 플러그인과 같이 써야한다.(m2eclipse도 예전에는 비슷한 삽질이 필요했는데 최근 버전은 WTP와 잘 붙는다.) 대신 mavenide(넷빈즈용 maven 플러그인)에 있던 의존성 그래프같은 기능을 갖고 있다.

이클립스 공식 프로젝트로 제안됐는데... 글쎄...
http://www.eclipse.org/proposals/iam/

나름대로 이유가 있긴하지만, m2eclipse가 어느 정도 자리를 잡아가는 시점에서 이렇게 fork하는 모양새가 그닥 좋아보이진 않는다.

예전에 써두었다가 포스팅 안했던 건데, 포스팅할거리도 없고... -.-;;;
Posted by iolo
hacking/java2007/12/11 14:08
크리에이티브 커먼즈 라이선스
Creative Commons License
엄밀하게 말하면 eclipse용 maven플러그인의 문제라기보다는 maven-embedder의 문제인데...

몇 가지 해결책이 있다.

1. m2eclipse의 홈페이지 FAQ에 나오는 방법...

pom.xml에 다음의 내용을 추가해 준다:
<dependency>
   <groupId>com.sun</groupId>
   <artifactId>tools</artifactId>
   <version>1.5.0</version>
   <scope>system</scope>
   <systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>

이 방법이 제일 간단한 방법이지만, jdk를 기본 경로(예: c:\Program Files\Java\jdk1.5.0_13)에 설치하지 않았다면 제대로 동작하지 않는다. 내 경우가 바로 그런 경우인데(예: d:\devel\jdk1.5.0_13), 다행이도 JAVA_HOME 환경 변수가 저 디렉토리를 가리키고 있어서 다음과 같이 수정했다:
   <systemPath>${env.JAVA_HOME}/lib/tools.jar</systemPath>

2. tools.jar를 수동으로 로컬 저장소에 추가하는 방법...

혼자하는 프로젝트에서 유용한 방법이다. 콘솔을 열고 다음 명령을 실행한다:
mvn install:install-file -Dfile=D:\devel\jdk1.5.0_13\lib\tools.jar -DgroupId=com.sun -DartifactId=tools -Dpackaging=jar -Dversion=1.5.0

여기서 tools.jar의 완전한 경로는 원하는대로 바꿔주면 된다.

3. tools.jar를 수동으로 원격 저장소에 추가하는 방법...

여러 사람이 진행하는 프로젝트에서 유용한 방법인데... 조금 복잡하다. 이 방법을 사용하기 위해서는 쓰기(업로드)가능한 원격 저장소가 미리 준비되어 있어야 한다. 일단 원격 저장소가 준비되어있다면,  콘솔을 열고 다음 명령을 실행한다:
mvn deploy:deploy-file -Dfile=D:\devel\jdk1.5.0_13\lib\tools.jar -Durl=dav:http://url.to.remote.repository -DrepositoryId=remote-repository -DgroupId=com.sun -DartifactId=tools -Dpackaging=jar -Dversion=1.5.0

여기서 tools.jar의 완전한 경로는 원하는대로 바꿔주면 된다. 또한 원격 저장소의 완전한 url과 저장소 id(settings.xml에 정의된 server 항목)도 적절하게 바꿔주어야 한다.

대부분의 경우 scp를 쓰거나 archiva의 webdav을 쓸텐데... 이 때는 원격 저장소 설정을 settings.xml에 적어두는 것 외에 한가지 더 해야할 일이 있다. deploy-file goal이 사용할 wagon 라이브러리들을 maven의 lib디렉토리(예: d:\devel\apache-maven-2.0.8\lib)에 넣어두는 것이다. webdav을 쓰는 경우에는 다음의 파일(괄호 안은 groupId, 버전은 다를 수 있음)들이 필요하다:
wagon-webdav-1.0-beta-2.jar (org.apache.maven.wagon)
webdav-0.4.jar
(it.cloud)
slide-webdavlib-2.1.jar  (slide)
commons-httpclient-2.0.2.jar (commons-httpclient)
commons-logging-1.0.4.jar (commons-logging)
plexus-utils-1.4.7.jar (org.codehaus.plexus)

내 경우엔 여러 사람이 프로젝트에 참여하기 때문에 세번째 방법을 써서 1.5.0와 1.6.0버전의 tools.jar를 각각 등록해 두었다.

Posted by iolo
hacking/java2007/12/08 16:46
크리에이티브 커먼즈 라이선스
Creative Commons License
기존 프로젝트를 maven으로 마이그레이션할 때 디렉토리 구조를 어떻게 할 것인가 하는 문제때문에 늘 고민하게 된다. 결론부터 말하면, 두가지 방법이 있다.

1. 기존 디렉토리 구조를 그대로 두고, maven을 적절하게 설정한다.
2. 기존 디렉토리 구조를 maven의 표준(권장) 디렉토리 구조로 변경한다.

후자의 경우가 확실하긴 하지만, cvs를 쓰고 있다면 대략 낭패(?!)다. svn을 쓴다면 그나마 다행이지만... 여러 사람이 함께 작업하는 프로젝트라면 조금 귀찮은 문제들이 있다.

내가 기존에 사용하던 프로젝트의 디렉토리 구조는 (대충) 다음과 같다:

  • src
    • java : *.java
    • res : *.properties 등의 리소스들...
    • test: *Test.java 와 리소스들...
  • build
    • classes : 출력 파일들
  • WebContent : 웹 리소스들((Eclipse/WTP를 사용할 경우에만 필요하다)

전형적인 ant용 디렉토리 구조인데, 이 구조를 손대지 않고 maven으로 빌드를 하기 위해서 pom.xml에 다음과 같은 내용을 추가했다:

    <build>
        <directory>${basedir}/build</directory>
        <sourceDirectory>${basedir}/src/java</sourceDirectory>
        <outputDirectory>${basedir}/build/classes</outputDirectory>
        <testSourceDirectory>${basedir}/src/test</testSourceDirectory>
        <testOutputDirectory>${basedir}/build/test-classes</testOutputDirectory>
        <resources>
            <resource>
                <directory>${basedir}/src/res</directory>
            </resource>
        </resources>
        <testResources>
            <testResource>
                <directory>${basedir}/src/test</directory>
                <excludes>
                    <exclude>*.java</exclude>
                </excludes>
            </testResource>
        </testResources>
        <plugins>
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <warSourceDirectory>${basedir}/WebContent</warSourceDirectory>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <reporting>
        <outputDirectory>${basedir}/build/site</outputDirectory>
    </reporting>


약간 골치아팠던 것이, 내 경우엔 test용 클래스와 리소스들을 하나의 디렉토리(src/test)에 몰아넣었는데, maven은 따로 구분한다(src/test/java와 src/test/resources)는 점이다. 그래서 testSourceDirectory와 testResource 둘 모두에 같은 디렉토리를 설정하고 testResource에 *.java를 exclude하도록 설정했다.

대충 돌아가는것 같은데, 뭔가 빠트린게 있을까.. 살짝 불안^^;

Posted by iolo
TAG Java, maven
hacking/java2007/09/13 11:32
크리에이티브 커먼즈 라이선스
Creative Commons License
MavenEclipseWTP은 뭔가 삽스러웠다. 그래서 정석으로 파고들기 시도~

준비물

eclipse 3.0+ 설치

maven 2.0+ 설치 http://maven.apache.org

윈도의 시스템 PATH 등록

m2eclipse 플러그인 설치 http://m2eclipse.codehaus.org/update-dev/

m2wtp 플러그인 설치 http://m2wtp.googlecode.com/svn/trunk/kr.javanese.devtools.m2wtp.update


명령행(cmd)에서

  1. C:\workspace>mvn archetype:create -DgroupId=com.thinkfree.ajax -DartifactId=test -DarchetypeArtifactId=maven-archetype-webapp
  2. C:\workspace>cd test
  3. C:\workspace\test>mvn -Dwtpversion=1.5 eclipse:eclipse

이클립스에서

  1. File > Import > Existing Projects into Workspace > C:\workspace 선택 > test2 선택
  2. test 프로젝트 팝업메뉴 > Maven > Enable Dependency Management
  3. test 프로젝트 팝업메뉴 > Add M2WTP Builder
  4. test 프로젝트 팝업메뉴 > Properties
    1. Project Facets > Modify > Java1.4 를 5.0 또는 6.0으로 변경
    2. Java Build Path > Libraries >  Maven2 Dependencies, M2_REPO/...junit... 삭제
  5.   test 프로젝트(또는 그 아래 pom.xml) 팝업메뉴 > Add Dependency(또는 직접 pom.xml 편집)

삽질은 계속되어야 한다... 주욱~


TBW


이 글은 스프링노트에서 작성되었습니다.

'hacking > java' 카테고리의 다른 글

Eclipse 3.3.1의 PermGen 버그...  (1) 2007/10/08
유리 물고기 v2.0 정식 릴리즈  (0) 2007/09/21
Maven2와 Eclipse/WTP 함께쓰기 (2)  (0) 2007/09/13
Maven2와 Eclipse/WTP 함께쓰기  (0) 2007/09/11
singleton과 lazy loading...  (0) 2007/01/28
Java6 XMLOutputFactory 유감  (2) 2007/01/15
Posted by iolo
hacking/java2007/09/11 01:31
크리에이티브 커먼즈 라이선스
Creative Commons License
이거 어디서 퍼왔더라-.-;; 원 출처를 까먹었다.

출처: http://livingash.wordpress.com/2007/08/13/back-to-the-future-when-eclispe-wtp-20-meets-maven-2/


구질구질하긴 하지만... 뭐 어때~ 잘 돌아간다!


기본적인 절차는 대충 이렇다:

  1. 이클립스를 띄우고, "Dynamic Web Application" 프로젝트를 하나 만들고,
  2. 표준 maven 프로젝트를 기본 archetype으로 만들고,
  3. 모든 이클립스 설정 파일들을 maven 프로젝트로 복사한 다음, 프로젝트에 맞게 수정한다.

준비물:

  1. 이클립스 3.3 + WTP 2.0.
  2. M2Eclipse 플러그인(http://m2eclipse.codehaus.org/)
  3. 서블릿 컨테이너 런타임.(톰캣이든 뭐든.. 설정 된 넘으로)A servlet container runtime, could be Tomcat or anything supported, is configured.

자 이제 본격적으로 시작해보자!


1단계: 참조용 WTP 프로젝트 만들기

간단하지 뭐~

  1. 이클립스 띄우고.
  2. New project > Project … > Web > Dynamic Web Project.
  3. 프로젝트 이름 짓고, 타겟 런타임 지정하고, 완료.
  4. 이클립스 종료.

2단계: maven 프로젝트 만들기

  1. maven의 archetype으로 만들자:
    mvn archetype:create -DgroupId=com.mycompany -DartifactId=my-war
  2. 다음 폴더를 추가하자:
    src/main/webapp
  3. 다음 폴더들도 추가하면 좋다:
    src/main/resources
    src/test/resources

3단계: 이클립스 파일 복사하기

다음 파일들을 이클립스 프로젝트에서 maven 프로젝트로 복사하자:

  1. .project (file)
  2. .classpath (file)
  3. .settings (folder)

4단계: 프로젝트 설정 편집하기

  1. .project 파일을 편집하자.
  2. <projectDescription>밑에 <name>${project-name}</name>를 찾아서
  3. Change ${project-name} 원하는 프로젝트 이름으로 바꾸자. 웬만하면 글자나, 숫자, 하이픈, 밑줄 정도만 쓰자. 물론 강제 사항은 아니다.

5단계: classpath 편집

  1. .classpath파일을 편집하자.
  2. <classpathentry kind="src" path="src"/>를 찾아서
  3. <classpathentry kind="src" path="src/main/java"/>로 바꿔주자.

6단계: WTP component 설정 편집

  1. .settings/org.eclipse.wst.common.component파일을 편집하자. 대충 이렇게 생겼다:
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <project-modules id=”moduleCoreId” project-version=”1.5.0″>
    3. <wb-module deploy-name=”${deploy-name}”>
    4. <wb-resource deploy-path=”/” source-path=”${webcontent-path}”/>
    5. <wb-resource deploy-path=”/WEB-INF/classes” source-path=”${source-path}”/>
    6. <property name=”context-root” value=”${context-root}”/>
    7. <property name=”java-output-path” value=”build/classes”/>
    8. </wb-module>
    9. </project-modules>
  2. ${deploy-name}을 원하는 걸로 바꾸자. 접근 url이랑은 무관한 서블릿 컨테이너의 관리 도구에서 인식하는 이름이다.
  3. ${webcontent-path}/src/main/webapp로 바꿔주자.
  4. ${source-path}/src/main/java로 바꿔주자.
  5. ${context-root}를 어플리케이션 접근 경로로 바꿔주자. 예를들어, “my-app”이라고 하면 http://localhost:8080/my-app 을 통해서 접근할 수 있게되는 거다. 프로젝트 이름이 URL로 쓰기에 문제가 있을 정도가 아니라면 프로젝트 이름이랑 같은 이름으로 하는 것이 일반적인 관행이다.

7단계: 프로젝트를 이클립스로 들여오기

  1. 이클립스 띄우고,
  2. File > Import > General > Existing projects into eclipse.
  3. 위에서 만든 프로젝트를 찾아서, 완료

8단계: 마무리 설정

거의 다 왔다. maven과 WTP를 삼빡하게 엮어서 쓸려면 몇가지만 더 해주면 된다. m2eclipse가 설치되어 있는지 다시 한번 확인하자.

  1. maven 지원 켜기
    프로젝트의 팝업 메뉴에서 Maven 2 > Enable.
  2. maven 의존성을 웹 라이브러리에 포함시키기
    Project properties > J2EE Module Dependencies> "Maven2 Dependencies" 체크.
  3. 추가적인 maven 소스 경로 추가하기
    기본으로 src/main/java만 소스 폴더 목록에 들어있다. maven에는 유용한 소스 폴더가 몇개 더 있다. 이것들을 목록에 추가해주자:
    src/main/resources
    src/test/java
    src/test/resources
  4. 라이브러리 순서 지정
    Project properties > Java Build Path > Order and Export
    다음 순서로 정해주자: src/main/java, Maven 2 Dependencies, Web App Libraries, blahalala…
  5. 빌더 순서 지정
    Project properties > Java Build Path > Builders, set order as: Maven 2 Project Builder, blahalala…

9단계: 준비~ 땅!

프로젝트를 한번 Clean해주자. 그럼 자동으로 빌드될꺼다. 가끔 이클립스가 말을 안들으면 Clean을 몇번 더 해주던가 이클립스를 새로 시작하면 된다.

밑에 그림은 Eclipse WTP 2.0으로 실행 중인 내 첫번째 Struts 2 튜토리얼이다:

wtp2.jpg









이 글은 스프링노트에서 작성되었습니다.

'hacking > java' 카테고리의 다른 글

유리 물고기 v2.0 정식 릴리즈  (0) 2007/09/21
Maven2와 Eclipse/WTP 함께쓰기 (2)  (0) 2007/09/13
Maven2와 Eclipse/WTP 함께쓰기  (0) 2007/09/11
singleton과 lazy loading...  (0) 2007/01/28
Java6 XMLOutputFactory 유감  (2) 2007/01/15
XML Exodus...  (3) 2007/01/07
Posted by iolo