사실 간단한건데 삽질을 해서 삽질 유형과
해결 방법을 간단히 적어보려한다.
@ Executable Jar -> Java Application으로 실행가능한 jar.
Java Project에서는 .classpath 파일에서 main class 파일을 지정하고
Maven Project에서는 pom 파일에서 <build> 옵션으로 지정한다.
@ 이슈발생: 운영서버는 웹이 안된다. 그러니 repository를 로컬로 돌려야한다.
@ 원하는 결과: maven repository를 local로 바꿔서 runnable Maven으로 만들어도 잘 된다.
@삽질유형 1. jar 파일을 전부 <scope>system</scope><systemPath>...</systemPath>로 바꾼다.
-> maven properties에 <project.lib.path>${project.basedir}/src/main/lib/</project.lib.path> 와 같은 경로를 잡고 모든 dependency jar를 scope system 과 path로 잡는다.
-> 언뜻보면 될것 같지만 당연히 에러가 발생한다. Executable Jar에서는 <scope>가 runtime 또는 없어야한다.
-> maven build는 되나 실행시 에러가 발생한다.
-> 내 경우에는 이런 에러가 발생했었다.
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/context/support/AbstractApplicationContext
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
at java.lang.Class.privateGetMethodRecursive(Unknown Source)
at java.lang.Class.getMethod0(Unknown Source)
at java.lang.Class.getMethod(Unknown Source)
at sun.launcher.LauncherHelper.validateMainClass(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.springframework.context.support.AbstractApplicationContext
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 7 more
@삽질유형 2. 아차, 그럼 runtime으로 실행하는 jar의 <scope>를 runtime으로 바꿔보자.
-> 이때에는 jar path를 잡을 수 있는 방법이 없어서 maven build가 불가능하다.
@ 결론 Local Repository를 잡자
-> 단순하게도 repository 위치를 로컬로 잡으면 된다. 즉, 웹경로를 로컬경로로 바꾸면 되는 문제였다.
-> 이는 repository에 대한 개념이 완벽히 숙지 되지 않은 상태에서 삽질을 행했던 이유가 컸다.
그럼 단순하다. 이제 솔루션을 찾았으니 적용하면 되는데 예제는 "https://blog.seotory.com/post/2016/03/maven-local-repository-setting"를 사이트를 참고하였고, 적용은 다음과 같이 했다.
<properties>
<project.lib.path>${project.basedir}/src/main/lib/</project.lib.path>
</properties>
<dependencies>....생략...</dependencies>
<build>....생략...</build>
<repositories>
<!-- local -->
<repository>
<id>local-repo</id>
<name>local Repository</name>
<url>file://${project.lib.path}/</url>
</repository>
</repositories>
2018 03 13 Append
# 참고 사항
- groupId / artifactId 는 각각 구분자가 " - " 으로 붙는다.
- jar 명이 tiles-template-2.2.2.jar 이라면
groupId에 tiles를
artifactId 에는 template 을
version에는 2.2.2 를 넣으면 잡을 수 있다.
- "-"구분자가 두개여서 groupId와 artifactId를 구분해 넣을 수 있으면 좋으나
activation.1.1.jar 와 같이 구분자가 없다면 groupId를 com으로 넣고 artifactId에
jar 명을 넣으면 된다. 아래 예제 참조
example
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.lib.path>${project.basedir}/src/main/webapp/WEB-INF/lib/</project.lib.path>
</properties>
<dependencies>
<dependency>
<scope>system</scope>
<groupId>com</groupId>
<artifactId>activation</artifactId>
<version>1.1</version>
<systemPath>${project.lib.path}/activation-1.1.jar</systemPath>
</dependency>
<repositories>
<!-- local -->
<repository>
<id>local-repo</id>
<name>local Repository</name>
<url>file://${project.lib.path}/</url>
</repository>
</repositories>
'Java & Spring > Spring' 카테고리의 다른 글
XSS 대응 방법 (0) | 2017.06.19 |
---|---|
pom에서 properties 사용 (0) | 2017.04.06 |
Jackson + jqgrid + RequestBody 트러블 슈팅 (0) | 2017.01.30 |
이클립스 WAR 묶어서 올리는 방법 (0) | 2016.04.01 |
[Spring] Text 다운로드 처리 (0) | 2016.02.12 |
WRITTEN BY