0%

maven의 local repository설정으로 jar 추가하기

개요

얼마 전 Maven 프로젝트에 custom jar를 local repository에 등록해서 사용해야하는 경우가 있었는데, 구체적인 방법을 몰라서 상당히 애를 먹었었다.

평소 대충 되면 되나보다 하고 넘어가며 딱히 Maven에 대한 공부를 게을리 한게 이렇게 고생하게 만들 줄이야.

Maven 프로젝트로 A 프로젝트를 만들어 a.jar를 만들고, 별도의 B 프로젝트에서 앞서 만든 a.jar를 local repository로 주입받아 사용하는 예제를 만들어 보겠다.

예제를 만들고 테스트하며 그 내용을 시간의 흐름대로 작성한 글이라 두서가 없다는 점을 미리 알린다.

a.jar를 만들 Maven 프로젝트 만들기

일단 intelliJ 에서 Maven 프로젝트를 만들어 보자.

Maven%20local%20repository%20jar/Untitled.png

Maven%20local%20repository%20jar/Untitled%201.png

Maven%20local%20repository%20jar/Untitled%202.png

Maven%20local%20repository%20jar/Untitled%203.png

위 화면들 처럼 Aproject라는 Maven 프로젝트를 만들었다.

Maven%20local%20repository%20jar/Untitled%204.png

생성된 프로젝트에서 App 클래스에 main 메소드에서 이 프로젝트가 A project 임을 명시했다.

실행해보니 콘솔에 System.out.println이 정상적으로 동작하는 것을 확인 할 수 있다.

지금 Aproject에는 App클래스와 그 안에 main 메소드만 덩그러니 있다.

나중에 생성할 Bproject에서 사용할 service 클래스를 추가하자.

Maven%20local%20repository%20jar/Untitled%205.png

위처럼 문자열을 리턴하는 service 클래스를 추가했다.

위 프로젝트를 Maven package 명령으로 jar를 만들고, 그 jar를 실행시키면 아래처럼 오류가 발생 할 것이다..

Maven%20local%20repository%20jar/Untitled%206.png

위처럼 Maven clean 성공.

Maven%20local%20repository%20jar/Untitled%207.png

그리고 Maven package 명령으로 Aproject의 jar를 생성했다.

생성된 jar를 java 명령으로 실행시키면 정작 아래처럼 메세지와 동작하지 않는다.

1
메세지: 기본 Manifest 속성이 없습니다.

Maven%20local%20repository%20jar/Untitled%208.png

실행 가능한 jar를 만들기 위해서는, 해당 jar파일을 실행하기위한 일종의 명세서 파일이 필요하다.

이 파일은 jar 파일 내부에 존재 해야 한다.

지금 Maven 프로젝트 build 설정에서는 그 명세서 파일(MANIFEST.MF)을 Maven package 명령시 자동으로 만들어주지 않아서 위처럼 jar가 실행되지 않는 것이다.

실행가능한 Maven jar 설정 추가하기

이제 위 프로젝트를 실행가능한 jar 프로젝트로 만들어 보자.

일단 pom.xml파일에 아래처럼 packaging을 jar로 하겠다고 명시한다.

Maven%20local%20repository%20jar/Untitled%209.png

그리고 기존의 build 부분을 아래처럼 수정해주자.

Maven%20local%20repository%20jar/Untitled%2010.png

중요한 부분은 mainClass태그 내부에 해당 프로젝트의 앤트리 포인트가 되는 클래스의 경로를 넣어주어야 한다.

pom.xml 전체소스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?xml version="1.0" encoding="UTF-8"?>

<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>org.example</groupId>
<artifactId>Aproject</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>

<name>Aproject</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.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<mainClass>
org.example.App
</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>

이제 다시 maven clean 후 maven package 를 실행시켜 새로 jar파일을 생성하고 실행해보자.

Maven%20local%20repository%20jar/Untitled%2011.png

위처럼 jar파일을 직접 실행시켰을때, 정상동작하는 것을 확인 할 수 있다.

내가 개발한 일종의 커스텀 jar파일을 생성했다.

그럼 이제 새로운 B 프로젝트를 생성하고 이 jar 파일을 사용하려면 어떻게 해야 할까?

경우의 수는 다음과 같을 것이다.

  1. 만약 당신이 오픈소스를 개발한다면, 그냥 maven repository에 올려서 사용하면 될 것이다.
  2. 만약 당신이 인터넷망이 아닌, 일종의 사내망에서 개발중이고 사내망에 nexus와 같은 사설 maven 저장소가 존재한다면 그곳에 올려서 사용 할 수도 있을 것이다.
  3. 다 귀찮다. 그냥 해당 a. jar파일을 새로운 프로젝트B에 직접 주입해서 사용할 것이고, B프로젝트를 pakcage 했을때, 일종의 외부 라이브러리인 a.jar 가 같이 패키징이 되어야 한다.

내가 지금 할 방법은 3번이다.

Maven local repository를 사용해서 특정 jar파일을 프로젝트에 포함시키기

Maven local repository를 강조하는 이유는, 내가 이 글을 쓰는 목적이기도 한다.

Eclipce나 IntelliJ와 같은 툴에서는 자체적으로 외부라이브러리를 추가하는 설정이 존재한다.

Eclipce의 경우 External library 같은 설정으로 있었던 기억이 있다.

위와 같이 개발도구의 설정으로 jar를 추가할 경우, 개발할때는 문제가 없지만, 정작 프로젝트를 package 했을때, 내가 임이로 추가한 jar라 같이 패키징이 안되는 경우가 있다.

따라서 내가 임의로 jar등을 외부 라이브러리로 추가할 때는 개발도구의 설정을 사용하기보다는, 개발 중인 프로젝트의 build 도구(Maven, gradle)의 설정으로 jar 외부 라이브러리를 추가하는 것이 깔끔하다.

새로운 Maven 프로젝트를 생성하겠다.

프로젝트명은 Bproject이다. 생성방법은 위 Aproject와 동일하기 때문에, 그 과정은 생략하겠다.

Maven%20local%20repository%20jar/Untitled%2012.png

위처럼 이름만 다른 Bproject를 생성했다.

그 다음에 Bproject의 pom.xml을 다음과 같이 수정해주자.

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<?xml version="1.0" encoding="UTF-8"?>

<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>org.example</groupId>
<artifactId>Bproject</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>

<name>Bproject</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>

<repositories>
<repository>
<id>localrepository</id>
<url>file://${basedir}/lib</url>
</repository>
</repositories>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.example</groupId>
<artifactId>Aproject</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>

</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>
org.example.App
</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>
${project.build.directory}/lib
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

Maven%20local%20repository%20jar/Untitled%2013.png

Aproject와 마찬가지로 jar 설정을 해준다.

Maven%20local%20repository%20jar/Untitled%2014.png

역시 Aproject와 마찬가지로 실행가능한 jar 생성을 위한 build plugin 설정도 추가해준다.

아래 부분이 실제 Maven에서 local repository를 설정하는 부분이다.

Maven%20local%20repository%20jar/Untitled%2015.png

id는 본인이 편한 고유값을 주면 된다.

url은 maven local repository의 jar 파일들이 있을 경로를 설정하는 부분이다.

관리하기 쉽게 위 처럼 basedir이라는 변수를 사용해서, 현재 프로젝트 root 경로에 lib 폴더를 설정했다.

이제 해야할 일은 Aproject에서 jar 파일과 pom 파일을 추출해야 한다.

Aproject로 돌아가서 jar파일과 pom파일을 추출하자.

Maven local repository를 위한 jar 추출하기

Aproject에서 maven clean 후 maven install 을 하자.

maven install을 하면 해당 프로젝트를 빌드해서 현재 pc의 전역 메이븐 저장소에 저장하게 된다.

Maven%20local%20repository%20jar/Untitled%2016.png

설치가 잘 되었는지 현재 pc의 메이븐 전역 저장소를 확인해보자.

윈도우 탐색기로 C:\Users\계정명.m2\repository 가면 메이븐 전역 저장소를 확인 할수 있다.

Aproject의 경로는 groupId와 artifactId 그리고 version 으로 경로가 조합되어 생선된다.

Maven%20local%20repository%20jar/Untitled%2017.png

해당 경로에 가보면 jar파일과 pom 파일이 생성된 것을 확인 할 수 있다.

위 Aproject 폴더를 통째로 복사하자.

그리고 Bproject 폴더로 이동해서 프로젝트 root 경로에 lib 폴더를 만들고 아래처럼 붙여넣자.

Maven%20local%20repository%20jar/Untitled%2018.png

그리고 Bproject의 pom.xml 에 아래처럼 해당 jar를 디펜던시로 추가해주자.

Maven%20local%20repository%20jar/Untitled%2019.png

lib 폴더의 경로와 pom.xml의 dependency groupId, artifactId, version을 잘 맞쳐주어야 오류가 나지 않는다.

Bproject의 main 메소드에서 추가한 자르의 Aservice클래스를 가져와서 호출하는 코드를 추가하고 실행하면 아래처럼 정상 동작을 확인 할 수 있다.

Maven%20local%20repository%20jar/Untitled%2020.png

여기까지 해서 된다고 안심 하면 안된다.

사실 maven local repository 설정 없이, 전역 maven 저장소에 maven install 로 설치되어 있다면 위처럼 개발툴에서 코드상에서 해당 jar를 가져와서 호출이 가능하다.

하지만 maven local repository 설정이 없다면 Bproject를 maven package해서 생성한 jar를 실행할 경우, 해당 jar를 찾지 못하고 오류가 날 것이다.

아래가 maven local repository 설정없이 maven package했을때, 라이브러리를 찾지 못하고 오류가 난 상황이다.

Maven%20local%20repository%20jar/Untitled%2021.png

하지만 우리는 앞서

pom.xml에 서 아래처럼 maven local repository 경로를 설정했고

Maven%20local%20repository%20jar/Untitled%2015.png

또 아래처럼 Aproject의 install 결과물을 해당 경로에 이동 시켰으며

Maven%20local%20repository%20jar/Untitled%2018.png

pom.xml 에 아래처럼 해당 라이브러리를 추가했기 때문에

Maven%20local%20repository%20jar/Untitled%2019.png

Bproject를 maven package하여 생성한 jar를 실행 시켰을때, 아래처럼 정상동작하는 것을 확인 할수 있다.

Maven%20local%20repository%20jar/Untitled%2022.png

끝!!!

예제 github 경로

https://github.com/hanumoka/20200124blog-maven-local-repository

참고자료

https://stackoverflow.com/questions/5692256/maven-best-way-of-linking-custom-external-jar-to-my-project

https://okjsp.tistory.com/1165644118

https://denodo1.tistory.com/282

https://blog.seotory.com/post/2016/03/maven-local-repository-setting

https://yujuwon.tistory.com/entry/maven에-custom-jar를-집어넣어-보자