'Maven'에 해당되는 글 10건

  1. 2011.08.24 Maven, SVN 을 이용한 개발서버(Tomcat) 자동배포 하기
  2. 2011.08.24 Maven Jetty Plugin 으로 개발하면서 css, js, html 같은 정적 파일이 저장안될때
  3. 2011.08.22 Eclipse Maven Jetty Plugin 으로 개발하면서 java.lang.OutOfMemoryError: PermGen space 익셉션이 발생할때.
  4. 2011.08.16 Maven & Jetty Plugin - PWC6345: There is an error in invoking javac. A full JDK (not just JRE) is required 에러가 날때. 4
  5. 2011.08.12 Eclipse Indigo Maven Plugin 설치 & 웹프로젝트 생성 3

Maven, SVN 을 이용한 개발서버(Tomcat) 자동배포 하기

이것저것 개발하기도 바쁜데 개발한것들을 자꾸 개발서버에 배포해 달라고 보채면 평온하던 마음에 욱 하는 마음이 살포시 자리잡게 된다.

나의 평온한 마음을 계속 유지하기 위해서 일정시간 마다 개발서버에 자동배포 되도록 잔머리를 굴려 보았다.

소스를 SVN으로 관리하고 있고 프로젝트가 Maven 프로젝트이고, 톰캣이 윈도우 서비스로 등록되 있어야 요렇게 하는것이 가능하다. 

개발서버가 윈도우기 때문에 배치파일과 윈도우  보조프로그램 > 시스템 도구 > 작업스케쥴러를 활용하기로 했다.

※ 만약 리눅스나 유닉스 같은 경우는 배치파일을 리눅스용 스크립트로 작성하고 고것을 cron 으로 돌리면 될것이다.

먼저 배치파일 스크립트 소스는 다음과 같다.
@echo off

:: 변수 설정 시작

set temp_build_dir=c:\tmp2\

:: SVN 에 등록된 프로젝트 이름
set project_name=MyProject

:: SVN 정보 설정
set svn_repository=https://xxx.xxx.xxx.xxx/svn/%project_name%
set svn_user=xxxxx
set svn_passowrd=xxxxxx

:: Maven에서 빌드후 생성해주는 war 파일,  보통 xxxx-0.0.1-SNAPSHOT.war 로 생성됨
set to_gen_war=xxxxxxx.war

:: 빌드후 생성된 war 파일을 복사할 대상 war 파일, 톰캣에서 바라보는 webapps 디렉토리
set target_webapp_dir=C:\webapps\xxxx\

:: 프로젝트의 컨텍스트 패스, / 면 ROOT 라고 적어주면 됨
set target_webapp_war_name=ROOT


:: service 에 등록된 톰캣 서비스이름으로 바꿔주셈~
set tomcat_service_name=tomcat6


:: 변수 설정 끝




:: 배포시작
:: 톰캣 정지
net stop %tomcat_service_name%


:: 기존 배포된 디렉토리 지우기
rd /s /q %target_webapp_dir%%target_webapp_war_name%


::체크아웃 받을 디렉토리가 존재하지 않으면 맨듬
IF NOT EXIST %temp_build_dir% (
	mkdir %temp_build_dir%
)

cd %temp_build_dir%

:: svn 에서 프로젝트를 CHECKOUT 받는다.
svn co %svn_repository% --username %svn_user% --password %svn_passowrd%

cd %project_name%

:: maven 으로 war 파일 생성될때까지 기다림
start /wait cmd /c mvn clean package

cd target

:: war 파일을 개발서버 톰캣 webapps 폴더로 복사
copy %to_gen_war% %target_webapp_dir%%target_webapp_war_name%.war /y

:: 톰캣 시작
net start %tomcat_service_name%

개발서버배포.bat


상단에 있는 변수 설정하는 부분을 프로젝트에랑 개발서버 환경에 맞게 바꿔주면 된다.

스크립트를 보면 알겠지만 매우간단하다.


1. 톰캣 STOP
2. 기존 배포된 디렉토리 지우기 
3. SVN 으로 소스 체크아웃
4. Maven으로 war 파일 생성
5. 생성된 war 파일 복사
6. 톰캣 START

요런 과정을 거친다.



위 스크립트가 실행되기 위해서는 svn, mvn 명령어가 아무데서나 실행될수 있도록 시스템 환경변수 PATH 에 해당경로를 추가해 줘야 한다. 

죠래 만든 스크립트를 이제 윈도우에 있는 기능인 작업 스케쥴러에 등록해서 원하는 시간에 실행되도록 추가해 주기만 하면 된다.

윈도우2008 이나 윈도우7 인 경우 대략 아래와 같을 것이고, XP 도 찾아보면 비슷한게 있을 것이다.


1. 새작업 만들기



2. 일반설정



 3. 트리거 설정(트리거탭)

매일 언제 실행할건지 설정한다.


4. 실행할 스크립트 설정(동작탭)

어떤 스크립트를 실행할것인지 선택


죠렇게 설정해 주고 스케쥴에 추가를 해주면 이제부터 설정한 시간마다 SVN에서 소스를 체크아웃 받아 서버에다 자동 배포를 시켜줄것이다.
 

Maven Jetty Plugin 으로 개발하면서 css, js, html 같은 정적 파일이 저장안될때

이클립스에서 maven을 쓰면서 jetty plugin 으로 서버를 띄워놓고 개발을 할때

css, js, html 같은 정적 컨텐츠 파일을 편집해서 저장할려고 하면

"요청한 작업은, 사용자가 매핑한 구역이 열려 있는 상태인 파일에서 수행할 수 없습니다" 요런 야리꾸리한 에러 메시지가 뜨면서 저장이 안된다.



어디서 찾아봤는데 이런 현상은 윈도우에서만 발생하고 서버가 올라간 상태에서 해당파일을 jetty 가 참조하고 있어서 동시에 파일을 변경할수 없어서 나는 에러라고 한다. 

요것을 해결하기 위한 방법은

1. pom.xml 에서 jetty plugin 이 설정된 부분에 아래처럼 <defaultsDescriptor>위치</defaultsDescriptor> 를 추가해준다.
<plugin>
	<groupId>org.mortbay.jetty</groupId>
	<artifactId>jetty-maven-plugin</artifactId>
	<version>8.0.0.RC0</version>
	<configuration>
		<scanIntervalSeconds>1</scanIntervalSeconds>
		<webAppConfig>
			<defaultsDescriptor>src/main/resources/jetty/webdefault.xml</defaultsDescriptor>
		</webAppConfig>
	</configuration>
</plugin>

 jetty 8.0.0. 어쩌고 하는 버전부터인지 몰라도 아무튼 최신버전은 webdefault.xml 위치를 설정하는 방법이 바껴서 위와 같은 태그로 설정해야 한다.

Maven Jetty Configuration 참고 URL : http://wiki.eclipse.org/Jetty/Feature/Jetty_Maven_Plugin





2. pom.xml에서 설정한 위치로 webdefault.xml 파일을 복사하고 webdefault.xml 파일에서 init-param 들 중에 useFileMappedBuffer 이라는 항목이 true 로 설정되 있을건데 요걸 false 로 바꿔주면 된다.
<init-param>
	<param-name>useFileMappedBuffer</param-name>
	<param-value>false</param-value>
</init-param>

webdefault.xml

 요렇게만 해주면 이제부터 파일이 훅훅 저장이 잘 된다.




※ 옛날 버전에서 webdefault.xml 위치 지정 : configuration 태그 아래에 바로 <webDefaultXml>위치</webDefaultXml> 요렇게 설정하면 된다.
<configuration>
	<webDefaultXml>src/main/resources/jetty/webdefault.xml</webDefaultXml>
</configuration>
옛날버전 Jetty Configuration 참고 URL : http://docs.codehaus.org/display/JETTY/Maven+Jetty+Plugin



※ 디폴트 webdefault.xml 위치
[메이븐로컬레파지토리]\org\eclipse\jetty\jetty-webapp\플러그인버전\jetty-webapp-XXX.jar 파일안에 org/eclipse/jetty/webapp/ 폴더 안에 있다~~
 
[메이븐로컬레파지토리] 경로는 별다른 설정을 안했다면 사용자 홈 디렉토리\.m2\repository 이다.

나같은 경우는 C:\Users\Administrator\.m2\repository 요기임.

Eclipse Maven Jetty Plugin 으로 개발하면서 java.lang.OutOfMemoryError: PermGen space 익셉션이 발생할때.

Run > Run Configurations 로 가서 실행할때 썼던 런설정을 왼쪽트리에서 선택하고, 아래 그림처럼 JRE VM arguments에 셋팅해주면됨

 

VM arguments 셋팅


추가해줄 항목
-XX:MaxPermSize=256m
-Xms40m
-Xmx512m

※ Jetty 뿐만 아니라 다른데서도 permgen space 에러가 나면 죠 위에 옵션을 jvm 구동시 옵션으로 주면 된다. 
 

Maven & Jetty Plugin - PWC6345: There is an error in invoking javac. A full JDK (not just JRE) is required 에러가 날때.

이클립에서 Maven과 Jetty Plugin을 이용해서 뭔가를 쪼물락 거릴때 저런 에러가 났다.

이유는 workspace 에서 사용하도록 디폴트로 설정된게 JDK 가 아닌 JRE 라서 나는 에러인것 같다.

죠것을 해결하기 위해서는

Window >  Preference > Java >  Installed JREs 에 가보면 현재 사용한다고 체크되 있는것이 JDK 가 이닌 JRE 일껀데 고 체크되있는 것을 클릭한후 Edit 버튼을 눌러서 JDK 로 바꿔주면 된다.

만약 JDK로 바꿨는데 에러모양이 뜨면 Project > Clean 으로 클린을 한번싹 시켜주면 된다~

선택후 Edit 버튼클릭


JDK 가 설치된 디렉토리로 변경해준다.


Eclipse Indigo Maven Plugin 설치 & 웹프로젝트 생성


처음에 Maven을 사용하기 시작했던 이유는 jar 파일을 받기 쉬워서 였다 -_-;

지금도 디펜던시만 추가해주면 인터넷에서 자동으로 jar파일을 받아주는 기능을 제일 좋아하고 제일 많이 써먹는다.

처음에는 저런거 왜 쓰나 하는 생각도 했었지만 입다물고 쓰다보니 쪼매씩 쓸만한 다른 것들도 알아가고 이것저것 편한것 같다. 한번 입다물고 써볼만한 가치는 충분히 있다고 본다.


아무튼!!

이클립 인디고 버전 부터는 Maven Plugin 이 기본 업데이트 목록에 포함되 있다. m2eclipe 인것 같은데 pom.xml 에디터나 뭐 그런것들이 이것저것 조금씩은 다른것 같다.

아무튼 플러그인을 설치할려면 Help > Install New Software 로 가서 Work with 란에 기본적으로 포함되 있는

Indigo - http://download.eclipse.org/releases/indigo 를 목록에서 선택하고 잠시 기다리면 플러그인 목록들이 쭉 나오는데

목록에 보면  General Purpose Tools 아래에 m2e 어쩌고 하는 것들이 있다. 목록에서 m2e 어쩌고 하는것 2개를 선택하고 Finish 버튼을 클릭해서 설치 하면 된다.

다 설치후 이클립을 껏다 키면 설치완료. 

Indio Update




다 설치했으니  샘플로 Maven용 웹어플리케이션 프로젝트를 하나 만들어보고 jetty 로 서버를 띄워보자.

File > New > Project 로 프로젝트 생성하는 창을 열어보면 기존에 없던 Maven 시리즈가 새로 추가되 있다. Maven Project 를 선택하고 Next

Maven Project 선택

 

Create Simple Project 에 체크하고 Next~

심플 프로젝트 체크




Group Id, Arifact Id 에 적당하게 쫌 있어보이게 입력하고 Packaging 은 웹어플 프로젝트이기 때문에 목록중에서 war를 선택한다. 나머지는 필수가 아니기 때문에 하고싶은데로~~ 하고 Finish 를 클릭해 프로젝트를 생성한다.

여기에서 Arifact Id는 프로젝트 명이 된다. 생성해 보면 안다. 

프로젝트 정보입력



war 프로젝트 디렉토리 구조


프로젝트를 맨들면 처음에 생성되는 디렉토리 구조는 위처럼 된다.(WEB-INF 는 기본적으로 생성되지 않고 따로 만들어야 된다.)

※ 굳이 위와같은 디렉토리 구조로 하지 않아도 된다. 원하면 전처럼 Dynamic Web Project 로 생생되는 디렉토리 구조로 바꿀수도 있고 Tomcat으로 서버를 띄울수도 있다. 고건 다음 기회에~

크게 보면 src 와 target 디렉토리가 생성되는 src는 당연히 java나 property나 이미지 파일들이나 js 파일이나 뭐 기타 등등등 프로젝트와 관련된  오만가지 것들이 위치할 디렉토리이다.

target 은 ant의 build 디렉토리처럼 빌드시키면 컴파일된 class 파일이나 뭐 고런것들이 들어간다.



쪼매더 상세하게 말해보면

/src/main/ java 는 Java 파일이 들어가겠고~

/src/main/resources 는 property 파일이나 Spring을 쓴다면 Spring 설정 xml 파일 같은게 들어간다. log4j.property 도 들어가겠구만. 그런데 또 굳이 꼭 이 디렉토리에 위치 안해도 된다. 하고싶으면 그냥 java 디렉토리에 때려 넣어도 된다.

/src/main/webapp 에는 html, jsp, css, js, 이미지 파일 기타등등의 파일을 넣어주면 됨. 

/src/test 는 뭐 당장은 크게 쓸일이 없는 디렉토리인데 하여튼 테스트와 관련된 것들이 들어간다. 여유 없는 사람들은 거의 쓸일이 없는 디렉토리이다. 

webpapp 에다 대충 확인할수 있는 html 이나 jsp 파일을 하나 맨들어 놓은 후 이제 jetty 로 서버를 띄어보자.




서버를 띄우기 전에 pom.xml에 jetty plugin을 사용한다고 설정해 줘야 한다.

이클립스 Helios 버전에서 사용하던 m2eclipse 플러그인의 pom.xml 에 에디터에는 Plugin 탭이 있었지만 이상하게도 Indio에서 설치한 m2eclipse 에는 plugin 탭이 없었다.

뭐 아무튼 직접 pom.xml 을 편집해도 되고 프로젝트명에서 오른쪽 버튼클릭해서 Maven > Add Plugin 으로 추가해도 된다.

Add Plugin을 클릭하면 뜨는 팝업창에서 검색어로 jetty 를 입력하면 목록이 쭉 뜨는데 거기서 org.mortbay.jetty   jetty-maven-plugin 을 선택하고 Ok를 클릭하면 pom.xml에 plugin 에 관련된 항목이 추가된다.

Maven Jetty Plugin 설정


<build>
	<plugins>
		<plugin>
			<groupId>org.mortbay.jetty</groupId>
			<artifactId>jetty-maven-plugin</artifactId>
			<version>8.0.0.M3</version>
		</plugin>
	</plugins>
</build>

이제 Jetty Plugin 에 관련된 설정도 끝났으니 Jetty 로 서버를 띄워보자. 프로젝트명에서 오른쪽 버튼 클릭 Run As > Maven Build 클릭하면 팝업창이 뜨는데 Goals 에 jetty:run 이라고 입력하고 Run 을 클릭하면 인터넷으로 Jetty Plugin을 다운로드 받은 뒤에 서버가 실행될 것이다.
(처음 실행하면 플러그인을 다운받느라고 시간이 쪼매 걸린다.)

 서버가 다 실행되면 http://localhost:8080/test.html 로 접속해 보면 뽓 뜬다. 

Tomcat 을 설치안해도 되고 간단히 pom.xml 에 설정만 해주면 지가 알아서 인터넷으로 다운받아 주니 이 얼마나 깔쌈한가!


※ Jetty 디폴트 포트인 8080 을 바꿀려면 Goals 에 jetty:run -Djetty.prot=원하는포트번호 를 입력하고 실행하면 다른 포트로 서버가 실행된다. 

내가 제일 좋아하는 기능인 jar 파일 가져오는것도 해보자. 테스트로 java mail 라이브러리를 가져와 보자!

pom.xml을 더블클릭하면 전용 에디터가 열리는데 아래쪽에 있는 탭중에서 Dependencies 를 클릭해서 Add 버튼을 클릭한다.

팝업창의 검색어란에 mail 이라 입력하면 또 목록이 쭉 뜬다. 그중에서 javax.mail   mail 을 선택해서 추가후 저장을 하면 또 인터넷에서 지가 알아서 mail-xxxx.jar 와 activation-xxx.jar 를 다운로드 받아 클래스패스에 추가시켜주서 자유롭게 
Javamail 라이브러리를 쓸수 있게된다.

디펜던시 설정


<dependency>
	<groupId>javax.mail</groupId>
	<artifactId>mail</artifactId>
	<version>1.4.1</version>
</dependency>
prev 1 2 next