본문 바로가기

Backend

Legacy Application을 Executable Jar로 만들자

어떤 동영상을 변환하는 배치가 있다. 이 배치는...

  • 빌드도구가 적용되어있지 않고
  • 프로젝트 내부에 각종 설정파일이 들어있고
  • 수정한 클래스 파일을 하나씩 복사 붙여넣기로 배포한다.
  • 실행은 start.bat을 실행시킨다. 이 파일은 java 실행명령에 클래스패스와 메인 클래스를 호출하는 방식으로 동작한다.

이 배치를 Executable Jar로 만들고 싶었다. 이렇게 바꿔야 될 프로그램이 2개정도 더 있어서 기록해본다.

  1. 메이븐 프로젝트로 변환한다.

    • 인텔리제이의 경우 프로젝트 우클릭 → Add Framework Support → Maven 을 추가하면 pom.xml이 생성된다.
    • 팀에서 이클립스를 사용중이라면 다른사람도 메이븐 프로젝트로 열리도록 convert를 잘 해주자.
  2. 의존하고 있는 라이브러리를 모두 pom.xml에 작성한다.

    • 커스텀 라이브러리가 존재한다면 mvn install로 로컬 리포지토리(.m2)에 설치한다.

      • https://stackoverflow.com/questions/4955635/how-to-add-local-jar-files-to-a-maven-project 참고해서 설치했다.

        mvn install:install-file \
         -Dfile=<path-to-file> \
         -DgroupId=my-group-id \
         -DartifactId=my-artifact-id \
         -Dversion=1.0.0 \
         -Dpackaging=jar \
         -DgeneratePom=true
      • 이후 C:\Users\{USERNAME}\.m2\repository 에 들어가 보면 지정한 group-id 이름으로 된 폴더가 확인된다.

      • 기존 방식과 동일하게 의존성을 추가한다.

          <dependency>
              <groupId>my-group-id</groupId>
              <artifactId>my-artifact-id</artifactId>
              <version>1.0.0</version>
          </dependency>
    • 프로젝트 리포지토리를 만들고 싶다면 위 mvn install 수행 후 아래와 같이 설정한다.

      • 프로젝트에 폴더를 생성후 앞에서 생성 된 group-id 폴더를 복사한다.

      • 아래와 같이 리포지토리를 추가하고 마찬가지로 의존성을 추가하면 된다.

        <repositories>
          <repository>
              <id>my-project-repositoy</id>
              <url>file:///${project.basedir}/project-repo</url>
          </repository>
        </repositories>
  3. 의존성과 함께 Executable Jar로 번들링하는 빌드 옵션을 작성한다.
    https://www.baeldung.com/executable-jar-with-maven 를 참고하면 되는데 나는 maven-shade-plugin을 사용했다.

    • 거의 그대로 사용하면 잘 동작한다. jar를 실행했을 때 동작 할 메인함수를 잘 지정해주자.

      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-shade-plugin</artifactId>
          <executions>
              <execution>
                  <goals>
                      <goal>shade</goal>
                  </goals>
                  <configuration>
                      <shadedArtifactAttached>true</shadedArtifactAttached>
                      <transformers>
                          <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                              <mainClass>com.mypackage.MyConvertMain</mainClass>
                      </transformer>
                  </transformers>
              </configuration>
              </execution>
          </executions>
      </plugin>

추가로 설정파일을 외부에 위치시키도록 구현했는데 프로퍼티를 로드하는 부분은 Properties 클래스로 로딩하던 부분을 일부 수정했다.
로컬, 개발, 운영 모두 잘 동작할 수 있도록 외부경로와 classpath를 모두 체크하도록 로직을 구성했다.

이 배치는...

  • 빌드도구가 적용되어있지 않고
  • 프로젝트 내부에 각종 설정파일이 들어있고
  • 수정한 클래스 파일을 하나씩 복사 붙여넣기로 배포한다.
  • 실행은 start.bat을 실행시킨다. 이 파일은 java 실행명령에 클래스패스와 메인 클래스를 호출하는 방식으로 동작한다.

➡️ 이제 자동 배포를 준비해봐야겠다.

'Backend' 카테고리의 다른 글

Effective Java (1) - 아이템1, 2  (0) 2021.05.06
JPA (2) - 웹 계층 개발  (0) 2021.04.11
JPA (1) - 도메인 개발  (0) 2021.04.11
Spring Cloud 일단 기록하기  (0) 2021.03.01
Spring Core (4) AOP  (0) 2020.07.03