티스토리 뷰

Maven을 이용한 개발환경에서 mvn에 없는 외부 jar파일 (ex.개발자가 직접 만든 jar파일)을 Maven 레파지토리에 추가해줘야 하
는일이 생길 수 있다. 여러가지 구현방법이 있는데 그중 한가지방법과 주의사항에 대해 예제코드와 함께 알아보자.

JAVA 프로젝트 생성 + jar파일만들기

TestUtil이라는 클래스를 만들고 true와 false를 리턴하는 메소드를 생성후 빈 폴더를 만든뒤 해당폴더에다가 Jar파일을 생성하 였다.
jar파일명은 java-1.0.0.jar로 생성하였는데 이 jar파일명에 대한 설명은 아래에서 설명하고자한다.

외부 jar파일을 저장할 경로 생성

프로젝트 바로 하위경로에 lib라는 폴더를 생성후 com/java/1.0.0 이름의 폴더로 3댑스형식으로 생성후 위에서 생성해두었던 jar파일을 추가한 뒤 pom.xml에 오른쪽처럼 의존성을 추가해주었다.

Maven repositories 추가

위에서 lib폴더 하위에 생성된 jar파일을 받아오게끔 설정을 잡아주자.
그리고 Maven 에서는 ${project.basedir}이라는 환경변수를 제공해주는데 해당값은 현재 프로젝트의 root경로로 치환된다.
즉, 오른쪽 사진처럼 설정을 잡아두면 현재 프로젝트의 경로/lib 경로 하위에 있는 라이브러리 파일들을 레파지토리에 등록하게 되는데 이때 로컬에 있는 경로를 참조하기 위해서 경로앞에 file://를 붙혀줘야합니다.

테스트

외부에 있는 라이브러리를 추가후 기능테스트를 해보니 정상적으로 실행되었다.
Maven은 어떻게 외부라이브러리를 참조할 수 있는것일까? 동작원리를 간단히 짚어넘어가자.

동작원리

lib폴더하위를 잘보면 com / java / 1.0.0 / java-1.0.0.jar 순으로 되있다.
Maven은 라이브러리를 읽어드린후 로컬 레파지토리에 등록을 하는데 레파지토리 경로를 기준으로(/.m2/repository/)
groupId/artifactId/version/jar파일명순으로 등록을 하게된다.
즉, 외부 라이브러리를 추가할때는 groupId / artifactId / version / jar파일명순으로 등록을 해줘야 한다는 것이다.
그럼 각각의 이름은 어떻게 지어야 하는지에 대해 알아보자.

groupId
모든 프로젝트에서 고유하게 식별이 가능한 이름으로 한다. Java 패키지 네이밍 규칙에 맞게 만들면 된다.
ex) org.springframework.boot

artifactId
version명이 명시되있지않은 jar파일의 이름입니다. 네이밍 규칙은 소문자와 하이폰을 이용해서 만들면 된다.
ex) com-java-test

version
이 jar파일에 버전을 명시하는한다. 이때 버전에 날짜를 적게되면 SNAPSHOOT 빌드와 연관이 되있으므로 사용하지말자.
ex) 1.0, 1.0.0

lib 폴더의 하위구조를 다시한번 살펴보자.
라이브러리를 추가할 때 groupId/artifactId/version/jar파일명으로 등록이 가능하 다고했다.


groupId는 'com' 이라는 이름으로 지어주었다.

artifactId는 version이 없는 jar파일명 'java'
version은 jar파일명에 적혀있는 '1.0.0'으로 지었다. 근데 여기서 의문이 한가지 생길 수 있을것이다.


예를들어 artifactId에 숫자가 들어가는 라이브러리들이 있을껀데 이때 version명이랑 충돌이 발생하지 않을까 라는거다.
Maven은 jar파일의 이름을 보고 .jar를 기준으로 바로왼쪽에 명시된 숫자를 version명이라 인식하고 version명을 기준으로 왼쪽에 하이폰(-)이 있으면 하이폰 왼쪽에 있는걸 artifactId로 인식한다.


ex) java1-1.2.3.jar 일때 artifactId는 java1, version은 1.2.3 이 되는거다.



Spring boot로 웹개발할때 필수의존성인 starter-web의존성도 위와같은 구조로 라이브러리를 가져오게끔 되어있다.

주의사항

첫째는 외부 라이브러리 파일에서 기능이 추가되거나 변경되었을 경우 해당 변경본에 대한 jar파일을 생성후 lib폴더
하위에 넣는다해도 정상적으로 작동되지 않는다. 왜냐하면 기존에 이미 로컬레파지토리에 등록되있기 때문에 등록되있는걸 참조하기 때문이다. 이때는 version명을 변경을 해주거나, repository 디렉토리를 모두 삭제하면 된다.

 

둘째는 외부 jar파일이 만들어진 곳의 java version과 현재 내 로컬PC에 설치된 java version이 같아야 한다.
이게 무슨말이냐면 아래사진을 통해 확인해보자.

 

외부 jar파일이 만들어진 곳은 java 버전이 11로 되어있고. 실제 그 jar파일을 가져다 쓰는곳은 java 버전이 8로 되있다.
이때 테스트를 돌리면 아래와같은 익셉션이 발생한다.



에러로그를 확인해보니 다음과 같은 메세지를 확인할 수 있었다.



외부 jar파일은 java 11버전에서 컴파일이 되었는데 그걸 적용하고자할 프로젝트의 java 버전은 8로 되있기 때문이다.
java 11의 class파일버전은 55이고 java 8의 class파일버전은 52이다.



컴파일된 class버전은 class파일로 들어가보면 확인할 수 있다.

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
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
글 보관함