반응형

사실 간단한건데 삽질을 해서 삽질 유형과

해결 방법을 간단히 적어보려한다.


 @ 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>

</dependencies>


    <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
데르벨준

,