2017년 7월 1일 토요일

IntelliJ로 Gradle Java Project 생성부터 Runnable Jar 생성 까지

 안드로이드 개발 환경으로 Android Studio가 대세가 되다보니 이제 IntelliJ IDEA가 Java 개발에서도 많이 사용을 하게되고 더불어 Gradle도 빌드툴 분야에서 점점 더 입지를 넓혀가는 중이라 나도 Java 개발 환경으로 IntelliJ와 Gradle을 사용해 보려고 여러가지 테스트를 진행 중이다.

 그 중에서도 배포를 위한 Runnable Jar 파일을 생성하는 방법이 좀 까다로워서 여기에 그 방법을 남겨볼까 한다. 간단한 프로젝트를 하나 만들어서 Jar를 생성하는 것까지 최대한 간단하게 설명을 해보도록 하자.

 일단 IntelliJ를 실행하고 Create New Project를 선택해서 Gradle Java 프로젝트를 생성해 보자.

 Create New Project를 선택하면 아래와 같은 창이 뜨는데 왼쪽 뷰에서 Gradle을 선택하고 오른쪽 뷰에서 Java를 체크하고 Next를 눌러 다음으로 넘어가자.

그러면 Gradle 프로젝트 생성을 위한 기본 정보를 입력하는 창이 나오는데 Group ID와 Artifact ID를 적당히 원하는 값으로 넣어준다. 그림을 보면 Group ID와 Artifact ID의 일반적인 형식이 무엇인지 알 수 있을 것이다. 필수는 아니지만 적당히 맞춰서 넣어주는 게 좋겠다. Next를 눌러 다음으로 넘어가자. 

 다음으로 아래와 같은 창이 뜨면 대부분 기본적인 설정이 되어있지만 'Create directories for empty content roots automatically' 체크 박스만 추가로 더 해주도록 하자. 이렇게 해주면 기본적인 Java 소스 폴더 구조를 생성해준다. 그 구조를 사용하지 않을 계획이라면 필요없다. 'Use auto-import' 옵션은 뒤에 dependency를 추가할 때 다시 물어보기 때문에 반드시 필요하지는 않지만 여기서 체크를 해주는 게 편하다. (그림에서는 안했지만..) 나머지 옵션들은 Gradle이 권장하는 사용 패턴대로 되어있으므로 그대로 사용해도 된다. Next를 눌러 다음으로 넘어가자.

 마지막으로 프로젝트 이름과 생성 위치를 선택하고 Finish를 누르면 몇 초 정도 후에 생성이 완료된다.

 생성 완료 후에는 아래 그림의 왼쪽 프로젝트 뷰의 구조와 같은 형태가 된다. (메뉴 때문에 조금 가려졌지만 보이는 부분이 전부다)

 src -> main -> java 폴더에 우클릭해서 New > Java Class를 선택하면 클래스 생성 창이 뜨는데 적절히 클래스 이름을 입력하고 OK를 눌러 완료하면 클래스 파일 소스가 생성되어있다.

  생성된 파일을 더블클릭해서 열고 간단히 몇 줄 넣어보자. 

 실행하고 디버깅하는 방법은 일반 다른 IDE와 비슷하므로 메뉴를 좀 둘러보면 알 수 있으므로 여기서 설명은 하지 않고 바로 Runnable Jar 생성을 해보도록 하겠다.

 일반적으로 IntelliJ를 이용해서 jar를 생성할 때는 File > Project Structure... > Artifacts를 통해서 Artifact로 Jar를 하나 등록한 후 Build > Build Artifacts... 메뉴를 통해서 생성하는 방법이 많이 소개되어있다. 하지만 이 방법을 사용하면 IntelliJ의 버그때문인지 MANIFEST 파일을 생성하는 데 문제가 있고(인터넷에 많이 소개되어있으므로 자세한 설명은 생략) 그 문제를 피하더라도 dependency가 있는 외부 라이브러리를 같이 jar에 패키징하려고 하면 그 라이브러리의 MANIFEST 파일이 최종적으로 Jar에 남아서 실행이 안되는 문제가 있다.

 그러나 지금은 Gradle을 이용해서 프로젝트를 생성하였으므로 Gradle을 이용해서 Jar를 생성하면 아무 문제가 없다. Gradle 프로젝트이므로 당연히 이렇게 사용하는 게 더 맞을 것이다. 그 방법을 여기서 설명하려고 한다.

 기본적으로 Gradle 프로젝트를 생성하면 위 그림의 내용으로 build.gradle 파일이 생성되어 있다. 이 파일이 Gradle을 이용해서 빌드를 수행하기 위한 스크립트 파일이며 필요한 정보들이 최소한으로 설정되어있다. 간단히 설명하자면 'java' 플러그인이 사용되고 있고, repositories 항목의 mavenCentral()은 maven 으로부터 각종 dependency가 있는 라이브러리들을 가져오도록 설정한 것이고, dependencies 항목에 필요한 라이브러리들을 설정함으로써 maven 에서 필요한 것들을 가져오게 될 것이다.  지금은 test를 위한 컴파일 시에 junit 프레임워크가 필요하다고 설정한 것이다. (기본적으로 설정 되어있다) 나머지 버전 정보 등은 설명하지 않아도 간단한 것들이므로 보면 알 수 있을 것이다.

 위 내용은 기본적으로 생성되는 최소한의 상태다. 여기서 Jar 생성을 위해서 Manifest 정보만 아래와 같이 추가해주면 끝이다.


 아래 그림처럼 윈도우 우측의 Gradle 뷰를 열고 jar 항목을 더블클릭하면 Jar 빌드가 진행되고 최종적으로 왼쪽 프로젝트 뷰의 build -> libs 폴더 아래 jar 파일이 생성되어 있음을 확인할 수 있다. 터미널에서 직접 실행해보고 제대로 되는 지 체크해보기 바란다.

 이렇게 Gradle을 이용하는 방법은 dependency가 있는 라이브러리를 같이 jar로 묶어서 배포하려고 할 때도 이용할 수 있다. 간단하게 log4j2 라이브러리를 추가하고 같이 패키징 해보도록 하자.

 먼저 dependencies 항목에 아래 오른쪽 사각형과 같이 추가해주도록 하자. 간단히 설명하자면 compile할 때 이 라이브러리가 필요하다는 것을 Gradle 형식에 맞게 추가해 준 것이다. 참고로 두 개의 라이브러리를 등록한 것이다.

 이렇게 추가하면 auto import 옵션이 enable된 상태라면 자동으로 Gradle이 필요한 라이브러리를 maven으로부터 가져와서 왼쪽 사각형과 같이 프로젝트에 추가해준다. (정말 좋은 세상이다.) auto import가 꺼져있다면 작은 툴팁 같은 창이 우측 하단에 뜨면서 enable하겠냐고 묻는데 이 때 enable해도 된다. 가져오기가 완료되면 왼쪽 프로젝트 뷰의 External Libraries에 추가된 라이브러리가 보일 것이다.

 이제 build.gradle 파일을 아래와 같이 수정해준다.

 compile시에 필요한 파일들을 같이 패키징하기 위한 스크립트다. 디렉토리인 경우 그대로 넣고 jar인 경우 풀어서 넣는다. 많은 사람들이 소개하는 방법이지만 정확한 사용법은 Gradle과 Groovy를 제대로 사용할 줄 알아야 알 수 있을 것 같다. 앞에서 dependencies항목에 compile dependency로 jar 2개를 추가했으므로 추가된 jar 파일들의 내용물이 같이 포함되어 패키징될 것이다.

 다시 Gradle 뷰에서 jar를 더블클릭하여 jar파일 생성해보자. 생성된 jar 파일의 크기를 보면 이전에 몇 백 바이트 정도의 크기였던 jar 파일이 메가 단위로 커졌을 것이다. 생성된 Jar 파일의 내용을 보면 추가된 라이브러리의 .class 파일들이 잔뜩 들어가 있는 것을 알 수 있다. 물론 여기서는 HelloWorld 코드에서 직접 log4j 라이브러리를 사용하지는 않았지만 당연히 사용에 문제가 없다. 혹시 궁금하다면 직접 HellowWorld를 로그로 출력하는 코드를 테스트 해보기 바란다.

 참고로 jar 파일 안에 포함된 파일의 리스트를 보는 명령은 'jar -tf 파일이름.jar'이다. 압축을 풀어서 확인하고 싶다면 'jar -xvf 파일이름.jar' 명령을 실행하면 현재 폴더에 압축을 푼다.

0 개의 댓글:

댓글 쓰기