Error rendering WebPanel: No renderer found for resource type: velocity Template contents: <meta name="ajs-keyboardshortcut-hash" content="$keyboardShortcutManager.shortcutsHash">
메타 데이터의 끝으로 건너뛰기
메타 데이터의 시작으로 이동

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 간단하게 보기 

간단한 웹 프로젝트 시작하기

 

  1. archetype:generate
    $ mvn archetype:generate -DgroupId=net.sasary.study -DartifactId=sasary -DarchetypeArtifactId=maven-archetype-webapp
  2. eclipse 프로젝트 설정 추가 

    $ mvn eclipse:eclipse
  3. eclipse에서 프로젝트 import
  4. 완성 
  5. 컴파일 하기( 이클립스에서만 띄운다면 mvn 툴을 사용해서 하면 된다 (웃음) ) 

    $ mvn compile
  6. 패키지 만들기

    $ mvn package

 

프로젝트 공통 구조

src/main/javaApplication/Library sources
src/main/resourcesApplication/Library resources
src/main/filtersResource filter files
src/main/assemblyAssembly descriptors
src/main/configConfiguration files
src/main/scriptsApplication/Library scripts
src/main/webappWeb application sources
src/test/javaTest sources
src/test/resourcesTest resources
src/test/filtersTest resource filter files
src/siteSite
LICENSE.txtProject's license
NOTICE.txtNotices and attributions required by libraries that the project depends on
README.txtProject's readme

 

maven lifecycle과 dependency

 

 

  • 메이븐에서 의존관계 라이브러리 관리 방법

ant vs maven

Apache AntApache Maven

기존의 make와 같은 빌드의 단점을 보완한 XML 기반의 빌드툴
하나이상의 정의된 xml 파일 스크립트에 의해 동
xml 파일에 정의된 target을 수행하고 target은 task수행
각 작업은 정의된 순서에 따라 진행되어 짐

Ant와 비슷하나 프로젝트 관리를 위한 컨셉으로 만들어진 프로젝트 관리툴
모든 프로젝트를 특정한 구조와 지원되는 task work-flow들의 일련으로 간주
Pom.xml에 프로젝트 구조와 동작 정의
프로젝트의 구조와 work-flow는 정해진 컨벤션에 맞춰 동작

무슨일을 하고 무엇에 의존하는지 명확하게 정의할수 있도록 xml 최적화
Ant가 실행하는 모든 것들은 Ant 스크립트에서 확인할수 있음

익숙하지 않은 사용자도 쉽게 접근 가능

간결한 프로젝트 정의, 다른 개발도구나 서버환경에서 자동으로 통합 가능함

쉽게 구조를 검사할수 있고, 결과물에 대해 이해한 상태에서 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 댓글

  1. 막판 열심히 달리네. 내일 스터디 기대 된다.

  2. 저도 반드시 들으러 가겠음. ㅋㅋㅋ

    흠... 주변에서 Gradle로 넘어가려는 모습들이 많이 보이는데,

    Gradle에 대해서도 알아두면 좋을 것 같네요. ^^ 그럼 내일 뵙겠습니다.

  3. 다들 잘 알고 계신거라 ㅋㅋ 제가 모르는거 오히려 폭풍 질문할 시간이 될지도 모르겠네요 ㅋ