728x90


이제 여러분이 기초적이게 할수 있는 단계까지 여러분에게 알려드렸다.

그럼 이번에는 ant의 원래 목적에 맞는 여러개의 파일을 컴파일 해보도록 해보자.

먼저 아래와 같은 디렉터리구조가 존재한다고 가정하자.



위의 디렉터리구조에서 우리가 궁금한게 몇가지 있고 이것을 모두다 해소하기 위해서 어떻게 해야할지를 알려주겠다.

먼저 Main이 실행하기 위해서는 Sum과 Sub이 모두필요하다.

같은 패키지에 있는 것을 어떻게 할지? 또한 다른 패키지에 있는 것을 어떻게 할지 알아보자.


여러분은 여기서 만약 이클립스, 인텔리J, 넷빈즈등의 어플리케이션을 사용하지 않고 이 모두를 빌드 할 수 있는가?

사실 자바를 사용하는 사람 중에서 이것을 할 줄 모르는 사람이 너무 많다.

심지어 이를 할줄 모름에도 불구하고 여기에 대해서 의구심을 느끼는 사람도 별로 없으며

콘솔에서 작업을 해야할 경우에 어떻게 할지에 대해서 대답을 못하거나 하나씩... 빌드해야한다고 하는 사람도 봤다.


위의 대답은 당연히 아니다. 자바 빌드 시스템은 C의 빌드 시스템인  cmake시스템을 모체로 시작되었다.

그 빌드 시스템이 필요한 이유 역시 맥락을 같이 하는데 프로젝트가 커지고 파일이 많아질 경우 여기에 대한

빌드 이해도가 선행되어야한다.이 이해도가 선행되지 않았다면 자바를 제대로 다루는것은 간단히 말해서 불가능하다.


위의 경우 Main을 실행시키기위해서 어떻게 빌드를 해야할까?

또한 어떻게 실행을 해야할까? 그 방법을 여러분에게 간단하게 알려드리고 시작하겠다.


java 프로젝트를 javac만을 사용해서 빌드하는 방법


1.mkdir "빌드 디렉터리명"

ex)mkdir bin

javac는 파일을 만드는일이나 삭제하는 일을 할 수 없다. 따라서 먼저 빌드 할 디렉터리를 만들어준다.

굳이 명령어로 만들어주지 않아도 좋다.


2.find ./src -name *.java > sources_list.txt

위는 맥과 리눅스에서 사용하는 것이고 윈도우라면 dir /s /B *.java > sources_list.txt라고 입력한다.

javac에서는 특정 패키지(디렉터리가 아니라 패키지, 그중에서 패키지 내의 패키지는 불가능)의

소스파일들만 가능하다. 만약 분산되어 있다면(거의 대부분의 프로젝트는 한개의 패키지로 이루어져있지 않다.)

javac만을 이용해서 사용하는 것을 불가능 하므로 source파일 리스트를 뽑아주는 과정이 반드시 필요하다.


3.javac -d "빌드 디렉터리명-cp "클래스 디렉터리명 @sources_list.txt

ex)javac -d bin -cp bin @sources_list.txt

-d옵션은 빌드 된 바이너리가 저장될 디렉터리를 정한다. 이 디렉터리는 이미 존재해야만 가능하다.
-cp옵션은 이미 존재하는(빌드의 유무와 상관없이) 바이너리파일들을 정한다.
d옵션에서 정한 디렉터리는 자동으로 cp옵션에서 정한 디렉터리가 되므로
만약 빌드 디렉터리와 클래스 디렉터리가 겹친다면 이 cp옵션을 적지 않아도 되지만
본인이 직접 빌드하지 않고 남이 빌드한 바이너리를 사용한다면 cp옵션을 반드시 켜두고 해당 디렉터리를 추가해야한다.


벌써부터... 머리가 아프다.

아니 자바가 이렇게 머리가 아픈 것이였나? 묻는다면... 아쉽게도 "그렇다"이다.

여러분들은 이런것을 그렇게 걱정하거나 고민하면서 한적이 없다.

왜냐하면 이클립스가 만든 빌드시스템, 혹은 인텔리j가 만든 빌드시스템을 그대로 사용했다.

여러분은 이클립스에서만든 바이너리가 왜 bin에 저장되는지,

또한 인텔리J에서 만든 바이너리가 왜 out에 저장되는지, 이를 수정하려면 어떻게 해야하는지,

artifacts가 뭔지에 대해서 심도있게 고민해본적이 드물 것이다.

사실 자바도 만든지 엄청 오래되었고 그 당시에는 이런 디테일한 부분을 생각하며 만들지는 않았다.

만약 여러분이 eclipse를 사용하지 않는다면 위와 같은 과정을 거쳐야한다.


하지만 IDE를 사용한다고 그게 능사는 아니다.

왜냐면 IDE를 사용하면 그 IDE로만 읽을 수 있고 터미널에서의 작업에 매우 취약해진다는 문제점이 있다.

그래서 등장한게 바로 빌드시스템인 것이다.

이제 ant를 사용해서 위의 작업들을 자동화 해보자.


build.xml을 아래와 같이 작성해보자.


<?xml version="1.0"?>
<project name="AntTest" default="main" basedir=".">
<property name="Name" value="Ant Test"></property>
<property name="name" value="anttest"></property>
<property name="groupid" value="net.theceres.anttest"></property>
<property name="project.version" value="1.0.0"></property>

<property name="src.dir" value="src"></property>
<property name="build.dir" value="build"></property>
<property name="classes.dir" value="${build.dir}/classes"></property>

<target name="clean">
<delete dir="${build.dir}"></delete>
</target>
<target name="init">
<mkdir dir="${build.dir}"></mkdir>

<mkdir dir="${classes.dir}"></mkdir>
</target>
<target name="compile" depends="init">
<javac srcdir="${src.dir}" destdir="${classes.dir}" includeantruntime="false">
</javac>
</target>
<target name="main" depends="clean,compile">
<java classpath="${classes.dir}" classname="${groupid}.Main">
</java>
</target>
</project>

위의 javac작업들을 한군데 담은 것이다.

이 프로젝트는 가장 기본적인 단위이다. 필자가 생각하기에 왠만해선 빠지지 않는 best practice를 뽑았다.

그 이유와 기능을 설명하겠다.


Ant프로젝트의 기본


1.property

(1)Name : 프로젝트의 이름을 기술한다. 외부적으로 쓰이는 일은 드물지만 이 프로젝트의 이름을 의미한다. 가장 자주 쓰이는 이름은 ant.project.name이다.

(2)name : 외부 파일을 만들때 사용할 프로젝트의 이름을 기술한다. jar파일을 만들 때 이 이름을 참조한다. 요새는 maven에서는 artifactId라고 기술되는 존재이다.

(3)groupId : 이 프로젝트가 전체적으로 가질 루트 패키지 명을 의미한다. 패키지명을 참조할 때 이 이름을 참조한다.

(4)project.version : 프로젝트의 버전을 의미한다. 간략하게 version이라고 쓸 때도 많다. ant에서 가장 자주 사용하는 방식은 ant.version이다.

(5)src.dir : 소스파일의 경로를 의미한다. 특별한 일이 있지 않는 한(있는 경우 못봄) src로 적는다.

(6)build.dir : 빌드 된 파일의 경로를 의미한다. 대부분의 캐이스에서는 build라는 이름을 사용한다.

(7)classes.dir : 빌드 된 클래스파일의 경로를 의미한다. 대부분 build의 하위 폴더로서 classes 혹은 bin을 사용하나 대부분에서는 classes를 사용한다.


2.target:

(1)clean : ant로 생성된 파일을 다시 깔끔히 지운다.

(2)init : 컴파일을 하기전에 해야할 선행작업들을 해둔다.

(3)compile : javac를 사용해서 모든 소스파일을 컴파일한다.

(4)main : 내가 메인으로 할 작업을 한다. 보통의 경우에는 jar파일 생성, war파일 생성, main실행 등의 역활을 하게된다.


Ant는 자바 빌드시스템 중 가장오래 되었고 그래서 best practice가 여러번 바뀌어서 문서를 읽어도 이게 정답이다!하는것이 별로 없다.

Ant프로젝트의 기본역시 저것보다 약간 더 분량이 되지만 여기서 설명하지 않고 앞으로 해나가면서 더 설명하도록 하겠다.

일단 간단한 main을 구성함으로써 가장 필요한 몇가지를 적어 놓았다.

여기서 javac부분은 간단하기 그지 없다. 순수 javac을 사용할때와는 차원이 다른 난이도가 존재한다.

Ant내에서는 javac 엘리먼트는 기존의 javac보다 더 강력하여

src폴더 명만 적어두면 알아서 하위 java파일을 순회하면서 전부 class파일로 바꾼다.

그럼 제대로 작동하는지 한번 테스트 해보자.



제대로 동작하고 값을 도출해내는 걸 확인할 수 있다.

이로써 우리는 여러개의 java파일도 무리없이 컴파일 하고 실행할 수 있다는걸 알 수 있다.

'Usage > Java-Project Management' 카테고리의 다른 글

[Ant]외부 라이브러리(jar)를 사용해서 빌드 하기(8)  (0) 2018.03.18
[Ant]jar 파일 생성과 run 분리(7)  (0) 2018.03.17
[Ant]property(5)  (0) 2017.10.06
[Ant]clean target(4)  (0) 2017.10.06
[Ant]target 나누기(3)  (0) 2017.10.06

+ Recent posts