Maven을 활용한 빌드 환경
빌드환경의 필요성
빌드(Build)란?
- 소스 코드 파일을 동작하는 독립적인 소프트웨어 산출물로 만드는 과정이다.
- 빌드의 가장 중요한 단계중 하나는 소스 코드 파일을 실행 코드로 변환하는 컴파일 과정이다.
- 간단한 프로그램은 하나의 파일만 컴파일해도 되겠지만, 많은 소스코드와 다양한 버전닝을 필요하는 복잡한 프로젝트는 어떻게 할것인가?
- 빌드툴(Build Tool)이 이런 수고로움을 덜어주고 있다!!
빌드 툴(Build Tool)
- 새로운 버전의 프로그램을 빌드할때 사용하는 툴
- 일반적인 빌드 툴이 제공하는 기능
- 전처리(preprocessing), 컴파일(compilation), 패키징(packaging), 테스팅(testing), 배포(distribution)
개발에 있어 빌드란?
- 애플리케이션 개발에 있어 빌드는 개발하는 애플리케이션을 완성 시켜주는 마지막 단계
- 개발한 것들을 산출물, 결과물을 내는 과정
- 빌드를 잘하는 것은 훌륭한 애플리케이션을 만드는데 중요한 과정이다
- 좋은 빌드 툴을 선택하는것은 개발의 기본 요건이다!
- 왜 빌드 툴이 필요한가? 이거 정말 중요할 듯.
- 아직도 빌드 툴의 필요성에 대해 의구심을 가지는 개발자들이 있다.
- 필요성만 느낀다면 이후에는 관심을 가지고 학습하지 않을까?
빌드 툴 소개
Apache Ant
- 자바로 구현됨, 자바 프로젝트 빌드에 적합
- XML 파일(build.xml)을 사용하여 빌드 프로세스와 의존성 정의
Apache Maven
- Apache Ant와 비슷하나 컨셉과 동작방식이 다름
- C#, Ruby, Scala등 Java가 아닌 프로젝트도 빌드와 관리가 가능
- XML 파일(pom.xml)에 정의함(의존성, 빌드 순서, plug-in등)
- Maven Repository - 자바 라이브러리나 플러그인을 다운받을수 있음
Gradle
- Ant나 Maven과 비슷한 컨셉
- XML대신 DSL을 통해 프로젝트 정의
Maven 소개
Maven 이란?
- 빌드툴? 프로젝트 관리 툴?
- 소스 코드로 부터 배포 가능한 산출물을 빌드하는 '빌드툴'
- 프로젝트 관리 도구
- 프로젝트 오브젝트 모델, 표준 집합, 프로젝트 라이프사이클, 의존성관리 시스템, 라이프사이클에 정의된 단계에서 플러그인 골을 실행하기 위한 로직을 포함하는 관리 툴이다
Archetype 통해 적합한 구조의 프로젝트 생성,
애플리케이션 명칭과 버전 및 연관된 라이브러리에 대한 정보 등을 종합적으로 관리
서브 프로젝트간의 관계 손쉽게 설정
Nexus를 통해 저장소 관리
Maven이 제공하는 기능- Builds
- Documentation
- Reporting
- Dependencies
- SCMs
- Releases
- Distribution
Maven의 목적
개발자가 짧은 기간에 개발의 전체 상태를 이해 할 수 있도록한다
Making the build process easy
Providing a uniform build system
Providing quality project information
Providing guidelines for best practices development
Allowing transparent migration to new features
Maven 간단하게 보기
간단한 웹 프로젝트 시작하기
archetype:generate
$ mvn archetype:generate -DgroupId=net.sasary.study -DartifactId=sasary -DarchetypeArtifactId=maven-archetype-webapp
eclipse 프로젝트 설정 추가
$ mvn eclipse:eclipse
- eclipse에서 프로젝트 import
- 완성
컴파일 하기( 이클립스에서만 띄운다면 mvn 툴을 사용해서 하면 된다 )
$ mvn compile
패키지 만들기
$ mvn package
프로젝트 공통 구조
src/main/java | Application/Library sources |
src/main/resources | Application/Library resources |
src/main/filters | Resource filter files |
src/main/assembly | Assembly descriptors |
src/main/config | Configuration files |
src/main/scripts | Application/Library scripts |
src/main/webapp | Web application sources |
src/test/java | Test sources |
src/test/resources | Test resources |
src/test/filters | Test resource filter files |
src/site | Site |
LICENSE.txt | Project's license |
NOTICE.txt | Notices and attributions required by libraries that the project depends on |
README.txt | Project's readme |
maven lifecycle과 dependency
- 메이븐에서 의존관계 라이브러리 관리 방법
ant vs maven
Apache Ant | Apache Maven |
---|---|
기존의 make와 같은 빌드의 단점을 보완한 XML 기반의 빌드툴 | Ant와 비슷하나 프로젝트 관리를 위한 컨셉으로 만들어진 프로젝트 관리툴 |
무슨일을 하고 무엇에 의존하는지 명확하게 정의할수 있도록 xml 최적화 익숙하지 않은 사용자도 쉽게 접근 가능 | 간결한 프로젝트 정의, 다른 개발도구나 서버환경에서 자동으로 통합 가능함 쉽게 구조를 검사할수 있고, 결과물에 대해 이해한 상태에서 work-flow를 수행해 볼수 있다. |
숙련된 개발자도 스크립트 실행없이는 빌드를 추론하기 어렵고 복잡한 스크립트는 부담스러운 과제가 될수도 있음 | 메이븐 시작시 이해과정 필요, 이미 완성된 프로젝트에 적용하기 어려움 자율성이 떨어진다는 의견도 있다 |
Ant 예제
project name="MyProject" default="dist" basedir="."> <description> simple example build file </description> <!-- set global properties for this build --> <property name="src" location="src"/> <property name="build" location="build"/> <property name="dist" location="dist"/> <target name="init"> <!-- Create the time stamp --> <tstamp/> <!-- Create the build directory structure used by compile --> <mkdir dir="${build}"/> </target> <target name="compile" depends="init" description="compile the source " > <!-- Compile the java code from ${src} into ${build} --> <javac srcdir="${src}" destdir="${build}"/> </target> <target name="dist" depends="compile" description="generate the distribution" > <!-- Create the distribution directory --> <mkdir dir="${dist}/lib"/> <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file --> <jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/> </target> <target name="clean" description="clean up" > <!-- Delete the ${build} and ${dist} directory trees --> <delete dir="${build}"/> <delete dir="${dist}"/> </target> </project>
Maven 예제
<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.mycompany.app</groupId> <artifactId>my-app</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>Maven Quick Start Archetype</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
의문점?
Maven은 빌드 툴인가?
- Gradle을 사용하는건 어떤가?
5 댓글
김현기
기대중~
박재성
막판 열심히 달리네. 내일 스터디 기대 된다.
slipp017
저도 반드시 들으러 가겠음. ㅋㅋㅋ
흠... 주변에서 Gradle로 넘어가려는 모습들이 많이 보이는데,
Gradle에 대해서도 알아두면 좋을 것 같네요. ^^ 그럼 내일 뵙겠습니다.
slipp020
다들 잘 알고 계신거라 ㅋㅋ 제가 모르는거 오히려 폭풍 질문할 시간이 될지도 모르겠네요 ㅋ
slipp017