'Maven'에 해당되는 글 10건

  1. 2011.10.26 maven 으로 executable jar 맨들기(maven-jar-plugin, maven-dependency-plugin 이용) 2
  2. 2011.10.23 Sonatype Nexus #2 : 설정 및 maven 과 연결하기 4
  3. 2011.10.23 Sonatype Nexus #1 : 톰캣에 설치하기
  4. 2011.10.14 이클립스 상에서 maven 을 이용해 원격서버로 배포하기 3
  5. 2011.10.13 maven package goal 로 war나 jar 파일 생성시 생성되는 파일명 설정하기

maven 으로 executable jar 맨들기(maven-jar-plugin, maven-dependency-plugin 이용)

일반 웹어플리케이션이 아닌 그냥 보통 일반 프로그램인 경우 maven packaging  타입을 war 가 아니라 jar 로 pom.xml 파일을 설정한다.

요래 설정한후 디펜던시들을 쪽쪽 추가하면서 후로그램을 맨들다 후로그램이 다 완성되었다면~~.

내가만든 후로그램과(Executable jar), 내 후로그램에서 사용한 라이브러리들을(디펜던시) 묶어서 패키징을 해야 한다.




요런 패키징을 위해서 프로젝트 pom.xml 의 build 엘리먼트를 요래 설정해 주면된다. 
설명은 주석으로 대신함.
<properties>
	<deploy.target.dir>c:/myproject</deploy.target.dir>
	<lib.dir>lib</lib.dir>
	<jar.name>myprogram</jar.name>
</properties>
	
<build>
	<plugins>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-jar-plugin</artifactId>
			<version>2.3.2</version>
			
			<configuration>
				<finalName>${jar.name}</finalName>
				<!-- jar 파일이 생성될 폴더 -->
				<outputDirectory>${deploy.target.dir}</outputDirectory>
				<archive>
					<manifest>
						<!-- public static void main() 함수가 있는 클래스 지정 -->
						<mainClass>oasyss.Main</mainClass>
						
						<!-- jar 파일 META-INF/MANIFEST.MF 에 클래스패스 정보 추가 -->
						<addClasspath>true</addClasspath>
						
						<!-- 
							클래스패스에 추가시 prefix 설정 
							ex) log4j-1.2.16.jar -> lib/log4j-1.2.16.jar 로 추가됨 
						-->
						<classpathPrefix>${lib.dir}/</classpathPrefix>
					</manifest>
				</archive>
			</configuration>
		</plugin>
		
		<!-- package 실행할때 프로젝트 디펜던시들을 특정폴더로 복사해주게 설정  -->
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-dependency-plugin</artifactId>
			<version>2.3</version>
			<executions>
				<execution>
					<id>copy-dependencies</id>
					<phase>package</phase>
					<goals>
						<goal>copy-dependencies</goal>
					</goals>
				</execution>
			</executions>
			<configuration>
				<outputDirectory>${deploy.target.dir}/${lib.dir}</outputDirectory>
				<overWriteIfNewer>true</overWriteIfNewer>
			</configuration>
		</plugin>
	</plugins>
</build>




요래 해준다음 mvn clean package 를 뽓 실행시켜주면, deploy.target.dir 로 설정된 c:\myproject 폴더에 myprogram.jar 파일이 생성되고 c:\myproject\lib 폴더에 디펜던시들이 쪽 복사가 된다.



※ 요 jar 파일을 실행할려면

일반 자바후로그램인 경우 java -jar myprogram.jar  로
Swing이나 SWT 같은 GUI 후로그램인 경우 javaw -jar myprogram.jar 로 실행하면 된다.








Sonatype Nexus #2 : 설정 및 maven 과 연결하기

Sonatype Nexus 를 설치 했다고 해서 바로 사설 리파지토리 기능을 하는건 아니다.

몇가지 설정을 쪼물쪼물 해줘야 된다.

사실 다른 자료들을 찾아보고 설치까지는 했는데 그 뒤 설정하는걸 설명안해주고 설치만 하면 다되는것 처럼 적혀 있어서 난 도대체 왜 안될까 하면서 Nexus 개후짐 이라고 결론을 내릴뻔 했다. 나의 무식때문에 만든다고 용써준 사람을 욕하다니.


관리자로 로그인 한 다음 왼쪽 메뉴중에 Repositories 를 클릭하면 디폴트로 등록된 리파지토리들 목록이 나온다.




먼저 목록중에 Public Repositoires 를 클릭하면 아래쪽에 상세내용이 나오는데 Configuration 탭으로 이동한다.


Ordered Group Repositories 에 디폴트로 여러개가 등록도 있을껀데 일단 Maven Central 만 남기고 다 빼버리자, 나중에 원하는걸 필요할때마다 맨들어서 추가해 주면 된다.

요부분에서도 그동안의 고정관념 때문에 살짝 삽질을 했는데, 나의 고정관념 상으로는 죠렇게 박스 두개가 있으면 오른쪽 박스가 당연히 선택할 대상들이 들어가는 박스라고 생각해서 아무리 설정을 해도 안되는 것이였다 -_-;

외국 사람들은 반대로 생각하나 보다 -_-;  아무튼 결론적으로 하나로 묶어줄 애들은 왼쪽 Ordered Group Repositories 에다 추가시켜주면 된다 -_-

죠렇게 해 준다음에 아래쪽에 Save 버튼을 눌러 저장을 해준다.





고 다음으로 설정할 것은 리파지토리 목록중에 Maven Central 을 설정하는 것이다. 역시 클릭하면 아래쪽에 상세화면이 나오는데 Configuration 탭으로 이동하자.


여기서 할일은 Download Remote Indexes 가 디폴트로 False 로 되 있을건데 고걸 True 로 바꿔준다음 Save!

Download Remote Indexes 가 True 로 되있으면, Remote Storage Location 으로 설정된 http://repo1.maven.org/maven2 에 접속해서 인덱스 파일을 받아와서 고 인덱스 파일이랑 똑같이 나의 서버에 인덱스를 맨들어 준다.

Save 를 하면 인덱스파일을 다운로드 받아 인덱스를 업데이트 하는 작업이 시작된다. 이 작업이 완료되면 리프레쉬를 한다음에, 상단의 탭중Browse Index 탭을 클릭해보면 전에 하나도 안보이던 목록들이 쪽 생성이 되 있을 것이다.



인덱싱하는 작업이 쪼매 오래 걸리는데 작업이 완료 됬는지 계속 작업중인지 볼려면 왼쪽 메뉴중 Administration > Scheduled Tasks 를 클릭해 보면 알수 있다.


이 메뉴는 현재 Nexus 에서 돌아가고 있는 Task 를 보거나 아니면 원하는 Task를 스캐쥴링 하도록 등록하는 메뉴인것 같다.

아무튼 Task 목록을 보면 Maven Central 리파지토리의 인덱스를 다운로드 받아서 인덱싱을 하는 작업이 진행중인것을 볼수 있다.

작업이 완료되면 목록에서 사라지는데, 상단의 리프레쉬 버튼을 클릭하다 보면 언젠가는 사라질 것이다. -_-;



인덱싱 작업이 완료되면 이제부터 정상적인 사설 리파지토리 기능을 수행할 수 있다.!!




인덱싱된 결과를 볼려면 Pubic Repositories 를 클릭한다음 Browse Index 탭을 클릭해 보자.


인덱싱을 하기전에는 안보이던 여러가지 목록들이 간지나게 쫙 펼쳐져 있다.

※ Browse Index 탭에 보여지는 것들은 내가 맨든 사설리파지토리로 제공가능한 디펜던시들이지 아직 나의 서버로 다운로드가 된 상태는 아니다.
※ 나의 서버로 누군가가 디펜던시를 요청하면 일단 최초로 proxy 대상 리파지토리에서 해당 디펜던시를 다운로드 받아 이후 요청부터 캐싱을 하게 된다
※  현재 다운로드 받아 캐싱하고 있는 디펜던시들을 볼려면 Browse Storage 탭을 클릭해 보면 된다.





여기까지만 하면 일단 설정을 대충 다 끝났고 maven 에서 나의 서버를 바라보게 설정만 해주면 된다.

위 스크린샷에서 보면 리파지토리 목록 왼 오른쪽에 있는 Repository Path를 요렇게 pom.xml 파일의 repository 로 설정해 주거나 바꿔주면 된다.

많은 현재 디폴트로 등록된 리파지토리들이 많이 있지만 이중에서 다른 리파지토리들을 하나로 묶어주는 group 타입의 public 리파지토리를 메이븐에서 바라보도록 설정하자~

<repositories>
	<repository> 
		<id>central</id>
		<url>http://127.0.0.1:8080/content/groups/public</url>
		<releases><enabled>true</enabled></releases>
		<snapshots><enabled>true</enabled></snapshots>
	</repository>
</repositories>

<pluginRepositories>
	<pluginRepository>
		<id>central</id>
		<url>http://127.0.0.1:8080/content/groups/public</url>
		<releases><enabled>true</enabled></releases>
		<snapshots><enabled>true</enabled></snapshots>
	</pluginRepository>
</pluginRepositories>


Nexus 설명서를 보면 maven 의 settings.xml 파일인가 고걸 수정하게 하던데 그러면 다른 개발자들도 settings.xml 을 귀찮게 수정해야 하기 때문에 나는 svn으로 공유되는 pom.xml 파일을 수정했다.


아무튼 요렇게 한 후 나의 서버가 잘 돌아가나 테스트를 해보기 위해 pom.xml 파일에 디펜던시를 아무거나 하나 추가해 보자.
<dependency>
	<groupId>abbot</groupId>
	<artifactId>abbot</artifactId>
	<version>0.12.3</version>
</dependency>



음~ 잘되는 것 같다. 확실히 확인하기 위해서 위에서 설명했던 현재 캐싱된 디펜던시들을 보여주는 Browse Storage 탭을 클릭해 보면 pom.xml 파일에 추가했던 abbot 뭐시기가 캐싱된 것을 확인할 수 있다.



지금까지 한 설정은 딸랑 maven central 리파지토리만 바라보도록 설정했는데, 필요에 따라 다른 외부 리파지토리를 proxy 타입으로 추가 시킨다음

하나로 묶어주는 기능을 하는 group 타입의 Public Repositories 에다 포함 시켜주고 maven 에서는 이 public 리파지토리만 바라보도록 하면

pom.xml 파일에 추가적으로 <repository/> 를 추가할 필요도 없고 한번 캐싱된건 나의 서버에서 빠르게 다운로드 받을 수 있을 것이다.




이건 기본적인 사설 리파지토리 기능이고, 다음 포스트에서는 이렇게 맨들걸 쪼매 더 활용할 수 있도록 이것저것 다른 설정들을 쪼물거려 보겠다.





Sonatype Nexus #1 : 톰캣에 설치하기


메이븐을 빌드툴로 써서 개발하다 보면 편안하긴 편안하지만 인터넷으로 라이브러리나 훌러그인을 다운로드 받는 시간이 쫌 걸린다는게

살짝 불편한 점이긴 하다. 뭐 물론 나의 로컬로 라이브러리가 한번 다운로드되면 그 뒤론 다시 다운로드 받지 않아서 빠르긴 하지만

컴퓨터를 포맷하거나 했을때는 다시 다운로드 받는 과정을 거쳐야 하기 때문에 아주 사소히 불편스럽다.


요런 시간 소모를 해소하기 위해 사설 메이븐 리파지토리를 맹글어 보겠다.

메이븐 사설 리파지토리를 맹글어 주는 제품은 많다고 하던데 기능이야 뭐~ 다 비슷비슷 하겠고 UI 가 쫌 깔쌈하다는 Sonatype Nexus 를 설치해 보겠다. 


웹사이트 :  http://nexus.sonatype.org/
다운로드 사이트 : http://nexus.sonatype.org/downloads/

이 글을 작성하는 시점에서 제일 최신버전이 1.9.2.3 버전이다.



다운로드 사이트에 가면 파일들 목록이 쪽 나오는데 그중에서  nexus-webapp-1.9.2.3.war 요런 war 파일을 다운로드 받으면 된다.



war 파일이라서 톰캣이나 다른 것들에 설치하는건 일도 아니다.

모를 사람도 있으니 간단히 설명하겠다. 먼저  nexus-webapp-1.9.2.3.war 파일명을 ROOT.war 로 바꾼다.

※ 나는 http://127.0.0.1:8080 으로 접근하기 위해서 ROOT.war 로 바꾼것이지 만약 http://127.0.0.1:8080/nexus 로 접근하고 싶다면 nexus.war 로 파일명을 바꾸면 된다.

파일명을 바꿨으면 고 파일을

톰캣 설치디렉토리/webapps/ 아래에다 복사를 하고 톰캣을 시작하면 설치가 끝난다. 




브라우져로 주소창에 http://127.0.0.1:8080 을 입력하고 접속해 보자~ 


뽓 하고 정상적으로 접근이 된다.




관리자로 접속을 하기 위해서는 오른쪽 귀퉁이에 있는 Log In 버튼을 클릭하고 아이디/패스워드에 admin / admin123 을 입력하면 된다.



이게 심하게 보안이 필요할것 같진 않지만 그래도 기분상 Security > Change Password 에 가서 관리자의 패스위드도 변경해 주자.

왼쪽 메뉴중에 Repositories 를 클릭해 보면 친절하게 디폴트로 등록해준 메이븐 리파지토리들이 보인다.

지금 당장은 미리 등록해준 리파지토리들이 다 필요하진 않고 Public Repositories 랑 Maven Central 요거 두개 정도만 필요하다.




리파지토리 타입을 보면 group, hosted, proxy, virtual 같은게 보이는데 간단하게 설명하면

group 은 hosted, proxy 타입등 등록된 리파지토리들을 논리적으로 묶어주는 리파지토리 타입이다.
▣ hosted 는 maven 야리꾸리한 듣보잡 라이브러리나 상용제품에서 제공하는 라이브러리 같이 maven 리파지토리에 등록이 안된 라이브러리를 등록해 주는 리파지토리 타입이다. 따로 jar 파일 같은걸 등록하고 싶다면 요 타입을 쓰면 된다.
▣ proxy 는  http://repo1.maven.org/maven2/ 은 같은 인터넷상의 다른 메이븐 리파지토리를 캐싱해 주는 리파지토리 타입이다. 이 타입이 아마 가장 많이 쓰일것같다.
virtual 은 maven1, maven2 리파지토리를 상호변환 해주는 것인데 거의 쓸일은 없을것 같다.




대충 요런 타입들의 리파지토리들을 적절하게 짬뽕시켜 나만의~ 우리회사만의~ 리파지토리를 만들면 된다.  


대부분, 원하는 외부 주요 리파지토리들을 proxy 타입으로 여러개 등록하고, maven 리파지토리에 없는 라이브러리 등록용 hosted 타입도 하나 등록하고,

요것들을 group 타입 리파지토리로 하나로 묶어서 group 만 바라보면 되도록 하는 구성을 많이 쓰는 것 같다. 






아무튼 이렇게 하면 Nexus 설치는 끝나지만, 살짝 설정도 바꾸고, 리파지토리 인덱스도 업데이트 해줘야 maven 이랑 연결시켜서 사설 리파지토리의 역할을 할 수 있게 된다.

고건 다음 포스트에!!




이클립스 상에서 maven 을 이용해 원격서버로 배포하기


오늘 문득 톰캣을 새로 받을 일이 있어서 톰캣 사이트에 갔다가, 예전부터 있었겠지만 그동안 무심하게 쌩깠던 링크가 문득 눈에 들어왔다.

그것은 바로 톰캣 다운로드 받는 링크 아래 Tomcat Deployer 라는 것이였다.



요즘 개발 막바지라 이것저것 자질구래한걸 수정해달라는 요청사항이 많아서, 수정한다음에 구찮스럽게 자꾸 다시 배포를 해줘야 하는 일이 드럭게 많아졌다.

용써서 잘 맹글어 주는 것에 시간에 투자를 해야 하는데, 쓸데없는 일에 시간을 투자를 해야만 하는것이다.

구찮은걸 극도로 싫어하는 나로써는 그동안 눈에 들어오지도 않던 이 문득 보이는 Deployer 라는게 왠지 땡기기 시작했다. 나의 구세주 같은 느낌.

대충 설명서를 읽어보니 나의 로컬에서 원격서버로 배포를 시켜주는 툴인듯 했다.

그런데 받아서 압축을 풀어보니 요즘 잘 쓰지도 않는 ant 를 이용해서 뭔가를 해주는것 같았다. 

그런데 또 나는 잘 쓰지도 않을 뭔가를 또 받아서 압축을 풀고 설치하는게 또 무척이나 구찮게 느껴졌다.


왠지 ant 보다도 훨씬 좋다고 느껴지는 maven에서도 누군가 머리좋은 사람이 반드시 맹글어 놨을거란 신념을 가지고 구글에게 "tomcat deployer maven" 을 찾아주세요! 라고 요청했다.

뭐 역시 뭔가가 있었다.! 고것은 바로 tomcat-maven-plugin !!




maven 을 쓰기 시작하면서 tomcat-maven-plugin 플러그인 어쩌고 하는걸 검색하다가 많이 보았는데 나는 그냥 jetty plugin 처럼 tomcat 으로 서버를 띄어주는 것인줄로만 알고 그냥 쌩깠었다 -_- 

그런데!!! tomcat:deploy 요런 goal 이 있지 아니한가!!! 그렇다. 이제 이클립스에서 버튼한번만 클릭하면 현재 나의 이클립 상에 개발중인것을 고대로 원격서버에 배포를 시킬수가 있게 된 것이다.

구찮스럽게 느껴지기만 하면 배포작업도 "배포쫌 해주세염~" 그라면 "네! 기분좋게 후딱 해드릴깨요!!" 라고 사람좋은 표정을 지을수 있게 됬다.




잡설이 길어졌다. 내가 바라던 짖을 할려면 우째해야 하는가?

먼저 톰캣 매니저 사용자를 설정해 줘야 한다.

톰캣을 설치하면 기본적으로 같이 설치되는 웹어플중에 manager 라는게 있다. 톰캣 설치디렉토리/webapps 에 가보면 manager 라고 폴더가 하나 있을것이다. 이게 바로 그거다.

로컬에다 설치한 사람은 http://localhost:8080/manager/html 로 접속해 보라! 뭔 아이디랑 패스워드를 입력하라는 창이 뜰 것이다.


여기에 로그인 할 수 있는 사용자를 설정하는 곳은 톰캣설치디렉토리/conf/tomcat-users.xml 파일이다.

여기에다 살포시 요런 설정을 추가해 주면 된다. username 과 password 는 적당히 알아서 쫌 복잡하게~~
<role rolename="manager"/>
<user username="admin" password="test" roles="manager"/>



그런다음 다시 톰캣을 리스타트 하면 아까 설정한 아이디와 비밀번호로 로그인할수 있다.

뭐 사실 요 manager 를 이용하면 웹상에서도 서버를 중지하고 war 파일을 업로드 해서 배포를 할 수 있긴 하다. 하지만 역시 내가 바라는건 이클립 상에서 버튼 클릭한번~

이제 maven pom.xml 파일에 플러그인을 설정할 차례이다.

내가 테스트를 위해 샘플로 작성한 pom.xml 파일은 요렇다.
<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/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.tistory.stove99</groupId>
	<artifactId>DeployTest</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-war-plugin</artifactId>
				<version>2.1.1</version>
				<configuration>
					<warSourceDirectory>src/main/webapp</warSourceDirectory>
					<webXml>src/main/webapp/WEB-INF/web.xml</webXml>
				</configuration>
			</plugin>
			
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>tomcat-maven-plugin</artifactId>
				<version>1.1</version>
				<configuration>
					<url>http://127.0.0.1:8080/manager</url>
					<path>/</path>
					<username>admin</username>
					<password>test</password>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>



대충보면 뭔 뜻인지는 알것이다. 한가지 설명할 만한것은 tomcat-maven-plugin 플러그인 설정옵션 중에 <url>http://~~~</url> 요거랑 <path>/</path>

url 에는 톰캣 매니저의 URL 을 설정하면 된다. 웹으로 접속할때는 http://localhost:8080/manager/html 이였지만 여기서는 그냥 http://localhost:8080/manager 요기까지만 설정한다.


그리고, tomcat:deploy 로 배포를 하게 되면 path 에 설정한 context 로 배포가 된다.

즉, / 요걸 설정하면 http://localhost:8080/      /test 요걸 설정하면 http://localhost:8080/test 요렇게 웹어플이 배포된다.




자~ 이제 pom.xml 까지 설정을 마쳤으니 이클립스에서 실행을 해보자.

프로젝트명에서 오른쪽 버튼 > Run As > Maven build...  요걸 클릭하면 팝업창이 뜨는데 goals 입력란에
tomcat:undeploy tomcat:deploy
요렇게 입력하고 실행을 하면 짠~~ 바라던 바대로 서버에 배포가 완료된다. 




tomcat:undeploy 를 추가한 이유는 tomcat:deploy 로 배포를 할려는데 이미 같은 컨텍스트가 존재하면 에러가 나기 때문에 기존에 존재하던 컨텍스트를 지우고 다시 배포를 하기 위해서이다.



※ tomcat:undeploy 를 하면 기존에 있던 폴더가 싹 지워지기 때문에 첨부파일 같은거를 해당 폴더로 업로드 되게 처리해 놨다면 첨부파일 까지 다 지워져 버린다!!!!! 이 점에 대해서 깊은 주의가 요망된다.

※ 그외 기타 쓸 수 있는 goal 들
      tomcat:run   임베디드 tomcat 서버 띄우기 => localhost:8080 으로 접속할수 있게 된다.,  jetty:run 과 비슷한 기능임
      tomcat:start  원격 서버시작시키기
      tomcat:stop  원격 서버중지 
      tomcat:redeploy  재배포, 이것 테스트를 심도 있게 안해봤는데 잘만 작동 된다면 undeploy 했다가 다시 deploy 안해도 될것 같긴하다.

외 기타등등 몇가지 더 있음~ tomcat:help 를 해 보면 설명들이 대충 나옴. 영어로.

maven package goal 로 war나 jar 파일 생성시 생성되는 파일명 설정하기


아무것도 설정하지 않고 maven package 골로 빌드를 하면 artifactId-version.war 로 war 파일이 생성된다.

이 war 파일로 배포를 하는데  배포를 할때마다 ROOT.war 나 컨텍스트명.war 로 파일명을 변경해야 되서 귀찮기 그지없다.

mvn package 를 했을때 ROOT.war 나 project.war 같이 생성될 war 파일명을 설정해 보자.

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

	<modelVersion>4.0.0</modelVersion>
	<groupId>com.tistory.stove99</groupId>
	<artifactId>MyProject</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>

	<build>
		<!-- ROOT.war 가 생성된다. -->
		<finalName>ROOT</finalName>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-war-plugin</artifactId>
				<version>2.1.1</version>

				<configuration>
					<warSourceDirectory>WebContent</warSourceDirectory>
					<webXml>WebContent/WEB-INF/web.xml</webXml>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>
build 태그 아래에 finalName 태그를 추가한 다음 원하는 이름을 설정하면 설정한이름.war 로 war 파일이 생성된다.
prev 1 2 next