Apache Ant Make Ear, Jar, War, config Manifest Example

업데이트:

Apache Ant Make Ear, Jar, War, config Manifest Example

Assumption & Background

Apache Ant should be installed and evironment path is set correctly.

Apache Ant 사용 관련

보통 WAS 에 Application 자원을 배포하기 위해, 설정된 경로에 파일들을 복사해서 운영하는경우도 있고,
war, ear, jar 등등을 만들어서 사용하는 경우도 있습니다. 
ear 까지 만들어서 배포도 되게 자동화가 필요했고, runnable jar application 을 만들어서
java signing 까지 해야 하는 부분도 있어서 해당 부분들을 ant build.xml 파일에 작성해 보았습니다.

최근에는 이런방식을 잘 사용하지 않지요? 이유는 아마 dependancy library 들을 관리해주면서 하는
maven 이나 gradle 또는 annotation 으로 넘어가서 사용하게 되는 부분들로 인해
지금의 방식은 잘 사용하지 

물론 구글링해서 해당 소스를 참조해서 말이죠..
아래의 stackoverflow 의 답글에 작성한 build.xml 내용이 맘에 들어 참고하였습니다.
https://stackoverflow.com/questions/15247751/eclipse-with-java-ee-ejb-ant-and-jenkins-hudson/16109977#16109977

자 그럼 제가 만든 build.xml 을 보도록 하겠습니다.

Ear, War, Jar, Java Signing 샘플 소스

사실 해보니, Ear, War, Jar 만드는게 엄청난게 있는 건 아닌것 같습니다.
jar 로 묶는건데 설정을 xml 에 정의 해서 그걸 바탕으로 묶는것과 Static 자원(html,css,js,img 등등) 의 폴더 위치 정도를 마춰주는정도
만 잘 되면 되는듯 합니다. 
소스가 좀 길어서 설명을 미리 적습니다.
기본적으로 property 정보를 적어서 사용했고, ant 명령어 실행시 기본으로 동작하는 build task 에 
depends 를 ear 를 만드는 걸 적었고, 그 안에는 war 를 만들고, jar 를 만들고, init 이라는 초기 task 까지 거꾸로 올라가게끔 되어 있습니다.
그래서 실제로 동작하는 순서는 init -> create-web -> create-ejb -> create-ear 순입니다. 물론 내부적으로 step 이 더 있습니다만,
순서가 이렇다고 하면 어떻게 동작할지는 이해 되시리라 생각합니다.

init 에 runnable jar 로 사용할 소스를 jar 로 그냥 만들고 만들 때 manifest 를 정의 해서 java signing 에 필요한 정보도 추가해 놓습니다.
그렇게 만들어진 jar 를 java signing 을 하고, 만든 jar 를 다시 엎어 치도록 만들었습니다.

좀 특이한 점은, 자바 소스들을 하나의 프로젝트에 다 모아 놓고, ant 로 돌리면 전체 소스를 먼저 compile 한 다음,
해당 compile 된 class 에서 각 영역 별로 사용되는 부분을 copy 해다가 war, jar, ear 를 만들어서 완성합니다.

도움이 될만한 사용 방법들을 적어 놓으면
javac 할때 JDK 홈 경로 변경 가능한 부분 소스가 있습니다. 인코딩 변경 옵션부분도 있습니다.
윈도우 bat 파일을 실행하는 부분의 소스가 있습니다.
파일 및 폴더를 복사할때 필터링 하는 부분의 소스가 있습니다. 
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project basedir="." default="build" name="TEST_APP">
    <property environment="env"/>
    <property name="debuglevel" value="source,lines,vars"/>
    <property name="target" value="1.6"/>
    <property name="source" value="1.6"/>
	<property name="builddir" value="antBuild" />
	<property name="outputartifacts" value="antOut" />
	<property name="ear.name" value="APP" />
	<property name="app.name" value="logviewscreen" />
	<property name="root.src" value="src" />
	<property name="javac.path" value="C:/Program Files/Java/jdk1.6.0_24/bin/javac" />
	<property name="app.builddir" value="${outputartifacts}/app" />
	<property name="app.builddir.classes" value="${app.builddir}/classes"/>
	<property name="sign.dir" location="signing"/>
	<property name="signing" location="signing/Auto Signer_1.6.bat"/>
	
	<property name="ejb.name" value="EJB" />
	<property name="ejb.module" value="ejbModule" />
	<!--
	<path id="ejb.src">
	  	<pathelement location="src/com/test/app/util" />
		<pathelement location="src/com/test/bl/ejb" />
		<pathelement location="src/com/test/common/constants" />
	</path>
	-->
	<property name="ejb.builddir" value="${outputartifacts}/ejb" />
	<property name="ejb.builddir.classes" value="${ejb.builddir}/classes" />
	
	<property name="web.name" value="WEB" />
	<property name="web.src" value="src/com/test/app/controller" />
	<!--
	<path id="web.ref">
	  	<pathelement location="src/com/test/app/util" />
		<pathelement location="src/com/test/bl/ejb" />
		<pathelement location="src/com/test/common/constants" />
	</path>
	-->	
	<property name="web.builddir" value="${outputartifacts}/web" />
	<property name="web.builddir.classes" value="${web.builddir}/WEB-INF/classes"/>
	
	<target name="build" depends="create-ear">
	    <echo message="==========================="/>
	    <echo message="  EAR Build Start     "/>
	    <echo message="==========================="/>
	</target>
	<target name="create-ear" depends="create-web,create-ejb">
	    <ear destfile="${outputartifacts}/${ear.name}.ear" appxml="META-INF/application.xml">
	        <fileset dir="${outputartifacts}" >
	        	<patternset id="ejb.class.pattern">
	        		<include name="**/*.jar"/>
	        		<include name="**/*.war"/>
	        		<exclude name="**/logviewscreen.jar"/>
	        	</patternset>
	        </fileset>
	    </ear>
	</target>
	<target name="create-ejb" depends="init-ejb">
	    <echo message="==========================="/>
	    <echo message="  Make ${ejb.name}.jar     "/>
	    <echo message="==========================="/>
	    <jar destfile="${outputartifacts}/${ejb.name}.jar" basedir="${ejb.builddir.classes}" includes="**/*"/>
	</target>
	<!-- 
	<target name="build-ejb" depends="init-ejb">
	    <echo message="==========================="/>
	    <echo message="  Build EJB    "/>
	    <echo message="==========================="/>			
	    <javac fork="yes" executable="C:/Program Files/Java/jdk1.6.0_24/bin/javac" encoding="UTF-8" debug="true" debuglevel="${debuglevel}" destdir="${ejb.builddir.classes}" includeantruntime="false" source="${source}" target="${target}">
	        <src refid="ejb.src"/>
	        <classpath>
	            <fileset dir="lib">
	                <include name="**/*.jar"/>
	            </fileset>                  
	        </classpath>
	    </javac>
	</target>
	-->
	<target name="init-ejb" depends="init">
	    <mkdir dir="${ejb.builddir}" /> 
	    <copy includeemptydirs="false" todir="${ejb.builddir.classes}">
	    	<fileset dir="${ejb.module}">
	    	</fileset>
	    </copy>
	    <copy includeemptydirs="false" todir="${ejb.builddir.classes}">
	        <fileset dir="${builddir}">
				<patternset id="ejb.class.pattern">
					<include name="**/com/test/app/util/**"/>
					<include name="**/com/test/bl/ejb/**"/>
					<include name="**/com/test/common/constants/**"/>
				</patternset>
	        </fileset>
	    </copy>		
	</target>
	<target name="init">
	    <echo message="==========================="/>
	    <echo message="  Clear Build Folder (build,out) "/>
	    <echo message="==========================="/>
		<delete dir="${builddir}"/>
		<delete dir="${outputartifacts}"/>
	    <echo message="==========================="/>
	    <echo message="  Create Folders(build/[app,ejb,web],out) and Compile ALL JAVA FILES "/>
	    <echo message="==========================="/>
		<mkdir dir="${builddir}" />
	    <mkdir dir="${outputartifacts}" />
		<mkdir dir="${app.builddir.classes}" />
		<mkdir dir="${ejb.builddir.classes}" />
		<mkdir dir="${web.builddir.classes}" />
	    <javac fork="yes" executable="${javac.path}" encoding="UTF-8" debug="true" debuglevel="${debuglevel}" destdir="${builddir}" includeantruntime="false" source="${source}" target="${target}">
	        <src path="${root.src}"/>
	        <classpath>
	            <fileset dir="lib">
	                <include name="**/*.jar"/>
	            </fileset>  
	        </classpath>
	    </javac>
	    <copy includeemptydirs="false" todir="${app.builddir.classes}">
	        <fileset dir="${root.src}">
	        	<include name="**/com/test/ui/javaapp/img/**"/>
	        	<include name="**/com/test/ui/plaf/img/**"/>
	        	<include name="**/com/test/ui/plaf/resources/**"/>
	        	<exclude name="**/.dm/**"/>
	        </fileset>
	    </copy>		
	    <copy includeemptydirs="false" todir="${app.builddir.classes}">
	        <fileset dir="${builddir}">
				<patternset id="app.class.pattern">
					<include name="**/com/test/app/util/**"/>
					<include name="**/com/test/bl/ejb/**"/>
					<include name="**/com/test/common/constants/**"/>
					<include name="**/com/test/ui/**"/>
					<include name="**/com/test/**"/>
					<exclude name="**/.dm/**"/>
					<exclude name="**/test/**"/>
					<exclude name="**/controller/**"/>
					<exclude name="**/ejb/impl/**"/>
					<exclude name="**/PosConfigHandleException.class"/>
					<exclude name="**/PosConfigHandler.class"/>
					<exclude name="**/PosLogExtractor.class"/>
					<exclude name="**/PosLogHandler.class"/>
				</patternset>
	        </fileset>
	    </copy>
		<jar destfile="${outputartifacts}/${app.name}.jar" basedir="${app.builddir.classes}" includes="**/*">
			<manifest>
				<attribute name="Trusted-Library" value="true"/>
	            <attribute name="Application-Library-Allowable-Codebase" value="*"/>
	            <attribute name="Trusted-Only" value="true"/>
	            <attribute name="Permissions" value="all-permissions"/>
				<attribute name="Caller-Allowable-Codebase" value="*"/>
	            <attribute name="Codebase" value="*"/>
	          <!-- details 
	          <section name="common/MyClass.class">
	            <attribute name="Sealed" value="false"/>
	          </section>
	          -->
			</manifest>
		</jar>
	    <copy includeemptydirs="false" todir="${sign.dir}">
	        <fileset dir="${outputartifacts}">
	        	<include name="**/logviewscreen.jar"/>
	        </fileset>
	    </copy>
		<exec executable="cmd">
		    <arg value="/c"/>
		    <arg value="${signing}"/>
		</exec>
	    <copy includeemptydirs="false" todir="${outputartifacts}">
	        <fileset dir="${sign.dir}">
	        	<include name="**/logviewscreen.jar"/>
	        </fileset>
	    </copy>
	</target>
	<target name="create-web" depends="init-web">
	    <echo message="==========================="/>
	    <echo message="  Make ${web.name}.war     "/>
	    <echo message="==========================="/>
	    <war destfile="${outputartifacts}/${web.name}.war" basedir="${web.builddir}" webxml="WebContent/WEB-INF/web.xml"/>
	</target>
	<!-- 
	<target name="build-web" depends="init-web" >
	    <echo message="==========================="/>
	    <echo message="  BUILD WEB     "/>
	    <echo message="==========================="/>							
	    <javac fork="yes" executable="C:/Program Files/Java/jdk1.6.0_24/bin/javac" encoding="UTF-8" debug="true" debuglevel="${debuglevel}" destdir="${web.builddir.classes}" includeantruntime="false" source="${source}" target="${target}">
	        <src refid="web.ref"/>
	        <classpath>
	            <fileset dir="lib">
	                <include name="**/*.jar"/>
	            </fileset>  
	        </classpath>
	    </javac>
	</target>
	-->	
	<target name="init-web" depends="init">
	    <mkdir dir="${web.builddir.classes}"/>  
	    <copy includeemptydirs="false" todir="${web.builddir}">
	        <fileset dir="WebContent">
	        	<exclude name="**/.dm/**"/>
	        </fileset>
	    </copy>
	    <copy includeemptydirs="false" todir="${web.builddir.classes}">
	        <fileset dir="${builddir}">
				<patternset id="web.class.pattern">
					<include name="**/controller/**"/>
					<exclude name="**/.dm/**"/>
				</patternset>
	        </fileset>
	    </copy>
	</target>
</project>

Hope it was useful to someone else. Cheers