Maven

메이븐(Maven)

unboxing 2021. 3. 8. 22:58

뉴렉처(Maven)강의 정리

 

메이븐(Maven)이란?

 

빌드할때 사용할수있는 툴(도구)

IDE와 별개인 빌드도구이다 (IDE : 이클립스, 비주얼스튜디오 등등)

 

 

프로젝트 빌드과정

1) 프로젝트 생성
2) 라이브러리 설정
3) 코드작업
4) 컴파일
5) 테스트
6) 패키지만들기
7) 배포
8) 레포팅

이클립스가 제공하지 않는 Maven 만의 기능

1)프로젝트 생성 -> 사용자 정의 프로젝트

2)라이브러리 설정 -> 라이브러리 관리와 의존성 체크

7)배포 -> 라이브러리 저장소 활용

 

 

최근 IDE에 프로젝트 관리와 관련되어 포함되어 있는 전문화된 도구들

Git / CVS Maven / Gradle / Ant JUnit
버전관리 빌드툴 테스트

 


 

메이븐(Maven) 설치하기

 

1) maven.apache.org 사이트 접속 , Use 항목의 Download 클릭

 

2) Binary zip archive 의 zip 파일을 다운로드 받아준다.

 

3) 다운받은 파일을 압축을 풀고 자주쓰는 도구 폴더에 옮겨준다.

4) 메이븐을 실행할때는 존재하는 디렉토리에 가서 실행을 해야한다.

5) 다른 Tools 를 사용할때와 마찬가지로 Path라는 환경변수를 이용해 아무 디렉토리에서나 실행할수 있게 등록한다.

 

고급 시스템 설정 -> 환경변수 -> 새로 만들기 -> M2_HOME 이름의 환경변수를 만들어준다.

경로는 현재 압축푼 maven 파일(압축을 풀고 bin이 존재하는 경로까지)

6) M2_HOME 을 만들었으면  환경변수값을 이용해 Path에 등록을 해준다. (실행파일을 쉽게 실행할수있도록)

7) 설정이 잘 되었는지 확인하기 위해서 명령 프롬프트에 버전확인을 한다. 

      cmd 접속 -> mvn- version (확인)


 

 

Maven으로 자바 프로젝트 생성하기

 

Maven 프로젝트를 진행할 폴더를 하나 만든다. ( c드라이브 안의 maven 폴더생성 )

현재는 아무것도 없는것을 볼수있다.

 


만드는방법 ( 메이븐의 archetype을 생성 ) *인터넷이 연결되어 있어야한다.

c:\maven>mvn archetype:generate -DgroupId=com.newlecture -DartifactId=javaprj -DarchetypeArtifactId=maven-archetype-quickstart

 

프로젝트 구조형식(archetype)을 본인이 정의해서 인공물로 다른곳에 공유할수있다. (프로젝트 형태로)

 

archetype을 생성한다 (메이븐 프로젝트를 만들겠다.)

 

-D : 구분자

 

다른 사람이 만든 maven-archetype-quickstart 라는 프로젝트 구조를 기본으로 설정

( quickstart : java개발할때 사용되는 가장 기본적인 상태 )

 

javaprj라는 이름의 새로운 프로젝트를 생성한다.

 

프로젝트이름이 중복될 경우를 대비해서 식별하기 위한 groupid는 도메인형식의 이름으로 설정해준다.

 


명령 프롬프트(cmd)에서 메이븐의 archetype을 생성해준다

mvn archetype:generate -DgroupId=com.newlecture -DartifactId=javaprj -DarchetypeArtifactId=maven-archetype-quickstart

 

생성중 groupId와 artifactId를 보여주고 version을 설정할지를 물어보는 부분에서 Enter를 눌러준다.

(SNAPSHOT : 현재 개발중)

package명을 입력한 그대로 사용하겠으면 Enter를 눌러주면 된다.

 

완료되면서 BUILD SUCCESS 라고 출력되며 성공적으로 만들어진 프로젝트에 대한 경로와 정보를 볼수있다.

 

 

그후에 디렉토리를 확인해보면 javaprj가 만들어진것을 볼수있다.

탐색기에서 확인해보면 maven 폴더안에 생성된 프로젝트가 보인다.

경로를 따라가 보면 기본코드로된 테스트 파일이 존재한다.

 


 

Maven 프로젝트 컴파일과 실행하기

메이븐 프로젝트는 그 루트에 항상 메인이있는데 프로젝트를 컴파일을하거나 실행할때는 

pom.xml이 존재하는 디렉토리에서 Maven관련된 명령어를 이용해야한다.

 

 

메이븐프로젝트에 있는 테스트파일의 내용인 Hello World의 내용을 Hello Maven으로 수정을 해본다음 컴파일하는방법

 

javaprj 폴더 (pom.xml이 존재하는 폴더) 안에서 메이븐을 호출한뒤 compile을 시켜본다

명령어 : mvn compile

실행을 시키면 BUILD FALURE가 보이며 오류가 발생한 것을 볼수있다. ( Compilation failure )

 

프로젝트 루트에있는 pom.xml 파일을 열고(편집) properties를 추가로 넣어준다.

 

<properties>

     <maven.compiler.source>1.8</maven.compiler.source>

     <maven.compiler.target>1.8</maven.compiler.target>

</properties>

 

soure : 1.8버전으로 컴파일됬으면좋겟다.

target : 최소 1.8이상버전에서 수행되도록 컴파일하겠다.

 

 

저장후 다시 컴파일을 실행해 본다.

컴파일이 성공하며 BULD SUCCESS 가 보인다.

 

컴파일을 성공했다면 밑의 탐색기 경로로 들어가보면 App.class라는 클래스파일이 생성된것을 볼수있다.

 

 

컴파일이 아니라 package를 만드는 방법 mvn package 를 cmd 창에서 실행하게되면 

Building jar 라는 문구와 함께 BUILD SUCCESS가 된것을 볼수있다.

target 안에 파일을 준비했다고 하니깐 확인을 해본다.

target 폴더안에 jar파일이 준비된것을 확인할수있다.

 

 

jar 파일 내부를 확인하기위해 확장자명을 zip으로 바꿔준다.

안을 들여다보면 실행파일이 존재하는것을 볼수있다.

 

 

확인을 해봤으면 다시 jar로 확장자를 바꿔준뒤 jar를 이용해서 Class파일을 실행을 해본다.

 

cmd를 실행해 pom.xml이 있는 위치에서 java -cp target\javaprj-1.0-SNAPSHOT.jar com.newlecture.App 입력

자료파일의 경로 (어디에 존재하는지)

자료파일

 

 

자료파일의 출력내용이 잘 실행된것을 확인 할수있다.


 

 

Build Lifecycle

 

Maven의 명령어와 관련된 Build Lifecycle

 

 

수행단계에 대한 이름

mvn compile
mvn test
mvn package
mvn install
mvn deploy

메이븐 프로젝트의 빌드업 단계

<phases>

<phase>validate</phase>

<phase>initialize</phase>

<phase>generate-sources</phase>

<phase>process-sources</phase>

<phase>gennerate-resources</phase>

<phase>process-resources</phase>

<phase>compile</phase>

<phase>process-classes</phase>

<phase>generate-test-sources</phase>

<phase>process-test-sources</phase>

<phase>generate-test-resources</phase>

<phase>process-test-resources</phase>

<phase>test-compile</phase>

<phase>process-test-classes</phase>

<phase>test</phase>

<phase>prepare-package</phase>

<phase>package</phase>

<phase>pre-integration-test</phase>

<phase>integration-test</phase>

<phase>post-integration-test</phase>

<phase>verify</phase>

<phase>install</phase>

<phase>deploy</phase>

</phases>

 

앞의단계는 진행이 된다. (java개발과 웹개발시 단계가 조금다를수있지만 일반적으로는 비슷하다)

*packaging에 따라 다르다

실행하기를 원하는단계 까지만 실행 할수있다.

 

단계가 어떻게 설정되어있는지 확인하기위한 명령어

mvn help:describe -Dcmd=compile 를 입력해보면 알수있다. (원하는대로 플러그인을 사용하고안하고 할수있다)

 

Phase : 단계

Plug-in : 단계별로 실행할수있는 프로그램

Goal : plug-in의 자체를 가지고있는것

POM.xml에서 버전을바꾸거나 plug-in을 연결또한 할수있다.

 

 

메이븐 사이트에서 메이븐이 제공하는 Plug-in 보기 (각 단계별로 설정할수있는 플러그인들을 볼수있다)

 

 

이클립스 IDE로 Maven 프로젝트 임포트하기

 

새로운 메이븐 프로젝트 생성방법

File -> New -> Maven Project

만약 Maven project를 만드는게 없다면 Help -> Eclipse Market 접속 후 Maven Integration for Eclipse를 다운받아준다.

(최신 이클립스는 메이븐이 기본적으로 포함 되어있다)

 

기존에 있는 Maven Project을 가져오는 방법

File -> Import -> Maven그룹 -> Existing Maven Projects -> 프로젝트 선택 (pom.xml이 존재하는 디렉토리)

메이븐 프로젝트는 프로젝트 좌상단에 Maven의 약자인 M이 보인다.

 

메이븐의 빌드업기능과 IDE의 편집기능을 같이 사용할수있다.

컨트롤+F11을 눌러보면 이클립스의 콘솔창에 이클립스의 단축키를 이용해 실행할수 있게 된다.

 

 

컴파일러 플러그인과 JDK 버전 변경

 

컴파일단계를 수행하고있는 Plug-in을 수정하도록 한다.

 

메이븐 홈페이지의 Maven Plugins 메뉴를 들어가 compiler를 클릭

자세한 정보를 볼수있다.

 

Pom.xml 의 수정을 통해 Plug-in의 속성을 바꿔줄수가있다.

 

Pom.xml에서 메이븐 compile했을때 jdk 버전때문에 오류가 나와 수정했던 

<properties>

     <maven.compiler.source>1.8</maven.compiler.source>

     <maven.compiler.target>1.8</maven.compiler.target>

</properties>

properties문단을 전부 지워주고 Update Project를 진행하면 JDK버전이 바뀐것을 확인할수있다.

 

항상 Pom.xml을 수정했을때에는 프로젝트 우클릭 -> Maven -> Update Project를 해주는것이 좋다

 

 

Maven의 컴파일 Plugin을 수정하기위해 다음과 같이 입력을 할수있다. 

이렇게 추가해준뒤 Update project를 해준다면 기존에있던 설정이 오버라이드해서 이 내용으로 적용되게 된다.

위의 방식이아닌 새로운 방식이 테스트할때 지웠던 properties를 추가해주는 방식이다.

단순하게 JDK 버전만을 바꿀때 자주쓰는 방법이다.

 

CMD 에 mvn archetype:generate 를 입력하게되면

원격에 존재하는 많은 archetype의 프로젝트들이 존재한다. (번호선택으로 선택할수있다)

정의하지 않았을경우 기본적인 archetype은 maven-archetype-quickstart 이다.

 

 

웹 프로젝트로 변경

 

메이븐의 장점이 프로젝트 모델을 jar -> war 로 바꾸게되면 웹프로젝트가 만들어진다.

모델의 변화를 알아서 메이븐이 바꿔주는 방법

 

메이븐이 제공하는 자바프로젝트 구조

pom.xml 에서 packaging 을 jar에서 war로 바꿔주고 Update Project를 해준다.

JSP 처럼 웹개발할수있는 홈디렉토리인 webapp 가 만들어진것을 확인

하지만 이렇게만 바꾸게되면 pom.xml 에 오류가나온다 확인을 해보면 web.xml이 없다고 한다.

의도적으로한것이면 <failOnMissingWebXml> 을 설정하고

그게아니라면 web.xml을 추가하라고 한다.

 

web.xml을 추가하기 위해서 웹개발을 위한 홈디렉토리에 WEB-INF라는 폴더를 생성해주고

WEB-INF 폴더안에 tomcat이 가지고있는 web.xml을 복사해서 가져온다.

 

pom.xml의 오류가 사라진것을 볼수있다

현재 상태는 웹개발을 하기위한 웹프로젝트가 완성되었다. (자바프로젝트에서 웹프로젝트로 성공적으로 바뀌었다)

 

홈디렉토리에 간단하게 html을 하나 만들어서 테스트

서버실행시 컨트롤+F11을 눌러서 현재 web.xml을 가져온 9.0 톰캣을 선택하고 

그 톰캣(bin이 보이는)의 경로까지 설정하고 실행시킨다.

 

테스트 성공 

 


라이브러리 설정하기

 

테스트하기위해 webapp 폴더안에 index.jsp를 만들면 오류가 발생한다.

서블릿 클래스가 필요하지만 없다 ( 라이브러리가 필요하다 )

 

프로젝트 우클릭 -> Build Path -> Configure Build Path

Livrary 탭을보면 기본적으로 사용자가 설정할수있다.  Add Library 클릭 

 

Server Runtime 을 선택한후 Next

 

톰캣 9.0 버전을 클릭한뒤 Finsh 를하면 톰캣 라이브러리가 포함된다.

하지만 한곳이아닌 여러곳에서 프로젝트를 사용할경우 모두가 경로를 같게할수 없으니 수정을 계속해줘야한다.

이러한 문제는 Maven으로 해결 할수있다.

방금 라이브러리에 넣어둔 tomcat은 remove해주고 Maven을 이용한 방법으로 라이브러리를 추가한다.

 

 

 

Maven을 통해 라이브러리를 추가하는 방법

 

mvnrepository.com/ 메이븐 저장소에 접속한다.

필요한 라이브러리를 검색한다 ( 현재 JSP 라이브러리가 필요하니 JSP 검색 )

검색결과가 나타나면 필요한 라이브러리를 클릭

라이브러리를 클릭하여 들어가 보면 Version별로 보인다.

tomcat을 받으면서 자동으로 jsp 라이브러리를 받았으니 버전을 잘모른다.

JSP라이브러리 버전을 모를경우 tomcat 사이트접속 받은 톰캣의 Documentation을 클릭

클릭후에 사이드바에 있는 Reference를 살펴보면 톰캣 9의 JSP 버전을 볼수있다 2.3 version 

하지만 매번 이런식으로 필요한 라이브러리의 버전을 확인하는 방법은 불편하다

 

톰캣 버전으로 라이브러리를 확인하는 방법

검색을 할때 tomcat jsp 라고 검색을 한다.

라이브러리를 클릭하고 들어가보면 톰캣 버전으로된 jsp 라이브러리들을 확인할수있다.

사용자가 받은 톰캣버전에 맞는 라이브러리를 클릭한다.

 

직접 자료파일을 다운로드 받을수있지만 Maven을 사용하기 때문에 Maven 텍스트박스를 클릭 해준다.

카피되었다는 문구가 나오면 pom.xml로 돌아간다.

pom.xml의 dependencies(라이브러리) 밑에다가 붙여넣기를해주고 저장을 한다.

저장을 하면 하단에 무언가 다운로드가 되고 완료가 된다. (원격에 있는 자료가 로컬에 들어가는 작업)

org.apche.tomcat의 경로를 보면 라이브러리가 다운로드된것을 확인 할수있다

 

 

 

 

프로젝트의 라이브러리를 가보면 종속된것들 까지 포함되어 들어가있는것을 확인 할수있다.

 

아까 에러가 발생했던 jsp 페이지또한 에러가 없어지고 실행또한 잘되는것을 확인

 

pom.xml 프로젝트 모델만 가지고다닌다면 언제든지 라이브러리 설정을 자동으로 이어지게된다.

협업시 유용하다.


 

라이브러리 오류 문제

라이브러리 다운로드가 되다가 마는경우 (전체가 완료안되는경우)

자료가 깨졌을 경우에는 참조되는 목록이 나오지않는다 열리지않음

제대로 다운로드 완료된 상태

 

자료가 깨졌을 경우에는 먼저 이클립스를 닫아주고

c드라이브 -> 사용자 -> .m2 -> repository 안쪽으로 들어가서 전체를 지워준다.

그리고 다시 실행하면 등록했던 라이브러리를 자동으로 다시 다운받아준다.


라이브러리 인덱스 검색

pom.xml을 편집하는 편집기에 유용한 UI가 있다. pom.xml의 Dependencies 탭을 이용하는 방법

Dependencies를 활용하기 위해서는

Maven 메뉴 Window -> Show View -> Other -> Maven폴더 -> Maven Repositories 선택 -> Open

 

저장소에 들어가있는 라이브러리의 대한 목록을 인덱스화 시켜놓고있는 창이 나타난다.

라이브러리 인덱스 검색을 위해서는 인덱스 빌드를 해줘야한다. Global Repositories의 central을 우클릭한다

Rebuild Index 를 클릭하여 인덱스 목록을 받아주면된다 ( 시간이 오래걸린다 )

인덱스 목록을 받고있는 상태

Rebuild Indexs가 끝났다면  pom.xml 파일의 Dependencies 탭으로 간다.

이용하는 방법을 알아보기위해 jsp 라이브러리를 지워준다.

tomcat-jsp-api 파일을 선택하고 Remove 버튼을 클릭

 

Dependencies 를 사용해 tomcat-jsp-api를 다시 추가하기 위해 Add 버튼을 클릭

 

검색창에 tomcat이라고 검색시 인덱스 목록이 나열된다.

밑으로 내려서 org.apache 블럭을 찾아보면 tomcat-jsp-api 가 보인다 선택을 해서 버전또한 설정할수있다.

버전은 직접 입력하거나 ( > ) 버튼을 눌러서 찾아서 선택할수있다. 버전을 선택하고 OK를 눌러준다.

아까의 방법과 똑같이 추가된것을 볼수있다. 

Dependencies를 활용해서 간편하게 라이브러리를 추가하는 방법이다


 

 

내가 만든 라이브러리 설치하기

 

프로젝트개발시 모든라이브러리는 로컬저장소에 있어야만 사용할수있다.

 

 

일단 새로운 메이븐 프로젝트를 하나추가한다.

 

아키타입을 설치하지않고 기본으로 설정하기위해 simple project를 선택해준다.

다른프로젝트에 사용하기위한 라이브러리를 쓰도록한다.

Group Id 의 패키지명 설정하고

Artifact Id는 examlib 을 jar파일의 버전은 SNAPSHOP으로 설정한뒤 Finish 

만들어진 examlib의 jdk를 1.8이상으로 올려주도록한다.

 

 

버전을 바꾼뒤에 테스트를 위한 클래스를 만들어 코드를 추가하도록한다.

src/main/java 안쪽의 패키지명을 정하고 클래스를 하나 새로 만들어준다.

 

 

테스트할 코드내용을 넣어준다. 간단한 합계와 평균을 구하는 메소드와 Getter/Setter , toString 구현

 

이제 테스트로 만든 클래스를 전에 프로젝트에서 사용하려고 한다.

 

현재의 프로젝트를 라이브러리로 만들어서 전 프로젝트에 포함시키는방법

프로젝트 우클릭 -> Export

Java -> JAR file 을 사용해 jar파일을 만든다.

이제 이 jar파일을 로컬저장소에 저장을 해주어야한다. 

 

Maven은 이 방법 또한 편리하게 해결해줄수있다.

프로젝트파일을 우클릭을해서 Run As 안을 보면 메이븐 단계가 나오는것을 볼수있다.

이단계에서 Maven install을 클릭하면 콘솔창에서 Maven이 동작하면서 사용자의 저장소 경로가보이고

BUILD SUCCESS가 나온다.

저장소 경로로 탐색기를 통해 들어가보면 jar파일이 생긴것을 볼수있다. (메이븐의 편리함)

 

이제 라이브러리를 전 프로젝트에서 사용하기 위해서는 프로젝트의 pom.xml의

Dependencies를 이용해 Add를 해주어야하는데 그러기 위해서

Maven repository 안의 Local Repositroy를 Rebuild Index 해주어야 한다.

 

로컬 저장소에 있는 라이브러리를 사용하기위해서는 Rebuild Index를 실행해 목록을 생성한뒤에 

Dependencies를 이용해 Add 를 해주면된다

examlib를 검색한뒤 (아까전의 프로젝트이름) 선택후 추가해주도록한다.

 

 

폴더모양인 이유는 같은 이클립스에서 사용했기 때문이다.

 

라이브러리에 등록된것을 확인한뒤 사용을 한번 해보기위해 App.java에서 테스트 해보겠다.

라이브러리를 사용하여 Import를 할수있는것을 볼수있다.

 

테스트를 해보면 결과가 잘 나오는것을 볼수있다.

 

* 라이브러리를 다른사용자와 함께쓰고싶다면 센트럴 저장소에 옮기는 방법을 사용해야한다 ( deploy )

remote repository 로 옮겨지며 deploy를 하려면 메이븐의 계정이 필요하다