'2008/06'에 해당되는 글 5건

  1. 2008/06/08 앤트(Ant)에서 톰캣에 웹 애플리케이션을 디플로이하는 방법..
  2. 2008/06/08 앤트(Ant)에서 톰캣을 실행/중지해 보아요. (4)
  3. 2008/06/08 앤트(Ant)의 프로퍼티 파일(.properties)의 제한에 대해서..
  4. 2008/06/04 앤트(Ant)에서 사용자별로 다른 프로퍼티 파일을 읽어들이도록 해보아요.
  5. 2008/06/04 앤트(Ant)의 명령행에서 정의되는 프로퍼티의 제한에 대하여..
2008/06/08 02:25

앤트(Ant)에서 톰캣에 웹 애플리케이션을 디플로이하는 방법..

톰캣에 웹 애플리케이션을 디플로이하는 방법에는 두 가지가 있어요.
  • ${톰캣_설치_경로}[각주:1]/webapps 디렉토리에 war 파일을 추가한다.
  • ${톰캣_설치_경로}/conf/Catalina/localhost 디렉토리에 context 파일을 추가한다.
war 파일은 일반적인 웹 애플리케이션 파일이구요.
context 파일 내용은 대략 다음과 같아요.

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/${웹애플리케이션_이름}" docBase="${웹애플리케이션_디렉토리}" reloadable="true">
</Context>

첫번째 방법이 보통 많이 쓰이는 방법이죠. 저는 두번째 방법을 더 선호합니다만..



그런데 사실 한 가지 방법이 더 있습니다.

톰캣의 manager 어플리케이션을 이용하는 것입니다. ^-^/

톰캣의 manager 어플리케이션을 사용하려면 다음을 확인합니다.

1.톰캣에 manager 어플리케이션이 설치되어 있는지 확인한다.
   (5.0, 5.5, 6.0 버전 모두 기본적으로 설치되어 있네요..)

2. manager 권한이 있는 사용자를 등록한다.
    ${톰캣_설치_경로}\conf\tomcat-users.xml 파일에 다음 내용을 추가합니다.

<role rolename="manager"/>
<user username="${사용자_아이디}" password="${사용자_암호}" roles="manager"/>

3. 서버를 띄우고 http://localhost:8080/manager/html 로 접속합니다.
    (등록한 사용자의 아이디/암호를 입력합니다.)

다음과 같은 화면에서 Deploy를 실행하면 됩니다.
Context 파일 내용을 설정하거나 war 파일을 업로드해서 디플로이할 수 있습니다.


그리고 매니저에서는 다른 웹 애플리케이션을 실행/중지/리로드/언디플로이할 수 있어요~



이제부터 본론으로 들어갑니다.

제가 말씀드릴 앤트로 톰캣에 웹 애플리케이션을 디플로이하는 방법은 내부적으로 톰캣의 manager 애플리케이션을 이용합니다. 그러므로 먼저 톰캣의 manager 애플리케이션이 설정이 되어있어야 해요~!

빌드 파일에서 사용할 프로퍼티 파일은 다음과 같습니다. (sample 어플리케이션을 배포한다고 가정합니다.)

# catalina home directory
catalina.home=C:\Tomcat[각주:2]
catalina.ant.jar=${catalina.home}/server/lib/catalina-ant.jar
catalina.tasks.file=catalina.tasks[각주:3]

# catalina manager configurations
catalina.manager.url=http://localhost:8080/manager
catalina.manager.user.name=test[각주:4]
catalina.manager.user.password=test

# application configurations
application.path=/sample[각주:5]
application.context=sample.xml[각주:6]

그리고 태스크 정의 파일이 필요합니다. 다음과 같은 내용으로 catalina.tasks 라는 파일을 만듭니다.

# catalina tasks properties
deploy=org.apache.catalina.ant.DeployTask
undeploy=org.apache.catalina.ant.UndeployTask
start=org.apache.catalina.ant.StartTask
reload=org.apache.catalina.ant.ReloadTask
stop=org.apache.catalina.ant.StopTask
sessions=org.apache.catalina.ant.SessionsTask
list=org.apache.catalina.ant.ListTask
serverinfo=org.apache.catalina.ant.ServerinfoTask
roles=org.apache.catalina.ant.RolesTask
resources=org.apache.catalina.ant.ResourcesTask

어플리케이션 컨텍스트 설정 파일이 필요합니다. 다음과 같은 내용으로 sample.xml 이라는 파일을 만듭니다.

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/sample" docBase="C:\Sample[각주:7]" debug="0" privileged="true" reloadable="true">
    <Logger className="org.apache.catalina.logger.FileLogger" prefix="localhost.sample." suffix=".txt" timestamp="true" />
</Context>

마지막으로 빌드 파일 내용은 다음과 같습니다.

먼저 태스크 정의 파일을 설정해야 합니다.

<taskdef file="catalina.tasks" classpath="${catalina.ant.jar}" />

그러면 다음과 같은 태스크들을 사용할 수 있어요.

<target name="catalina.deploy" description="Deploy web application">
    <deploy url="${catalina.manager.url}" username="${catalina.manager.user.name}" password="${catalina.manager.user.password}" path="${application.path}" config="${application.context}" update="true" />
</target>

<target name="catalina.undeploy" description="Undeploy web application">
    <undeploy url="${catalina.manager.url}" username="${catalina.manager.user.name}" password="${catalina.manager.user.password}" path="${application.path}" />
</target>

<target name="catalina.start" description="Start web application">
    <start url="${catalina.manager.url}" username="${catalina.manager.user.name}" password="${catalina.manager.user.password}" path="${application.path}" />
</target>

<target name="catalina.reload" description="Reload web application">
    <reload url="${catalina.manager.url}" username="${catalina.manager.user.name}" password="${catalina.manager.user.password}" path="${application.path}" />
</target>

<target name="catalina.stop" description="Stop web application">
    <stop url="${catalina.manager.url}" username="${catalina.manager.user.name}" password="${catalina.manager.user.password}" path="${application.path}" />
</target>

<target name="catalina.sessions" description="View server information">
    <sessions url="${catalina.manager.url}" username="${catalina.manager.user.name}" password="${catalina.manager.user.password}" path="${application.path}" />
</target>

<target name="catalina.list" description="List web applications">
    <list url="${catalina.manager.url}" username="${catalina.manager.user.name}" password="${catalina.manager.user.password}" />
</target>

<target name="catalina.serverinfo" description="View server information">
    <serverinfo url="${catalina.manager.url}" username="${catalina.manager.user.name}" password="${catalina.manager.user.password}" />
</target>

<target name="catalina.roles" description="View server information">
    <roles url="${catalina.manager.url}" username="${catalina.manager.user.name}" password="${catalina.manager.user.password}" />
</target>

<target name="catalina.resources" description="View server information">
    <resources url="${catalina.manager.url}" username="${catalina.manager.user.name}" password="${catalina.manager.user.password}" />
</target>

디플로이 태스크를 자세히 살펴보죠.

<deploy url="${catalina.manager.url}" username="${catalina.manager.user.name}" password="${catalina.manager.user.password}" path="${application.path}" config="${application.context}" update="true" />

config 속성에 애플리케이션의 컨텍스트 설정 파일의 위치를 입력하는데요..
config 속성 대신에 war 속성을 써서 애플리케이션 war 파일의 위치를 입력할 수도 있어요.
두 속성은 반드시 어느 하나만 써야해요. 안 그러면 에러날 걸~?

톰캣의 앤트태스크를 이용하면 애플리케이션을 디플로이하는 것 뿐만 아니라 웹 어플리케이션의 목록을 보는 것, 애플리케이션을 실행하거나 중지하는 것 등등의 작업을 앤트로 할 수가 있어요. 이게 다 톰캣 개발자들이 앤트 태스크를 쓰기 좋게 만들어둔 덕분이죠. 감사감사 ^^*

보면 볼수록 앤트는 멋진 것 같아요.

환경:
Tomcat 5.0 or 5.5
Ant 1.7.0

  1. ${무언가} 는 변수를 뜻해요! [본문으로]
  2. 톰캣의 설치 경로에요. [본문으로]
  3. 태스크 정의 파일 이름 [본문으로]
  4. manager 권한이 있는 사용자 이름과 암호 [본문으로]
  5. 샘플 어플리케이션 경로 [본문으로]
  6. sample 어플리케이션 컨텍스트 파일 이름 [본문으로]
  7. 샘플 어플리케이션 디플로이 경로 [본문으로]
Trackback 0 Comment 0
2008/06/08 01:28

앤트(Ant)에서 톰캣을 실행/중지해 보아요.

앤트에서 톰캣을 실행하거나 중지해 보아요.

방법은 간단해요. <java /> 태스크로 org.apache.catalina.startup.Bootstrap 클래스를 실행하면 돼요.
다만 프로퍼티 옵션이나 환경 변수 등의 실행 옵션을 잘 주어야 해요.

다음과 같이 해 보아요.

build.properties
java_home=C:/Program Files/Java/jdk1.5.0_14
catalina.home=C:/Programz/Tomcat/5.5
catalina.base=C:/Project/Tomcat/Configuration


java.home 이라는 프로퍼티가 이미 존재(자동으로 생성)하기 때문에, java_home 이라는 이름으로 만들었어요.

build.xml
<project name="history" default="default" basedir=".">

	<property file="build.properties" />

	<target name="default">
		<echo message="이것은 'Ant Tomcat Container'의 빌드 파일이에요." />
		<echo message="앤트(ant) 1.7.0 버전에 최적화되어 있어요." />
		<echo message="사용법:" />
		<echo message="ant tomcat.start" />
		<echo message="ant tomcat.stop" />
		<echo message="참고:" />
		<echo message="java.home = ${java.home}" />
		<echo message="java_home = ${java_home}" />
		<echo message="catalina.home = ${catalina.home}" />
		<echo message="catalina.base = ${catalina.base}" />
	</target>

	<target name="tomcat.start">
		<java classname="org.apache.catalina.startup.Bootstrap" jvm="${java_home}/bin/java" fork="true" spawn="true">
			<classpath>
				<fileset dir="${catalina.home}/bin">
					<include name="bootstrap.jar" />
				</fileset>
			</classpath>
			<arg value="start" />
			<sysproperty key="catalina.home" value="${catalina.home}" />
			<sysproperty key="java.endorsed.dirs" value="${catalina.home}/common/endorsed" />
			<sysproperty key="java.util.logging.manager" value="org.apache.juli.ClassLoaderLogManager" />
			<sysproperty key="java.util.logging.config.file" value="${catalina.home}/conf/logging.properties" />
			<sysproperty key="catalina.base" value="${catalina.base}" />
			<sysproperty key="java.io.tmpdir" value="${catalina.base}/temp" />
		</java>
	</target>

	<target name="tomcat.stop">
		<java classname="org.apache.catalina.startup.Bootstrap" jvm="${java_home}/bin/java" fork="true" spawn="true">
			<classpath>
				<fileset dir="${catalina.home}/bin">
					<include name="bootstrap.jar" />
				</fileset>
			</classpath>
			<arg value="stop" />
			<sysproperty key="catalina.base" value="${catalina.home}" />
			<sysproperty key="catalina.home" value="${catalina.home}" />
			<sysproperty key="java.endorsed.dirs" value="${catalina.home}/common/endorsed" />
			<sysproperty key="java.util.logging.manager" value="org.apache.juli.ClassLoaderLogManager" />
			<sysproperty key="java.util.logging.config.file" value="${catalina.home}/conf/logging.properties" />
			<sysproperty key="java.io.tmpdir" value="${catalina.home}/temp" />
		</java>
	</target>

</project>


톰캣은 JRE가 아니라 JDK로 실행시켜야 하기 때문에 <java /> 태스크의 jvm 속성으로 JDK의 java를 지정했어요.
그리고 새로운 JVM에서 실행이 되도록 fork 속성을, 앤트의 JVM이 종료되더라도 톰캣의 JVM이 계속 남아 있게 하기 위해서 spawn 속성을 true로 지정했어요.

환경:
    Ant 1.7.0
    Tomcat 5.0 or 5.5

Trackback 1 Comment 4
2008/06/08 00:13

앤트(Ant)의 프로퍼티 파일(.properties)의 제한에 대해서..

디렉토리 구분자의 제한

Ant에서는 경로를 나타낼 때, 디렉토리 구분자로 '/'와 '\'를 모두 사용할 수 있어요.
Ant는 두 가지 슬래시 모두를 사용한다고 해서 부끄러워하지 않으며, 오히려 그것을 자랑스럽게 생각한다.
- 자바의 또 다른 멋진 도구 Ant

그러나 프로퍼티 파일에서 경로를 지정할 때 '\'를 사용하고 싶으면, '\\'로 써야해요.
왜냐하면 자바에서는 '\' 문자를 이스케이프 문자로 취급하기 때문이지요. 

프로퍼티 파일 간 참조의 제한

Ant의 프로퍼티는 전방참조(forward-reference)와 후방참조(backward-reference)가 모두 가능하죠.

<property file="first.properties" />
<property file="second.properties" />

그러나 위와 같이 프로퍼티 파일을 2개 사용할 때, 첫번째 프로퍼티 파일에서 두번째 프로퍼티 파일에 존재하는 프로퍼티는 접근할 수 없어요(전방참조 불가).

그러므로 단일 파일에서만 전방 참조가 가능한 것이죠.

build.properties
# common build properties

net=./net
net.kjunine=${net}/kjunine

net.other=.\\net
net.kjunine.other=${net.other}\\kjunine


first.properties
# first properties file

first=first
first.second=${first}.${second}


second.properties
# second properties file

second=second
second.first=${second}.${first}


build.xml
<project name="Ant Project" default="default" basedir=".">

	<!-- START: PROPERTY -->
	<property file="build.properties" />
	<property file="first.properties" />
	<property file="second.properties" />
	<!-- END: PROPERTY -->

	<!-- START: DEFAULT -->
	<target name="default">
		<echo message="이것은 'Ant Property PropertiesFile'의 빌드 파일이에요." />
		<echo message="앤트(ant) 1.7.0 버전에 최적화되어 있어요." />
		<echo message="사용법:" />
		<echo message="	ant directorydelimiter" />
		<echo message="	ant betweenproperties" />
	</target>
	<!-- END: DEFAULT -->

	<!-- START: DIRECTORY DELIMITER-->
	<target name="directorydelimiter">
		<echo message="net.kjunine = ${net.kjunine}" />
		<echo message="net.kjunine.other = ${net.kjunine.other}" />
		<mkdir dir="${net.kjunine}" />
		<delete dir="${net}" />
		<touch file="${net.kjunine.other}" mkdirs="true" />
		<delete dir="${net}" />
	</target>
	<!-- END: DIRECTORY DELIMITER -->

	<!-- START: BETWEEN PROPERTIES-->
	<target name="betweenproperties">
		<echo message="first = ${first}" />
		<echo message="second = ${second}" />
		<echo message="first.second = ${first.second}" />
		<echo message="second.first = ${second.first}" />
	</target>
	<!-- END: BETWEEN PROPERTIES -->

</project>


사용법:

ant

default:
     [echo] 이것은 'Ant Property PropertiesFile'의 빌드 파일이에요.
     [echo] 앤트(ant) 1.7.0 버전에 최적화되어 있어요.
     [echo] 사용법:
     [echo]  ant directorydelimiter
     [echo]  ant betweenproperties

디렉토리 구분자 예제:

ant directorydelimiter

directorydelimiter:
     [echo] net.kjunine = ./net/kjunine
     [echo] net.kjunine.other = .\net\kjunine
    [mkdir] Created dir: C:\Workspace\Project\Workspace\AntExample\Property\PropertiesFile\net\kjunine
   [delete] Deleting directory C:\Workspace\Project\Workspace\AntExample\Property\PropertiesFile\net
    [touch] Creating C:\Workspace\Project\Workspace\AntExample\Property\PropertiesFile\net\kjunine
   [delete] Deleting directory C:\Workspace\Project\Workspace\AntExample\Property\PropertiesFile\net

프로퍼티 파일 간 참조 예제:

ant betweenproperties

betweenproperties:
     [echo] first = first
     [echo] second = second
     [echo] first.second = first.${second}
     [echo] second.first = second.first

환경:
    Ant 1.7.0

Trackback 0 Comment 0
2008/06/04 02:05

앤트(Ant)에서 사용자별로 다른 프로퍼티 파일을 읽어들이도록 해보아요.

앤트에서 사용자별로 다른 프로퍼티 파일을 읽어들이도록 해 보아요.

쉽게 생각하면 -propertyfile 옵션을 이용하면 될 것 같지요.
하지만 -propertyfile 옵션을 이용해 .properties 파일을 읽어들이면 심각한 문제가 있어요.

그래서 다음과 같이 하면 돼요.

default.user.properties
# default user properties
user.properties=default.user.properties


user1.properties
# user1 properties
user.properties=user1.properties


user2.properties
# user2 properties
user.properties=user2.properties


build.xml
<project name="Ant Project" default="default" basedir=".">

	<!-- START: PROPERTY -->
	<property file="${user.id}.properties" />
	<property file="default.user.properties" />
	<!-- END: PROPERTY -->

	<!-- START: DEFAULT -->
	<target name="default">
		<echo message="이것은 'Ant Project'의 빌드 파일이에요." />
		<echo message="앤트(ant) 1.7.0 버전에 최적화되어 있어요." />
		<echo message="사용법:" />
		<echo message="	ant userdependant" />
		<echo message="	ant -Duser.id=user1 userdependant" />
		<echo message="	ant -Duser.id=user2 userdependant" />
	</target>
	<!-- END: DEFAULT -->

	<!-- START: USER DEPENDANT-->
	<target name="userdependant">
		<echo message="user.id = ${user.id}" />
		<echo message="user.properties = ${user.properties}" />
	</target>
	<!-- END: USER DEPENDANT -->

</project>


사용법을 볼까요?

ant

default:
     [echo] 사용법:
     [echo]  ant userdependant
     [echo]  ant -Duser.id=user1 userdependant
     [echo]  ant -Duser.id=user2 userdependant

디폴트 사용자일 때..

ant userdependant

userdependant:
     [echo] user.id = ${user.id}
     [echo] user.properties = default.user.properties

user.id 프로퍼티가 없으면 build.xml에서 ${user.id}.properties 파일을 읽는 property 태스크는 무시되어요.

사용자 1일 때..

ant -Duser.id=user1 userdependant

userdependant:
     [echo] user.id = user1
     [echo] user.properties = user1.properties

사용자 2일 때..

ant -Duser.id=user2 userdependant

userdependant:
     [echo] user.id = user2
     [echo] user.properties = user2.properties

위와 같이 하면 사용자마다 다른 프로퍼티 파일을 읽을 수 있겠네요.
사용자마다 작업 디렉토리나 서버 설치 디렉토리가 다른 경우 등등에 적용할 수 있을 것 같아요.

환경:
    Ant 1.7.0

Trackback 0 Comment 0
2008/06/04 01:14

앤트(Ant)의 명령행에서 정의되는 프로퍼티의 제한에 대하여..


명령행에서 정의되는 프로퍼티에서는 프로퍼티 중첩을 사용할 수 없어요.
다시 말하면, 명령행에서 프로퍼티를 정의할 때는 다른 프로퍼티를 이용할 수가 없어요.

즉, 이런 것을 못한다는 말이죠.

net.kjunine=net.kjunine
net.kjunine.ant=${net.kjunine}.ant

프로퍼티 참조를 뜻하는 ${..} 구문이 단순한 문자열로 인식되어요.

참고로 명령행에서 프로퍼티를 정의하려면 -D 옵션이나 -propertyfile 옵션을 사용하면 되요.

build.properties 파일:

# common build properties
a=a
b=b
c=${a}+${b}


build.xml 파일:

<project name="Ant Property CommandLine" default="default" basedir=".">

	<!-- START: PROPERTY -->
	<property file="build.properties" />
	<!-- END: PROPERTY -->

	<!-- START: DEFAULT -->
	<target name="default">
		<echo message="사용법:" />
		<echo message="	ant -Da=a -Db=b -Dc=$${a}+$${b} commandline" />
		<echo message="	ant -propertyfile=build.properties commandline" />
		<echo message="	ant commandline" />
	</target>
	<!-- END: DEFAULT -->

	<!-- START: COMMAND LINE -->
	<target name="commandline">
		<echo message="a = ${a}" />
		<echo message="b = ${b}" />
		<echo message="c = ${c}" />
	</target />
	<!-- END: COMMAND LINE -->

</project>


사용법을 보죠.

ant

default:
     [echo] 사용법:
     [echo]   ant -Da=a -Db=b -Dc=${a}+${b} commandline
     [echo]   ant -propertyfile=build.properties commandline
     [echo]   ant commandline

다음과 같이 각각 실행하고 결과를 보세요.

ant -Da=a -Db=b -Dc=${a}+${b} commandline

commandline:
     [echo] a = a
     [echo] b = b
     [echo] c = ${a}+${b}

ant -propertyfile=build.properties commandline

commandline:
     [echo] a = a
     [echo] b = b
     [echo] c = ${a}+${b}

ant commandline

commandline:
     [echo] a = a
     [echo] b = b
     [echo] c = a+b

<property> 태스크가 프로퍼티를 읽어들이기 전에 -D 옵션이나 -propertyfile 옵션으로 프로퍼티를 읽어들이면, c 프로퍼티의 내용이 문자열 그대로 보이는 것을 알 수 있어요.

환경:
    Ant 1.7.0

Trackback 0 Comment 0