태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

티스토리 툴바


"올바른 성장과 따뜻한 나눔"이 있는 넥스트리
새로운 개발장비가 들어와서 기존 개발장비에서 새 장비로 모두 이전하는 중 Maven release에서 이상한 에러가 발생했습니다.



환경

  • 우분투 9.04 x86_64
  • apache2
  • svn 1.5.4
  • maven 2.2.1

현상

Maven release prepare 하다가 맨 마지막에 svn tag 하는 곳에서 에러 발생

prompt> mvn -Dusername=dykim -Dpassword=xxxx release:prepare
....
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Unable to tag SCM
Provider message:
The svn tag command failed.
Command output:
svn: Repository moved permanently to 'http://nextreesvn/common/'; please relocate
...


원인

SVN이 WebDAV로 서비스 되고 있고 SVN에서 tagging하기 위해 아파치 웹서버로 "PROPFIND /common HTTP/1.1" 요청을 하면 301을 응답합니다. 브라우저로 확인하거나 이클립스 subversive (subversion 플러그인)으로 별 이상없는데 maven release 플러그인에서 commit은 잘 되는데 svn tag 에서 이런 에러가 발생합니다.

해결책

구글링 해보니 SVN 301 이슈는 잘 알려진 것였습니다(http://subversion.tigris.org/faq.html#301-error)만 이 상황과는 다르다고 판단하고 2시간 삽질했습니다. (이전 서버와 설정이 동일한데...)
결정적으로 http://eerien.com/blog/165 블로그가 도움이 되었습니다. 아파치 virtual host 설정에서 DocumentRoot 설정을 삭제해야 합니다.

<VirtualHost *>
        ServerName nextreesvn
        ServerAlias nextreesvn nextreesvn

        ErrorLog /var/log/apache2/error_svn.log
        CustomLog /var/log/apache2/access_svn.log common

        # DocumentRoot /home/svn

        <Directory />
                DAV svn
                SVNParentPath /home/svn

                AuthType Basic
                AuthName "Nextree Subversion Repository"
                AuthUserFile /home/svn/dav_svn.passwd
                Require valid-user
        </Directory>

</VirtualHost>

세상에 도움을 준 모든 이들에게 감사합니다. ^^


크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 행복한아빠
"올바른 성장과 따뜻한 나눔"이 있는 넥스트리
괜찮은 글이 있어 번역했습니다. (http://www.sonatype.com/people/2009/01/maven-continuous-integration-best-practices/By Brian Fox

지속적인 통합(Continuous Integration - CI)은 개발프로세스에서 꼭 필요한 최선의 실천 개발방법이다. 이것은 효과적인 소프트웨어 개발 주기에 있어 필수적인 부분이다. 아직 사용하고 있지 않다면 지금 시작해야 한다. 품질관리(QA) 활동동안 테스트 실패와 심각한 에러를 식별하기 위해 여러날 기다리지 한고 시스템으로 에러들을 알려주는 능력이 지속적인 통합의 중요한 능력이다. 이 글은 CI 사용의 가치에 대한 글은 아니다. 이글은 maven 기반에서 선택적인 환경설정을 어떻게 하는가에 대한 글이다. 아래에 Hudson 같은 CI 시스템에서 maven 빌드를 실행하기 위한 7가지 팁이 있다.

#1 Snapshot 배포를 자동화하라

내 경험에 의하면, 개발 snapshot을 CI 시스템이 하도록 하는 것이 최선이다. 이것이 저장소의 내용(JAR, WAR, ...)과 소스 컨트롤 시스템과의 동기화를 보장하는 가장 믿을만한 방법이다. 이렇게 하려면 최선의 방법으로 CI와 함께 snapshot을 자동으로 청소해주는 Nexus같은 저장소 관리자가 필요하다. 한 주내에 300기가 바이트가 넘는 snapshot을 생성하는 프로젝트를 관리해 본 적이 있다. 저장소 관리자를 사용하는 것이 정신건강에 좋을 것이다.

#2 로컬 저장소들을 분리하라

좋은 CI의 설정 중 중요한 것 중 다른 하나는 로컬 저장소를 분리기능이다. Maven의 로컬 저장소는 Maven이 다운로드하거나 생성하는 모든 산출을 보관한는 임시 장소이다. 그리고 이것은 멀티 프로세스에 안전하게 설정되어 있지 않다. 충돌의 가능성은 원격에나 있지 로컬에는 있지 않다.

각 프로젝트마다 로컬 저장소를 갖는 것을 선호하는 주요한 이유는 그 회사 저장소의 빌드결과로 프로젝트 빌드가 가능한가 테스트할 수 있는 유일한 방법이기 때문이다. 만약 로컬 저장소를 분리하지 않는다면 어떤 빌드가 생성한 것을 그것이 그 회사의 저장소가 아닌데도 다른 빌드가 볼 것이다. 실제 배포담당자는 CI 기능을 이용하여 코드가 빌드 가능한지 검증하기 때문에 이것은 매우 중요한 사안이다.

팁: 각 빌드에 유일한 로컬 저장소를 정의하려면 -Dmaven.repo.local=xxxx 를 사용한다.

#3 정기적으로 로컬 저장소를 제거(purge)하라

저장소의 내용을 좀 더 깨끗이(validate)하고 디스크 공간을 관리하기 위해 난 매일 방 로컬 저장소를 제거한다. 저장소가 변경되거나 빌드결과물이 제거되면 CI 시스템이 이를 인식한다. 나는 모든 로컬 저장소 제거를 쉽게 하기 위해 /opt/repos/* 같이 하나의 폴더 구조 아래 두는 방법을 좋아한다.

분명 로컬 저장소를 많이 두는 것이 하나의 공통 저장소를 두는 것보다 디펜던시 중복 때문에 더 많은 디스크를 필요로 할 것이다. 그래도 우리의 large grid에서 저장소는 모두 10기가 바이트도 안된다. Snapshot을 관리하고 매일 밤마다 제거하지 않는다면 로컬 저장소는 거대해질 것이다.

팁: 로컬 저장소를 청소하기 위해 CI 시스템 자체의 스케줄을 사용하라. Maven은 헷갈리지만, 누구라도 CI의 UI를 이용하여 수동으로 청소할 수 있는 방법이다.

#4 배치모드로 돌려라

팁: 빌드에서 -B (batch) 모드를 사용하라. 이렇게 하면 디펜던시 다운로드 진행 로깅같은 것을 피할 수 있어 로그가 짧아진다. 또한 사용자 입력을 기다리는 것 때문에 빌드가 멈추는 일이 없게 한다. (전체적으로 배치모드를 사용하려면 settings.xml에 <interactiveMode>false</interactiveMode>를 설정한다.)

#5 Full stack trace를 사용하라

팁: Maven에서 빌드 에러가 났을때 full stack trace를 보기위해서 -e 옵션을 사용하라. 이렇게 해야 빌드 실패 로그나 메일이 왔을 때 빌드를 다시 할 필요없이 바로 문제를 파악하기 쉬울 것이다.

#6 테스트 실패는 표준 콘솔(standard out)으로 출력하라

팁: -Dsurefire.useFile=false 옵션을 사용하라. 이것은 내가 선호하는 옵션인데 surefire가 테스트 실패를 표준콘솔로 출력하게 만든다. 그러면 빌드 실패 로그나 이메일로 이것이 포함된다. 이러면 간단한 stack trace를 보기 위해 시스템에 접속하여 surefire 보고서를 찾고 뒤지는 시간을 절약할 수 있다. (전체적으로 적용하려면 settings.xml의 active profile에 <properties><surefire.useFile>true</surefire.useFile></properties> 를 설정한다.)

#7 항상 snapshot을 검사한다.

팁: -U 옵션을 사용하면 항상 새로운 snapshot인지 검사한다. (전체적으로 사용하려면 settings.xml의 저장소 정의에서 <updatePolicy>always</updatePolicy>를 설정한다.)

정리

위의 설정과 방법을 사용하면 매 빌드마다 저장소에 빌드결과를 올린다. 다음 빌드는 그 빌드만의 깨끗한 저장소를 사용하고  최근 snapshot인지 저장소 관리자를 검사할 것이다. 그리고 적어도 하루에 한번씩은 저장소 관리자로부터 모든 디펜던시를 다운받을 것이다.

당연히 이런 모든 업데이트와 제거는 CI와 저장소 관리자에 어느정도 네트워크 부하를 줄 것이다. 네트워크가 빠르다면 이 방법이 잘 작동할 것이다. 만일 저장소 관리자와 CI 시스템이 멀리 있다면 빌드 결과의 프락시를 두면 매일 로컬 저장소를 제거하여 나타나는 영향을 줄일 수 있다.

Note. Nexus를 다운받는 것이 왜 중요하면 -.-... 당신이 위와 같은 팁들을 따라서 매일 로컬 저장소를 날리고 중앙 maven 저장소에서 모든 것을 다운로드하는 이런 행위는 중앙 maven 저장소 트래픽 문제를 야기할 수 있다.

-- 본인 사족

번역/정리하다보니 몇 일전 Maven 기반 개발환경에서 잊지 말고 해야 할 일 을 작성했는데 비슷한 이야기이네요. 나머지는 지금 하고 있고 여섯번째 팁은 저도 하나 건졌습니다 ^^. 잘 나가다가 마지막에 Nexus 홍보하는 것 같은 기분.... Nexus 말고 Artifactory도 있으니 참고하세요~




크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 행복한아빠
"올바른 성장과 따뜻한 나눔"이 있는 넥스트리
지금 사용하는 개발환경이 Subversion, Maven2를 사용하고 있다. Maven 저장소로는 Artifactory를 사용하다가 Nexus로 옮겼다. 그리고 CI (Continuous Integration) 서버로는 Apache Continuum을 사용한다.
나중에 기회가 되면 Artifactory vs Nexus 그리고 Continuum vs Hudson 을 비교 분석해보고 싶다.

이런 기반에서 쓰다보면 Nexus나 Continuum 그리고 Maven에 의해 디스크를 엄청쓴다. 개발 프로젝트가 많으면 일주일만 돌려도 기가바이트 단위로 빌드결과가 쌓인다.
이러다가 디스크 꽉 차서 서버가 제대로 작동하지 않는 경우를 당한적이 있다.

왜 디스크를 이렇게 쓰나?
지금 CI 설정이 Common 프로젝트 그룹 (프로젝트 10개내), 제품 프로젝트 그룹 (프로젝트 20~30개)를 각각 1시간마다 교차해서 smoke 테스트를 돌리고 있다. 즉 30분마다 전 프로젝트 테스트를 계속 수행하고 있다.
(smoke testing: 한 순간이라도 빌드나 테스트가 깨지지 않는지 계속 검사하는거다. 즉 뭔가 이상이 생겨 연기가 나지 않는지 항상 모니터링하는 거나. svn에 잘못된 코드가 올라오면 바로 알려준다.)
그리고 매일 밤마다 전 프로젝트를 배포하는 스케줄을 걸어놓았다.

이렇게 돌리다보니 무수한 개발 스냅샷 버전이 빌드되어 디스크를 굉장히 많이 쓰게 된다. 스냅샷 빌드는 기본적으로 지워지지 않고 날짜/시간 대로 계속 쌓인다.


Continuum 관련 빌드 청소
Maven 빌드가 일어나면 스냅샷은 home 디렉토리 밑의 .m2/repository 에 쌓인다. 이중 스냅샷이 쌓이는 그룹디렉토리를 cron 스케줄로 이용하여 주기적으로 날려도 된다.
하지만 고맙게도 Continuum에 Purge(청소) 기능을 제공한다. Administration 메뉴에서 "Purge Configuration"을 선택하면 DEFAULT 저장소가 있을 것이다. 오른쪽 수정버튼을 이용하여 적당한 스케줄을 걸어놓으면 .m2 밑의 스냅샷을 설정대로 지워진다.


디렉토리를 조사해보니 Continuum의 빌드 결과 정보를 저장하는 디렉토리도 꽤 커진다. Purge 설정에서 Add 하면 buildOutput 청소 설정도 걸 수 있다.

Maven 저장소(Nexus) 스냅샷 청소
스냅샷 deploy를 자주하면 maven 저장소에도 날짜별로 계속 쌓인다. 당연히 Nexus에도 이를 청소해 주는 기능이 있다. "Administration" 메뉴군에 "Scheduled Task"에서 여러 스케줄 작업을 설정할 수 있는데 여기서 반드시 Snapshot을 주기적으로 삭제하는 작업을 걸어두는게 좋다. 특별한 경우가 아니라면 하루 이틀 스냅샷만 남기고 지운다.



이렇게 설정을 하지 않으며 개발하다가 서버가 제대로 동작하지 않는데 갑자기 일어나는 일이라 당황하고 삽질하는 경우도 있다.
물론 요즘 디스크가 싸고 용량도 크지만 만일을 위해 이 설정을 반드시하여 개발팀이 혼란에 빠지는 일이 없도록 사전에 예방하는 것이 좋을 것이다.



크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 행복한아빠

Maven FAQ

개발환경 2009/01/20 23:47
"올바른 성장과 따뜻한 나눔"이 있는 넥스트리
  메이븐을 이용하다 개발하다 보면 자주하는 부딪히는 질문들이 있다. 자꾸 Maven 사이트에서 찾아보지 말고 한 번 맘먹고 정리해본다.

원문:  http://maven.apache.org/general.html

자주 물어보는 기술적인 질문들

1. WEB-INF/lib에 JAR가 포함되는 것을 어떻게 막나요? 난 단지 컴파일만 필요합니다.
2. 사용가능한 플러그인 목록을 어떻게 보나요?
3. 내가 어떤 버전의 플러그인을 사용하고 있는지 어떻게 알 수 있나요?
4. Maven 2에서 Ant 타스크를 어떻게 사용할 수 있나요?
5. JVM target과 source를 선택해서 컴파일하려면 어떻게 설정해야 하나요?
6. 나만의 디렉토리 구조를 생성하는게 가능한가요?
7. 소스코드가 어디에 있나요? Maven2 사이트에서 눈을 씻고 찾아봐도 링크를 못찾겠어요.
8. Maven이 디펜던시를 다운로드하지 못하는 것 같아요. 내가 올바로 설치한건가요?
9. 내 로컬 저장소에 넣고 싶은 jar가 있습니다. 어떻게 여기에 복사하나요?
10. 메일링 리스트 구독을 취소하려면 어떻게 해야 하나요?
11. 테스트를 건너뛰려면 어떻게 하나요?
12. 하나의 단위테이스만 실행하려면 어떻게 하나요?
13. 사이트(site) 플러그인에서 특별한 문자셋을 다루려고 해요.
14. 내 디펜던시에 tools.jar를 어떻게 포함하나요?
15. Maven이 내 테스트 클래스를 컴파일만하고 실행하지는 않아요.
16. Maven SNAPSHOT 산출물은 어디에 있나요?
17. Maven XSD 스키마는 어디에?
18. Maven이 작동하지 않아요. 어떻게 도움을 얻죠?
19.실행 디버깅 출력이나 에러 메시지를 어떻게 보죠?
20. Mojo가 뭐죠?

1. WEB-INF/lib에 JAR가 포함되는 것을 어떻게 막나요? 난 단지 컴파일만 필요합니다.
이런 경우에는 provided 스코프(scope)를 사용해야 한다. 이것은 실행시간에 컨테이너나 JDK 같은 것이 제공한다고 Maven에게 알려준다.

2. 사용가능한 플러그인 목록을 어떻게 보나요?
"Available Plugins" 페이지의 그것들의 목록이 있다. 그리고 Maven2 저장소를 검색할 수 있는 몇 가지 정보가 더 있다. 다음을 참조하라.
http://maven.apache.org/plugins

3. 내가 어떤 버전의 플러그인을 사용하고 있는지 어떻게 알 수 있나요?
Maven Help 플러그인의 describe 골을 사용할 수 있다. 예를 들어 install 플러그인의 버전을 찾아보려면 아래와 같이 입력한다.
mvn -Dplugin=install help:describe

plugin 아규먼트로 아티팩트 아이디가 아니라 플러그인 접두사를 주는 것을 주의하라.

4. Maven 2에서 Ant 타스크를 어떻게 사용할 수 있나요?
현재 2가지 방법이 있다.
  • Java, Beanshell 또는 Java 비슷한 스크립트 언어로 만든 플러그인을 사용하기 위해서라면, "Ant 문서에서 소개하는 방법"을 이용하여 Ant 태스크를 쓸 수 있다.
  • 프로젝트에 맞춰서 만든 작은 양의 Ant 스크립트라면 AntRun 플러그인을 사용할 수 있다.

5. JVM target과 source를 선택해서 컴파일하려면 어떻게 설정해야 하나요?
pom에서 source와 target 파라메터를 설정해야 한다. 예를 들어 source와 target의 JVM이 1.5라면 pom에 다음과 같은 내용이 있어야 한다.
  ...
  <build>
  ...
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.0.2</version>
        <configuration>
          <source>1.5</source>
          <target>1.5</target>
       </configuration>
     </plugin>
   </plugins>
  ...
 </build>
  ...


6. 나만의 디렉토리 구조를 생성하는게 가능한가요?
물론 가능하다!
<build> 세션의 <sourceDirectory>, <resources>와 그 외 엘리먼트를 설정하면 된다.
덧붙여, 플러그인의 파일이나 디렉토리의 기본설정을 사용하지 않으면 다른 플러그인 설정도 바꿔야 할 수도 있다. (그냥 쓰는게 좋다. 그것이 Maven의 사상이고 관례이다.)

7. 소스코드가 어디에 있나요? Maven2 사이트에서 눈을 씻고 찾아봐도 링크를 못찾겠어요.
소스코드는 subversion에서 찾을 수 있다.: http://svn.apache.org/repos/asf/maven/components/trunk
더 정보가 필요하다면 "Building Maven 2.0"를 보라.

8. Maven이 디펜던시를 다운로드하지 못하는 것 같아요. 내가 올바로 설치한건가요?
아마 Maven이 proxy를 사용하도록 설정해야 할 것이다. Maven이 proxy를 사용하는 방법은 "Configuring a proxy"를 보라.

9. 내 로컬 저장소에 넣고 싶은 jar가 있습니다. 어떻게 여기에 복사하나요?
Maven 저장소의 레이아웃을 이해한다면 jar 파일을 올바를 위치에 바로 복사해도 된다. Maven이 다음에 작동할 때 jar 파일을 찾을 것이다.
Maven 저장소의 레이아웃 이해에 확신이 가지 않는다면, 단 다음과 같이 한줄의 명령으로 jar 파일을 저장소에 로드할 수 있다.
mvn install:install-file
  -Dfile=<path-to-file>
  -DgroupId=<group-id>
  -DartifactId=<artifact-id>
  -Dversion=<version>
  -Dpackaging=<packaging>
  -DgeneratePom=true
Where: <path-to-file>  the path to the file to load
       <group-id>      the group that the file should be registered under
       <artifact-id>   the artifact name for the file
       <version>       the version of the file
       <packaging>     the packaging of the file e.g. jar

이 명령은 파일을 maven 저장소에 로드하고 필요하면 이름도 바뀔 것이다. (maven 규칙에 따라)


10. 메일링 리스트 구독을 취소하려면 어떻게 해야 하나요?
메일링 리스트 구독을 취소하려면 간단히 다음 주소로 메시지를 보낸다.
[mailing-list]-unsubscribe@maven.apache.org
그러니까 users@maven.apache.org 에 메일링 리스트 구독을 했었으면 리스트에서 뺄려면 users-unsubscribe@maven.apache.org에 메시지를 보내야 한다. 


11. 테스트를 건너뛰려면 어떻게 하나요?
명령행에서 -Dmaven.test.skip=true 파라메터를 추가한다.

12. 하나의 단위테이스만 실행하려면 어떻게 하나요?
명령행에서 -Dtest=MyTest 파라메터를 사용한다. 주의: 전체 패키지를 지정하지 않는다.(org.apache.x.y.MyTest)

13. 사이트(site) 플러그인에서 특별한 문자셋을 다루려고 해요.
사용하는 IDE에서 정확한 인코딩을 사용하도록 설정한다. 이클립스라면 eclipse.ini 파일에 -Dfile.encoding=ISO-8859-1 을 추가한다.
pom에서 출력 인코딩을 설정한다.
  ...
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-site-plugin</artifactId>
    <version>2.0-beta-6</version>
    <configuration>
      <outputEncoding>UTF-8</outputEncoding>
   </configuration>
 </plugin>
  ...
mvn이 사용하는 파일 인코딩을 설정한다. MAVEN_OPTS에 IDE와 같이 인코딩을 추가한다. $HOME/.pfofile 에 MAVEN_OPTS="-Dfile.encoding=ISO-8859-1"을 추가하면 된다.

14. 디펜던시에 tools.jar를 어떻게 포함하나요?
다음 코드는 Windows, Linux 그리고 Solaris에서 JDK의 tools.jar를 포함시킨다. (Mac OS X 와 몇가지 free JDK의 runtime에는 이미 포함되어 있다.)
...
  <profiles>
    <profile>
      <id>default-tools.jar</id>
      <activation>
        <property>
          <name>java.vendor</name>
          <value>Sun Microsystems Inc.</value>
       </property>
     </activation>
      <dependencies>
        <dependency>
          <groupId>com.sun</groupId>
          <artifactId>tools</artifactId>
          <version>1.4.2</version>
          <scope>system</scope>
          <systemPath>${java.home}/../lib/tools.jar</systemPath>
       </dependency>
     </dependencies>
   </profile>
 </profiles>
  ...


15. Maven이 내 테스트 클래스를 컴파일만하고 실행하지는 않아요.
surefile 플러그인이 테스트들을 실행한다.  무심코 ${test}에 값을 할당하면 surefile 플러그인이 특정 테스트 클래스들만 수행하도록 설정된다. settings.xml과 pom.xml에 다음과 같이 "test" 속성이 설정되어 있는지 검사한다.
  ...
  <properties>
    <property>
      <name>test</name>
      <value>some-value</value>
    </property>
 </properties>
  ...
또는
 ...
  <properties>
    <test>some-value</test>
 </properties>
  ...


16. Maven SNAPSHOT 산출물은 어디에 있나요?
Maven이나 플러그인의 개발 버전을 빌드하고자 한다면 maven 스냅샷 저장소에 접근할 필요가 있다.
"플러그인 스냅샷 안내"를 보고 settings.xml을 업데이트 해야 한다.

17. Maven XSD 스키마는 어디에?
Maven XSD 는 "여기"에 있고 Maven Settings XSD는 "여기"에 있다.
당신이 즐겨쓰는 IDE는 아마 pom.xml과 settings.xml 편집을 위해 XSD 스키마를 지원할 것이다.
다음과 같이 설정할 필요가 있다.

<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/maven-v4_0_0.xsd">
  ...
</project>


<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                      http://maven.apache.org/xsd/settings-1.0.0.xsd">
  ...
</settings>

18. Maven이 작동하지 않아요. 어떻게 도움을 얻죠?
"도움 얻기" 페이지에 유용한 리소스를 올려놓았다.

19.실행 디버깅 출력이나 에러 메시지를 어떻게 보죠?
-X 파라메터나 -e 파라메터를 이용해 maven을 실행하면 된다. 더 자세한 정보를 보기 위해 다음과 같이 실행한다.
mvn --help

20. Mojo가 뭐죠?
mojo를 Maven plain Old Java Object를 말한다. 모든 mojo는 maven에서 실행가능한 goal이다. 그리고 플러그인은 하나 이상의 관련된 mojo들의 배포판이다.

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 행복한아빠
"올바른 성장과 따뜻한 나눔"이 있는 넥스트리
사용자 삽입 이미지
Windows 개발환경에서 Maven, eclipse 그리고 개발 WAS로 Jetty를 사용하여 개발을 하다가 심각한 문제를 발견했다.
Jetty가 구동되면 한번 읽은 정적파일 (css, js, image 등)을 수정할 경우 다음과 같은 에러가 발생한다.


사용자 삽입 이미지

Windows에서만 이런 현상이 발생하는데 그 현상은 하나의 프로세스(jetty)가 파일을 오픈한 경우 다른 프로세스(eclipse)가 그 파일을 쓸 수 없다는 것이다. 이 경우 Jetty를 내렸다 올리면 저장이 가능하기는 하다. 그러나 css나 javascript(js) 파일을 수정할 때마다 Jetty를 재기동하는 것은 여간 귀찮은 일이 아니다.

Jetty는 성능향상을 위해 정적파일은 캐싱하는데 개발 시 이 캐시를 꺼 두면 이런 현상이 사라진다.
(참조: http://docs.codehaus.org/display/JETTY/Save+could+not+be+completed )

Maven jetty 플러그인 사용자의 해결책
Jetty의 캐싱기능을 조절하기 위해서는 webdefault.xml 파일이 필요하다. 이 파일은 jetty.jar 압축을 풀면 org/mortbay/jetty/webapp/webdefault.xml 에 있다. 압축을 풀어 이 파일은 프로젝트 폴더내 적당한 디렉토리에 위치해 둔다. 그리고 다음 부분을 false로 수정한다.

...
    <init-param>
      <param-name>useFileMappedBuffer</param-name>
      <param-value>false</param-value>
    </init-param>
...

pom.xml 에 jetty 플러그인 설정 부분에 다음을 추가한다.

...
  <plugins>
   <plugin>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>maven-jetty-plugin</artifactId>
    <version>6.1.5</version>
    <configuration>
     <contextPath>/mywebapp</contextPath>
     <jettyConfig>./jetty.xml</jettyConfig>
     <webDefaultXml>src/test/resources/webdefault.xml</webDefaultXml>
    </configuration>
   </plugin>
  </plugins>
...

물론 webDefaultXml의 내용은 위에서 풀어놓은 파일 위치를 지정하면 된다.

(참조: http://www.mail-archive.com/users@appfuse.dev.java.net/msg09886.html)


다른 환경 사용자의 해결책
다음 URL을 참조한다.
http://docs.codehaus.org/display/JETTY/Files+locked+on+Windows

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 행복한아빠
"올바른 성장과 따뜻한 나눔"이 있는 넥스트리
사용자 삽입 이미지
 Maven 개발으로 Web application 개발시 jetty 플로그인을 사용하면 별도의 WAS를 설치할 필요없이 다음과 같은 명령어로 바로 WebApp을 실행할 수 있다.

prompt> mvn jetty:run

이 플러그인을 실행하기 위해서는 pom.xml 의 플러그인 부분에 jetty 플러그인을 다음과 같이 설치해야 한다.

...
 <build>
  <plugins>
   <plugin>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>maven-jetty-plugin</artifactId>
    <version>6.1.5</version>
    <configuration>
     <contextPath>/mywebapp</contextPath>
    </configuration>
   </plugin>
  </plugins>
 </build>
...

이 경우 기본 8080 포트에 /mywebapp 를 컨텍스트 루트로 이용해 jetty를 실행한다. 이 포트를 변경하기 위해서 configuration에 다음을 추가한다.

...
 <build>
  <plugins>
   <plugin>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>maven-jetty-plugin</artifactId>
    <version>6.1.5</version>
    <configuration>
     <contextPath>/mywebapp</contextPath>
     <connectors>
      <connector
       implementation="org.mortbay.jetty.nio.SelectChannelConnector">
       <port>8082</port>
       <maxIdleTime>60000</maxIdleTime>
      </connector>
     </connectors>

    </configuration>
   </plugin>
  </plugins>
 </build>

참조: http://docs.codehaus.org/display/JETTY/Maven+Jetty+Plugin 

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 행복한아빠
TAG jetty, maven, port