개발관련/(과거)메모

Runnable/ExecutableJAR with Maven(Java 배치프로그램/메이븐 빌드)

동팡 2021. 5. 19. 23:54

메이븐 빌드 관련 간단한 메모

 

개요

메이븐을 단순 디펜던시 관리 툴로만 사용하는 안타까운 상황이 많이 존재한다. 


메이븐은 빌드 도구 이다.


Maven의 기본 목표는 개발자가 최단 시간 내에 프로젝트의 전체 사이클(상태)를 이해할 수 있도록하는 것입니다.
즉, 숲을 이해할 수 있게 도와주는 도구이다. 메이븐은 위의 목표를 달성하기 위해 아래 사항을 신경?쓴다.


빌드 절차의 간소화: 빌드 플러그인을 통해 쉽게 빌드를 할 수 있다.
일원화된 빌드 절차: 메이븐을 이해하면 메이븐 기반의 모든 프로젝트의 빌드를 이해할 수 있다(Uniform Interface).
프로젝트의 정보 제공: POM 파일을 통해 프로젝트의 다양한 정보를 확인할 수 있다. 
위의 사항 외의 다양한 정보를 제공한다. 기회가 되면 메이븐 관련 서적을 읽어봐야겠다. 

 

컴파일러 플러그인

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-compiler-plugin</artifactId>
	<version>3.8.0</version>
	<configuration>
		<source>1.8</source>
		<target>1.8</target>
	</configuration>
</plugin>
  • 해당 플러그인은 메이븐의 디폴트 라이프사이클에 바인딩되어 있다.
    • Goal은 다음과 같다.
    • compiler:compile: main 소스 컴파일
    • compiler:testCompile: test 소스 컴파일
  • 2) javac 컴파일 할 때 특정 아규먼트를 전달할 때 해당 플러그인을 통해 설정할 수 있다.
  • 3) 프로젝트에서 특정 JDK를 사용하거나 특정 JDK의 버전으로 컴파일을 해야할 때 사용한다.
    • source: 만약 Java8의 기능을 사용하기 위해서는 해당 값을 1.8으로 설정한다.
    • target: JVM 1.8에 호환이 되어야하면 해당 값을 1.8으로 설정한다.

리소스 플러그인

<plugin>
	<artifactId>maven-resources-plugin</artifactId>
	<executions>
		<execution>
			<id>copy-resources</id>
			<phase>validate</phase>
			<goals>
				<goal>copy-resources</goal>
			</goals>
			<configuration>
				<outputDirectory>${project.build.directory}/resources</outputDirectory>
				<resources>
					<resource>
						<directory>src/main/resources</directory>
						<includes>
							<include>conf/**</include>
							<include>db/**</include>
							<include>ret/</include>
						</includes>
					</resource>
				</resources>
			</configuration>
		</execution>
	</executions>
</plugin>
  • 1) 리소스 플러그인은 프로젝트에서 사용하는 리소스(resources 디렉토리)를 특정 디렉토리에 복사를 한다.
  • 2) 해당 플러그인은 메인 소스코드, 테스트 소스코드의 리소스 복사, 커스텀 복사 총 세가지 역할을 한다. 
    • Goal은 다음과 같다.
    • resources:resources: 메인 소스 코드의 리소스를 메인 output 디렉토리에 복사한다.
    • resources:testResources: 테스트 소스 코드의 리소스를 테스트 output 디렉토리에 복사한다.
    • resources:copy-resources
  • 3) 해당 플러그인 또한 메이븐의 디폴트 라이프사이클에 바인딩되어 있다. 디폴트 빌드 라이프사이클에 의해 target 디렉토리에 classes, test-classes에 복사를 진행한다.
  • 위의 사항을 정리하면 conf, db, ret 디렉토리에 있는 파일들을 빌드_디렉토리/resources 디렉토리에 해당 파일들을 복사한다.

JAR 플러그인

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-jar-plugin</artifactId>
	<configuration>
		<archive>
			<manifest>
				<addClasspath>true</addClasspath>
				<classpathPrefix>libs/</classpathPrefix>
				<mainClass>
					com.example.trans.Application
				</mainClass>
			</manifest>
			<manifestEntries>
				<Class-Path>./resources/</Class-Path>
			</manifestEntries>
		</archive>
		<excludes>
			<exclude>**/conf/**</exclude>
			<exclude>**/db/**</exclude>
			<exclude>**/ret/**</exclude>
		</excludes>
	</configuration>
</plugin>

메이븐 JAR 플러그인은 JAR를 생성하기 위한 플러그인이다. Goal은 다음과 같다.

  • JAR를 생성하기 위한 플러그인이다. 
  • jar:jar: 리소스가 포함된 클래스 파일들을 JAR화 한다.
  • jar:test-jar: 테스트 클래스 파일들을 JAR화 한다.

메이븐 없이 배치프로그램을 만들 경우 다음과 같이 진행한다.

 

  1. 소스코드의 패키지에 맞게 디렉토리 이동 및 클래스 패스 지정
  2. 사용하고 있는 라이브러리 클래스 패스 지정
  3. 메인 클래스의 분리 해당 클래스 파일 실행
  4. bat/sh 파일 생성(위의 사항의 java 커맨드는 길다. 그래서 별도의 스크립트의 기재가 필요하다.)

메이븐 빌드를 잘 몰랐을 때 위와 같이 미련하게 배치 프로그램을 구성하였다...

변경되거나 컴파일할 때 위의사항을 매번 진행하면 정말 비효율적이다. 
번거로움을 없애기 위해 메이븐의 JAR 플러그인을 사용한다. 

 

위의 설정을 통해 MANIFEST 파일의 커스텀과 JAR 파일에 들어가는 리소스 파일을 제어할 수 있다. 

  1. JAR안에 src/main/resources에 있는 파일들을 제외한다. 해당 파일은 JAR 밖에서 수정 및 사용이 필요하다.
  2. java -jar $ExecutableJAR를 실행할 때 com.example.trans.Application의 main 메소드를 실행한다.
  3. 클래스 패스에 resources, libs를 추가한다. 

디펜던시 플러그인

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-dependency-plugin</artifactId>
	<executions>
		<execution>
			<id>copy-dependencies</id>
			<phase>prepare-package</phase>
			<goals>
				<goal>copy-dependencies</goal>
			</goals>
			<configuration>
				<outputDirectory>
					${project.build.directory}/libs
				</outputDirectory>
			</configuration>
		</execution>
	</executions>
</plugin>

디펜던시 플러그인은 지정된 위치에 디펜던시들을 복사를 할 수 있다. 


JAR안에 라이브러리를 지정하지 않았기 때문에 프로젝트에서 사용하는 모든 디펜던시(라이브러리)들을 프로젝트 빌드 파일에 복사한다. 

 

참고문헌

https://maven.apache.org/what-is-maven.html
https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
https://maven.apache.org/plugins/maven-resources-plugin/
http://maven.apache.org/plugins/maven-dependency-plugin/
https://maven.apache.org/plugins/maven-jar-plugin/

 

마무리...

메이븐 국내 서적이 딱 한개있다. 

https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=11169988 

 

자바 세상의 빌드를 이끄는 메이븐

실제 프로젝트로 학습하는 생생한 메이븐 활용 전략이 담긴 책. 상당수의 자바 오픈 소스 프로젝트가 메이븐을 빌드 툴로 사용하지만, 이를 현업에 적용하는 것을 어려워하는 개발자를 위해 기

www.aladin.co.kr

위의 것을 한번 읽어봐야겠다...

그리고 Gradle도 한번 읽어봐야겠다.

프로그래밍 언어, 설계, 객체지향, DB에만 너무 관심을 가졌었다..

빌드 도구에도 관심을 갖고 공부를 해야 할 것 같다.