페이지

2022년 7월 6일 수요일

Eclipse Java 프로젝트를 Maven 프로젝트로 변환하기

Eclipse Java 프로젝트를 Maven 프로젝트로 변환하기

1. 들어가는 말

이 글에서는 Eclipse Java 프로젝트Maven 프로젝트로 변환했을 때의 이점과 변환 방법을 소개합니다.

구분 설명 소스 폴더 위치
Eclipse Java 프로젝트 Eclipse에서 File -> New -> Project -> Java -> Java Project 메뉴를 통해서 생성한 프로젝트 src
Maven 프로젝트 Maven을 사용해서 빌드하는 프로젝트 (Eclipse의 File -> New -> Project -> Maven -> Maven Project 메뉴를 통해서 생성할 수도 있음) src/main/java
src/test/java

개발하고 있는 Java 응용프로그램 프로젝트의 규모가 복잡하지 않더라도 그 수가 수십 개에 이르고 IDE와 빌드 도구마저 제각각이라면 이로부터 발생하는 어려움들을 과소평가해서는 안됩니다. 대표적인 어려움 몇 가지를 적어보면 아래와 같습니다.

  • 이 프로젝트의 배포용 실행 파일을 어떻게 만들지?
    • 타겟 클래스 버전은?
    • 어떤 파일들이 실행 파일에 포함되어야 하지?
    • 리소스 파일은 어디에 복사해야 하지?
    • 외부 참조 파일은 어떤 방식으로 포함시키지?
    • 새롭게 빌드한 결과 파일의 크기가 왜 기존의 결과 파일 크기와 다르지?

IDE가 제공하는 자체 빌드 도구를 통해서 위의 어려움들을 어느 정도 완화시킬 수는 있지만 만족스러운 정도는 아니며 모든 개발자들이 동일한 IDE를 쓰도록 유도하는 것도 쉽지는 않습니다. 왜냐하면 각자 IDE를 선택하는 데에는 여러 가지 이유가 있을 것이기 때문입니다. 다행히도 위와 같은 문제를 해결하기 위해 탄생한 빌드 전문 도구인 Maven을 사용하면 프로젝트 정보를 pom.xml 파일에서 지정하고 mvn package 명령을 실행함으로써 배포용 실행 파일을 만들어 낼 수 있습니다.

어찌보면 당연해 보이는 이야기를 굳이 하는 이유는 IDE 제공 빌드 도구를 사용해서 빌드하는 프로젝트들이 생각보다 많기 때문입니다.

2. 변환했을 때의 이점

2.1. 의존성 관리 개선

2.1.1. Eclipse

  • 외부 라이브러리들을 특정 경로에 보관하고 이들을 참조하도록 빌드 구성을 수정합니다.
  • 사용할 라이브러리 버전을 바꾸고자 한다면 새로운 라이브러리 파일을 다운로드해서 저장하고 이 파일을 참조하도록 빌드 구성을 수정합니다.
  • 동일한 프로젝트 소스를 가지고 새로운 PC에서 개발 환경을 구성할 때 라이브러리 파일 저장 경로를 기존과 동일하게 유지하지 않으면 빌드 구성을 수정해 주어야 합니다.

2.1.2. Maven

  • 참조할 외부 라이브러리들에 대한 정보(groupId, artifactId, version)를 pom.xml 파일에서 지정합니다.
  • 사용할 라이브러리 버전을 바꾸고자 한다면 version 값만 수정하면 됩니다.
  • 새로운 PC에 개발 환경을 구성할 때 라이브러리 파일 저장 경로와 관련하여 수정할 사항은 없습니다.

2.2. 단위 테스트 개선

2.2.1. Eclipse

  • JUnit 라이브러리를 참조하도록 빌드 구성을 변경하고 테스트 코드를 작성하여 실행합니다. 복잡한 편은 아니지만 프로젝트가 많을 때, 사용하는 IDE가 서로 다를 때 불편할 수 있습니다.

2.2.2. Maven

  • JUnit 의존성을 추가하고 테스트 코드를 작성하여 실행하는 과정이 간편합니다.

2.3. JAR 파일 묶기 개선

2.3.1. Eclipse

  • Export -> Runnable JAR file 메뉴로 실행 가능한 JAR 파일을 만듭니다. 하나의 프로젝트에 대해 작업을 반복해야 하거나 여러 프로젝트들에 대해서 작업을 수행해야 할 때 매우 번거로운 과정이 될 수 있습니다.

2.3.2. Maven

  • pom.xml 파일에 shader 플러그인을 추가하고 mvn package 명령으로 실행 가능한 JAR 파일을 만듭니다. 한 줄 명령을 실행하는 것으로 원하는 결과를 얻을 수 있습니다.

3. 변환 방법

3.1. Eclipse에서 변환

Eclipse 내에서 아래의 과정을 수행합니다.

  1. 프로젝트를 선택한 상태에서 마우스 오른쪽 버튼을 클릭합니다.
  2. 컨텍스트 메뉴 Configure -> Convert to Maven Project를 클릭합니다.
  3. Create new POM 대화상자에서 입력 값을 그대로 두거나 변경한 후 Finish 버튼을 클릭합니다.
  4. Eclipse를 종료합니다.

위 작업의 결과로 Eclipse가 사용하는 .project 파일과 .classpath 파일이 변경되고 Maven이 사용하는 pom.xml 파일이 생성됩니다.

  • 변환 전 .project 파일

    <?xml version="1.0" encoding="UTF-8"?>
    <projectDescription>
        <name>HelloWorld</name>
        <comment></comment>
        <projects>
        </projects>
        <buildSpec>
            <buildCommand>
                <name>org.eclipse.jdt.core.javabuilder</name>
                <arguments>
                </arguments>
            </buildCommand>
        </buildSpec>
        <natures>
            <nature>org.eclipse.jdt.core.javanature</nature>
        </natures>
    </projectDescription>
    
  • 변환 전 .classpath 파일

    <?xml version="1.0" encoding="UTF-8"?>
    <classpath>
        <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
        <classpathentry kind="src" path="src"/>
        <classpathentry kind="output" path="bin"/>
    </classpath>
    
  • 변환 후 .project 파일

    <?xml version="1.0" encoding="UTF-8"?>
    <projectDescription>
        <name>HelloWorld</name>
        <comment></comment>
        <projects>
        </projects>
        <buildSpec>
            <buildCommand>
                <name>org.eclipse.jdt.core.javabuilder</name>
                <arguments>
                </arguments>
            </buildCommand>
            <buildCommand>
                <name>org.eclipse.m2e.core.maven2Builder</name>
                <arguments>
                </arguments>
            </buildCommand>
        </buildSpec>
        <natures>
            <nature>org.eclipse.m2e.core.maven2Nature</nature>
            <nature>org.eclipse.jdt.core.javanature</nature>
        </natures>
    </projectDescription>
    
  • 변환 후 .classpath 파일

    <?xml version="1.0" encoding="UTF-8"?>
    <classpath>
        <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
            <attributes>
                <attribute name="maven.pomderived" value="true"/>
            </attributes>
        </classpathentry>
        <classpathentry kind="src" output="target/classes" path="src">
            <attributes>
                <attribute name="optional" value="true"/>
                <attribute name="maven.pomderived" value="true"/>
            </attributes>
        </classpathentry>
        <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
            <attributes>
                <attribute name="maven.pomderived" value="true"/>
            </attributes>
        </classpathentry>
        <classpathentry kind="output" path="target/classes"/>
    </classpath>
    
  • 생성된 pom.xml 파일

    <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>HelloWorld</groupId>
      <artifactId>HelloWorld</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <build>
        <sourceDirectory>src</sourceDirectory>
        <plugins>
          <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
              <source>1.8</source>
              <target>1.8</target>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </project>
    

3.2. 소스 폴더 변경

  1. Maven이 사용하는 pom.xml 파일을 열고 <build> 아래에 있는 <sourceDirectory> 항목을 제거합니다. 이렇게 하면 Maven은 src/main/javasrc/test/java을 기본 소스 폴더 위치로 사용하게 됩니다.
  2. Eclipse가 사용하는 .classpath 파일을 열고 kind="src" 항목을 아래와 같이 편집합니다.
    <!--
    <classpathentry kind="src" output="target/classes" path="src">...</classpathentry>
    -->
    <classpathentry kind="src" output="target/classes" path="src/main/java">
        <attributes>
    		<attribute name="optional" value="true"/>
    		<attribute name="maven.pomderived" value="true"/>
    	</attributes>
    </classpathentry>
    <classpathentry kind="src" output="target/test-classes" path="src/test/java">
        <attributes>
    		<attribute name="optional" value="true"/>
    		<attribute name="maven.pomderived" value="true"/>
    		<attribute name="test" value="true"/>
    	</attributes>
    </classpathentry>
    
  3. src 폴더 아래의 파일들을 src/main/java 폴더 아래로 옮깁니다.

3.3. Eclipse 시작하고 새로고침

  1. Eclipse를 시작합니다.
  2. 프로젝트 이름에서 마우스 오른쪽 버튼을 클릭하고 컨텍스트 메뉴 Refresh를 클릭합니다.

3.4. 의존성 추가

  1. pom.xml 파일을 열고 마우스 오른쪽 버튼을 클릭합니다.
  2. 컨텍스트 메뉴 Maven -> Add Dependency를 클릭합니다.
  3. 추가할 라이브러리에 대한 Group Id, Artifact Id 등을 입력하고 OK 버튼을 클릭합니다.

직접 다운로드한 JAR 파일에 대한 의존성을 pom.xml에 추가하려면 아래와 같은 방법으로 먼저 Maven 로컬 저장소에 설치해야 합니다.

  1. Maven의 install:install-file 명령을 사용하여 JAR 파일을 Maven 로컬 저장소에 저장합니다.
    mvn install:install-file -Dfile=.\ojdbc6.jar -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.3 -Dpackaging=jar
    
  2. 의존성을 추가합니다.
    <dependency>  
        <groupId>com.oracle</groupId>  
        <artifactId>ojdbc6</artifactId>  
        <version>11.2.0.3</version>  
    </dependency>
    

4. 단위 테스트 추가하기

4.1. pom.xml

  1. JUnit 의존성을 추가합니다.

    <dependency>  
        <groupId>junit</groupId>  
        <artifactId>junit</artifactId>  
        <version>4.13.2</version>  
        <scope>test</scope>  
    </dependency>
    
  2. pom.xml 파일에서 마우스 오른쪽 버튼을 클릭하고 컨텍스트 메뉴 Maven -> Update Project를 클릭합니다.

4.2. src/test/java/com/example/DateTimeUtilTest.java

  1. 아래와 같은 단위 테스트 코드를 추가합니다.

    package com.example;
    
    import org.junit.Assert;
    import org.junit.Test;
    
    public class DateTimeUtilTest {
    	@Test
    	public void testGetFormattedShortDateTimeNow() {
    		String s = DateTimeUtils.getFormattedShortDateTimeNow();
    		System.out.println(s);
    		Assert.assertTrue(s != null);
    	}
    }
    

4.3. 테스트 실행

  • 모든 단위 테스트 실행

    mvn test
    
  • 특정 클래스의 단위 테스트 실행

    mvn -Dtest=TestMapper test
    
  • 특정 메쏘드의 단위 테스트 실행

    mvn -Dtest=TestMapper#testCheckTable test
    

5. JAR 파일 묶기

5.1. pom.xml

shader 플러그인 추가

<build>
    <finalName>example</finalName>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.3.0</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>com.example.ExampleMain</mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

5.2. 패키징 실행

mvn package

6. 기타

6.1. 소스 파일 문자셑 지정

문자셑으로 MS949를 쓰는 명령 프롬프트에서 mvn 명령을 사용하여 컴파일할 때 아래의 경우 문자 인코딩 오류가 발생할 것입니다.

  • 소스 파일의 문자셑이 UTF-8이고 소스 파일 내에서 한글을 사용

이 문제는 pom.xml에서 문자셑을 UTF-8로 지정하면 해결됩니다.

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>

6.2. Java 컴파일러 버전

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

또는

<plugins>
    <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
    </plugin>
</plugins>

위 두 속성의 기본값은 1.6이다.

7. 참고 자료

  1. Apache Maven Shade Plugin
  2. How to convert an existing Java Project to Maven in Eclipse?
  3. Setting the Java Version in Maven

Written with StackEdit.

국어 맞춤법 참고 자료

  제목 설명(인용) 출처 IT 글쓰기와 번역 노트 IT 기술 문서 및 서적을 집필/번역/교정하면서 얻은 경험/정보/지식을 공유합니다. 전뇌해커 [우리말 바루기] ‘대로’의 띄어쓰기 명사 뒤에서는 붙여 쓰고, 그 외에는 띄어 쓴다고 생각하면 쉽다. 다...