서블릿 3.0 메이븐 의존성은?

2.5까지는 groupId가 javax.servlet이고 artifactId가 servlet-api이고 version은 2.4나 2.5썼었으니까 3.0도 버전만 3.0으로 바꾸면 되겠지라고 생각했지만 안 그랬다.

그래서 좀 찾아봤는데 이게 답인것 같다.

http://stackoverflow.com/questions/1979957/maven-dependency-for-servlet-3-0-api

여길보면 조금 엉뚱한게 답변으로 채택되어있는데 굳이 써드파티 메이븐 저장소에서 끌어오도록 하느니.. 되도록이면 중앙 저장소에서 가져오는게 더 깔끔하고 신뢰가간다. 그래서 난 앞으로 저렇게 쓸 계획이다.

[메이븐 저장소] war 버전 Nexus 설치 및 설정

http://www.sonatype.com/books/nexus-book/reference/install.html

1. 다운받기

http://nexus.sonatype.org/downloads/

이곳에서 번들 형태를 받을 수도 있고 war 파일을 받을 수도 있습니다. 번들형태는 서블릿 컨테이너가 내장된 형태로 제공되고 있고 war는 기존의 서블릿 컨테이너나 애플리케이션 서버에 배포해서 설치할 수 있는 형태로 제공됩니다.

war 버전을 설치할테니 최신버전 war 파일을 다운 받습니다.

2. 톰캣에 배포

톰캣 홈 디렉토리/webapp 폴더에 복사해 넣습니다. 이때 war 파일 이름을 nexus.war로 바꿔주면 URL이 좀 간단해 집니다.

mv ./nexus-webapp-1.8.0.1.war ./nexus.war

이제 톰캣 홈 디렉토리/bin 폴더로 가서 톰캣을 실행합니다.

./catalina.sh start

3. Nexus로 접속하기

http://localhost:8080/nexus/

war 파일 이름을 nexus.war로 변경했기 때문에 톰캣을 실행하고 나면 위와 같은 URL로 Nexus에 접근할 수 있습니다.

4. Admin 로그인 하기

Nexus를 설치하고나면 우선 로그인을 해서 관리자 계정 비밀번호를 변경해야 합니다. 그럴려면 로그인을 해야 하는데 기본 계정은 다음과 같습니다.

admin/admin123

화면 우측 상단의 Log In 링크를 클릭해 로그인합니다.

그럼 이렇게 왼쪽에 몇가지 관리용 탭이 생기는데 그중에 Security 탭에서 비번을 변경하면 됩니다.

그밖에도 배포용 계정도 기본으로 설정되는데 그것도 역시 비번을 바꿔주는게 좋습니다.

http://www.sonatype.com/books/nexus-book/reference/install-sect-repoman-post-install.html

여기를 참조하세요.

5. 저장소 추가하기

기본으로 여러 저장소가 설정되어 있는데 group, proxy, hosted 이 세종류만 잘 알면 됩니다.

group은 nexus에 설정되어 있는 다른 저장소들을 하나로 묶은 저장소로 생각하면 되는데 그렇게 해야 메이븐의 저장소 설정을 간추릴 수 있습니다.

proxy는 다른곳에 있는 기존의 메이븐 저장소를 등록하는 겁니다. jboss와 spring 저장소를 proxy 형태로 등록해두면 이 Nexus에서 필요한 의존성을 jboss와 spring 저장소에서 받아올 수 있습니다.

hosted는 다른 저장소에 없는 파일 또는 proxy를 통해 제공받을 수 없는 파일인 경우에 직접 메이븐 저장소에 올려줘야 하는데 그럴 때 사용하는 저장소 형태가 바로 hosted 입니다. 그런데 이미 hosted 타입의 저장소는 기본으로 등록되기 때문에 별일 없다면 그걸 그냥 사용하면 됩니다.

그래서 보통 proxy를 추가하고 hosted에 필요한 라이브러리를 넣어주고 이 둘을 잘 조합해서 group으로 묶어주는 작업을 해야 합니다.

지금은 jboss 저장소를 proxy 저장소로 등록해 보겠습니다.

이런식으로 JBoss 저장소를 추가했습니다.

6. group 저장소 설정

이제 nexus에 기본으로 설정되어 있는 group 저장소인 Public Respositories라는 것을 설정합니다.

이런식으로 방금 추가한 JBoss 저장소를 Public Repositories에 추가해주면 됩니다.

7. 메이븐 설정

이제껏 설정한 Nexus를 통해 필요한 의존성을 가져오도록 하려면 메이븐의 settings.xml이나 각 프로젝트의 pom.xml에 저장소를 설정해줘야 합니다.

그럴려면 저장소 URL을 알아야하는데 Nexus의 Repository Path에 있다.

http://www.sonatype.com/books/nexus-book/reference/maven-sect-single-group.html

여기에 보면 설정이 들어있으니 참조하시길~


[메이븐 3.0] 병렬 빌드

https://cwiki.apache.org/confluence/display/MAVEN/Parallel+builds+in+Maven+3

메이븐 3이 배포되서 어떤 기능이 추가됐나 확인해 봤더니 병렬빌드가 가장 주요 기능인것 같다. mvn을 실행할 때 -T 옵션으로 해당 빌드에서 사용할 쓰레드 수와 코어 수를 설정할 수 있다.

mvn -T 4 골 or 페이스

이렇게 옵셥을 주면 쓰레드 4개를 사용해서 빌드하라는 것이다.

mvn -T 2C 골 or 페이스

이렇게 T 뒤에 C를 사용하면 코어당 사용할 쓰레드 수를 설정한 것이다. 즉 코어당 쓰레드를 두개씩를 사용하라는 것이다. 자신의 컴터가 듀얼코어면 쓰레드 4개를 사용하게 될 거고 쿼드코어면 쓰레드 8개를 사용해서 빌드하게 될 것이다.

실제로 빨라지는지 확인해보려고 봄싹 프로젝트의 test가 쓰레드 옵션을 사용했을 때와 그렇치 않을 때 속도를 비교해봤다.

1. mvn test

18.763초

2. mvn -T 4 test

18.739초

3. mvn clean test

23.810초

4. mvn -T 1C clean test

23.616초

흠.. 멀티 POM일 때 효과가 좋아보이지.. 단일 플젝에서는 거의 효과가 없는듯 하다.


[메이븐 프로파일] 운영시 배포할 설정 파일과 개발시 배포할 설정 파일 샤샥

운영시에 사용할 설정과 배포할 때 사용할 설정이 다르다. 어떻게 해야할까요? 예전에도 이 고민을 한적이 있었는데 마침 윤석군이랑 봄싹에 구글 캐린더 연동 서비스를 구현했는데 이런 상황이 또 발생했습니다.

개발 할때 사용할 구글 캘린더와 실제 운영시 사용할 구글 캘린더는 달라야 합니다. 혹은 개발 할 때는 캘린더 서비스를 무시할 수도 있어야 하는데 이 경우는 일단 제외하고 우선은 설정을 환경에 따라 구분해야 한다는 것에 초점을 맞췄습니다.
설정 정보가 구체적으로 어떻냐에 따라 방법도 달라질 수 있는데 이전에 봄싹에 적용한 방법은 다음과 같습.. 흠… 아닙니다.. 귀찮군요. 그냥 생략하고 메이븐 프로파일이나 정리하겠습니다. 어쨋든 이전에 사용한 방법은 메이븐을 사용하지 않은 방법이었는데.. 그게 다 장,단점이 있습니다.
이번에 사용할 방법은 메이븐 프로파일을 사용합니다.
일단 폴더를 저런식으로 구분했는데 뭐 저런 구조야 맘대로 정하시면 되겠죠. 중요한건 개발시 사용할 설정파일이 담겨있는 폴더와 운영시 사용할 설정파일이 담겨있는 폴더를 구분했다는 것 정도..
이제 pom.xml에서 <build> 부분에 개발시 사용할 설정이 담겨있는 폴더를 소스 리소스 폴더로 인식하도록 설정해 줍니다.
    <build>
        …
        <resources>
           …
            <resource>
                <directory>${project.basedir}/resources/development</directory>
                <excludes>
                    <exclude>**/*.java</exclude>
                </excludes>
            </resource>
        </resources>
        …
</build>
이렇게 말이죠. 대충 엘리먼트 이름만 봐도 아실테니 설명은 패스.
다음은 운영 환경에서는 저 폴더가 아니라 다른 폴더를 리소스 폴더로 등록해줘야 합니다. 따라서 pom.xml에 프로파일을 추가해 주고 그 안에서 재정의할 설정을 넣어주면 됩니다.
    <profiles>
        <profile>
            <id>production</id>
            <build>
                <resources>
                     …
                    <resource>
                        <directory>${project.basedir}/resources/production</directory>
                        <excludes>
                            <exclude>**/*.java</exclude>
                        </excludes>
                    </resource>
                </resources>
            </build>
        </profile>
    </profiles>
자 요렇게 해주면 더 프로파일을 가지고 빌드 할때는 운영시 사용할 설정 파일이 담겨있는 폴더를 소스 리소스 폴더로 인식해서 그 안에 있는 .java 파일을 제외한 모든 파일을 배포해줍니다.
마지막으로.. 그럼 저 프로파일을 가지고 빌드 하는 방법은?
mvn clean install -Pproduction -X
요런식으로 mvn을 실행할 때 -P프로파일명 을 주시면 됩니다. 저기서 사용한 -X는 디버깅용 출력에 사용하는 옵션이구요. 나머진 아시겠죠.
좋은점
– 빌드 담당자가 아닌 개발자들은 이전과 동일하게 계속 개발하면 된다.
– 저 설정들을 버전관리에 포함시킬 수 있다.
– 운영 서버에서 빌드 스크립트 설정만 한번 바꿔주면 된다. 그 이후로는 간편하다.
불편한점
– 빌드 담당자(SI에 이런 롤이 있는지 몰겠지만)가 메이븐을 쬐끔 알아야 한다.
사실 위에 적은 좋은점 불편한점은 위에서 생략하고 넘어간 이전 방식과 비교를 했을 때 더 분명한데.. 일단은 그 방법을 적기가 다소 귀찮고 본 글의 주제에도 맞지 않으니 그냥 생략합니다. 대충 세가지 방법을 고민해 뒀는데 나중에 정 한가하고 정 심심해지면 정리해봐야겠습니다.

[Maven] 빌드 할 떄 특정 폴더 삭제하기

http://maven.apache.org/plugins/maven-clean-plugin/examples/delete_additional_files.html

어헉…

빌드할 때 가끔 pom.xml에서 라이브러리 올렸는데 버전만 다르고 여러 개개 lib 폴더에 들어가는 바람에 에러나 생기는 현상이 종종 있는데;;

그걸 방지하기 위해

            <plugin>
                <artifactId>maven-clean-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <filesets>
                        <fileset>
                            <directory>web/WEB-INF/lib</directory>
                        </fileset>
                        <fileset>
                            <directory>web/WEB-INF/classes</directory>
                        </fileset>
                    </filesets>
                </configuration>
            </plugin>

여기서 clasess 폴더는 빠져도 되지만 lib 폴더는 꼭 넣도록 합시다.

저녁 약속을 깜빡하는 바람에 초스피드 블로깅