[JAVA] Gradle Project 를 Maven 프로젝트로 변경

Posted by 김성철

JAVA - Gradle Project 를 Maven 프로젝트로 변경

이유

회사에서 Gradle 로 keycloak에서 사용할 모듈을 만들었음.  
근데..음.. Jenkins 에서 빌드가 안됨  
그래들을 사용하여 빌드하면 특정 라이브러리 버전을 가져오지 못하는 현상이 발생하였음.  
maven으로 빌드하면 잘됨..  
<b>그래서 메이븐으로 빌드하기로 함<b>  
여기서 중요한 내용은 코드복사 이런부분보다 pom.xml 파일 작성이다.  

Maven 프로젝트 생성

메이븐 프로젝트를 생성한다.  
GroupId나 artifactId 는 이전에 사용한 것과 똑같이 만들었다.  

소스코드 복사

1. maven 프로젝트 생성 후 src/java/하위 경로에 Gradle 프로젝트에 있는 코드들을 똑같은 패키지로 복사한다.  
2. src/resocurces 폴더의 내용도 똑같이 옮겨온다.  

build.gradle 파일 확인

Gradle 에 설정한 내용은 아래와 같음  
=================================================================================================================  
plugins {  
	id 'java'  
}  
  
sourceCompatibility = '1.8'  
tasks.withType(JavaCompile) {  
	options.encoding = 'UTF-8'  
}  
  
ext {  
	keycloakVersion = '13.0.1'  
}  
  
repositories {  
	mavenCentral()  
}  
  
dependencies {  
	compileOnly("org.keycloak:keycloak-core:${keycloakVersion}")  
	compileOnly("org.keycloak:keycloak-server-spi:${keycloakVersion}")  
	compileOnly("org.keycloak:keycloak-services:${keycloakVersion}")  
	compileOnly("org.jboss.logging:jboss-logging:3.3.2.Final")  
	implementation("org.keycloak:keycloak-server-spi-private:${keycloakVersion}")  
	implementation("com.nimbusds:nimbus-jose-jwt:9.4.2")  
}  
task customFatJar(type: Jar) {  
	baseName = 'custom-username-password-form'  
	duplicatesStrategy = DuplicatesStrategy.EXCLUDE  
	from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } }  
	with jar  
}  
  
=================================================================================================================  

작성 전 분석 - 의존성

Gradle의 의존성 옵션은 아래와 같다.  
	compileOnly : compile 시에만 빌드하고 빌드 결과물에는 포함하지 않는다.  
	implementation : 의존 라이브러리 수정시 본 모듈까지 재빌드, 빌드시 라이브러리에 포함됨  
  
위와같은 내용은 Maven에서 <scope>와 같으며, 들어갈 옵션은 아래와 같음  
	provided : compile 할 때 필요하지만, 컨테이너 등에서 기본으로 제공되는 모듈임, 결과물에 포함하지 않음  
	compile  : default 설정으로 컴파일 할떄 필요하며 빌드에 포함됨  
  
위의 내용을 확인해봤을 때 아래와 같이 scope 를 설정하면 된다.  
compileOnly -> provided  
implementation -> compile  
※ compile 은 굳이 안넣어도 되긴해서 난 안넣엇음  

작성 전 분석 - 빌드

Gradle 로 빌드를 할때 라이브러리를 포함하여 빌드를 하고 있었다.  
그래서 빌드 명령어도 "gradlew customFatJar" 으로 사용했다.  
  
maven 에서 라이브러리를 포함하여 빌드를 하려고 하면 "maven-assembly-plugin" 을 사용해야 한다.  
내용은 길어서 아래의 그대로 작성해놓았으며 <pluginManagement> 태그를 보면된다.  
  
다만.. 음 버전이 2.2.1인데 버전을 3이상으로 바꾸면 에러가 나서 그냥 2.2.1로 했다.  
추후 시간이되면 바꿀 예정  

pom.xml 파일 작성

중요한 부분은 아래와 같다  
- dependency에 들어갈 라이브러리  
- dependency에서 설정할 scope  
- 라이브러리를 포함하여 Build하기위한 maven-assembly-plugin 설정  
  
<dependency> 에 들어갈 정확한 내용은 아래의 사이트에서 검색해서 찾아왔다.  
https://mvnrepository.com/  
  
=================================================================================================================  
<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.sungchul.keycloak.spi</groupId>  
  <artifactId>custom-username-password-form</artifactId>  
  <version>0.0.1-SNAPSHOT</version>  
  <name>custom-username-password-form-maven</name>  
  <!-- FIXME change it to the project's website -->  
  <url>http://www.example.com</url>  
  
  <properties>  
	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
	<maven.compiler.source>1.8</maven.compiler.source>  
	<maven.compiler.target>1.8</maven.compiler.target>  
  </properties>  
  
  <dependencies>  
	<!-- https://mvnrepository.com/artifact/org.keycloak/keycloak-server-spi-private -->  
	<dependency>  
		<groupId>org.keycloak</groupId>  
		<artifactId>keycloak-server-spi-private</artifactId>  
		<version>13.0.1</version>  
	</dependency>  
  
	<!-- https://mvnrepository.com/artifact/com.nimbusds/nimbus-jose-jwt -->  
	<dependency>  
		<groupId>com.nimbusds</groupId>  
		<artifactId>nimbus-jose-jwt</artifactId>  
		<version>9.4.2</version>  
	</dependency>  
  
	<dependency>  
		<groupId>org.keycloak</groupId>  
		<artifactId>keycloak-core</artifactId>  
		<version>13.0.1</version>  
		<scope>provided</scope>  
	</dependency>  
  
	<dependency>  
		<groupId>org.keycloak</groupId>  
		<artifactId>keycloak-server-spi</artifactId>  
		<version>13.0.1</version>  
		<scope>provided</scope>  
	</dependency>  
  
	<!-- https://mvnrepository.com/artifact/org.keycloak/keycloak-services -->  
	<dependency>  
		<groupId>org.keycloak</groupId>  
		<artifactId>keycloak-services</artifactId>  
		<version>13.0.1</version>  
		<scope>provided</scope>  
	</dependency>  
  
	<!-- https://mvnrepository.com/artifact/org.jboss.logging/jboss-logging -->  
	<dependency>  
		<groupId>org.jboss.logging</groupId>  
		<artifactId>jboss-logging</artifactId>  
		<version>3.3.2.Final</version>  
		<scope>provided</scope>  
	</dependency>  
  
  </dependencies>  
  
  <build>  
	<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->  
	  <plugins>  
	  <plugin>  
		<groupId>org.apache.maven.plugins</groupId>  
		<artifactId>maven-assembly-plugin</artifactId>  
		<version>2.2.1</version>  
		<configuration>  
		  <descriptorRefs>  
			<descriptorRef>jar-with-dependencies</descriptorRef>  
		  </descriptorRefs>  
		</configuration>  
		<executions>  
			<execution>  
				<phase>package</phase>  
				<goals>  
					<goal>single</goal>  
				</goals>  
			</execution>  
		</executions>  
	  </plugin>  
		<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html##clean_Lifecycle -->  
		<plugin>  
		  <artifactId>maven-clean-plugin</artifactId>  
		  <version>3.1.0</version>  
		</plugin>  
		<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html##Plugin_bindings_for_jar_packaging -->  
		<plugin>  
		  <artifactId>maven-resources-plugin</artifactId>  
		  <version>3.0.2</version>  
		</plugin>  
		<plugin>  
		  <artifactId>maven-compiler-plugin</artifactId>  
		  <version>3.8.0</version>  
		</plugin>  
		<plugin>  
		  <artifactId>maven-surefire-plugin</artifactId>  
		  <version>2.22.1</version>  
		</plugin>  
		<plugin>  
		  <artifactId>maven-jar-plugin</artifactId>  
		  <version>3.0.2</version>  
		</plugin>  
		<plugin>  
		  <artifactId>maven-install-plugin</artifactId>  
		  <version>2.5.2</version>  
		</plugin>  
		<plugin>  
		  <artifactId>maven-deploy-plugin</artifactId>  
		  <version>2.8.2</version>  
		</plugin>  
		<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html##site_Lifecycle -->  
		<plugin>  
		  <artifactId>maven-site-plugin</artifactId>  
		  <version>3.7.1</version>  
		</plugin>  
		<plugin>  
		  <artifactId>maven-project-info-reports-plugin</artifactId>  
		  <version>3.0.0</version>  
		</plugin>  
	  </plugins>  
	</pluginManagement>  
  </build>  
</project>  
=================================================================================================================