- 기본 프로젝트 생성성

mvn -B archetype:generate -DgroupId=com.example -DartifactId=hajiboot -Dversion=1.0.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-quickstart


- 프로젝트에 사용하는 라이브러리의 종속성 확인

mvn dependency:tree

Posted by 빨강토끼
,

maven 으로 jar 를 생성하여 배포할때 종속적인(dependency) 라이브라리들이 실행시 필요합니다.

war 프로젝트는 WEB-INF 라는 폴더아래로 필요한것들을 넣어주지만 jar에서는 일일히 dependency로 추가된
라이브러리들을 처리하는것이 무척 귀찮고 막막합니다.

하나씩 잡아줘보지만 한두개도 아니고....
이럴땐 2가지 방법이 있습니다.

첫번째는 dependency를 따로 폴더안으로 모두 복사해오고 META-INF/MENIFEST.MF를 수정하는 것입니다.
아래와 같이 플러그인을 추가하고 goal로 install을 실행하면 모든 dependency 들이 lib안으로 복사하여 모으고 jar파일생성시  META-INF/MENIFEST.MF를 수정합니다.


  1. <plugin>  
  2.     <groupId>org.apache.maven.plugins</groupId>  
  3.     <artifactId>maven-dependency-plugin</artifactId>  
  4.     <executions>  
  5.         <execution>  
  6.             <id>copy</id>  
  7.             <phase>install</phase>  
  8.             <goals>  
  9.                 <goal>copy-dependencies</goal>  
  10.             </goals>  
  11.             <configuration>  
  12.                 <outputDirectory>  
  13.                      ${project.build.directory}/lib  
  14.                 </outputDirectory>  
  15.             </configuration>  
  16.         </execution>  
  17.     </executions>  
  18. </plugin>  
  19. <plugin>  
  20.     <groupId>org.apache.maven.plugins</groupId>  
  21.     <artifactId>maven-jar-plugin</artifactId>  
  22.     <version>2.3.2</version>  
  23.        
  24.     <configuration>  
  25.         <finalName>${jar.name}</finalName>  
  26.         <!-- jar 파일이 생성될 폴더 -->  
  27.         <outputDirectory>${deploy.target.dir}</outputDirectory>  
  28.         <archive>  
  29.             <manifest>  
  30.                 <!-- public static void main() 함수가 있는 클래스 지정 -->  
  31.                 <mainClass>oasyss.Main</mainClass>  
  32.                    
  33.                 <!-- jar 파일 META-INF/MANIFEST.MF 에 클래스패스 정보 추가 -->  
  34.                 <addClasspath>true</addClasspath>  
  35.                    
  36.                 <!--   
  37.                     클래스패스에 추가시 prefix 설정   
  38.                     ex) log4j-1.2.16.jar -> lib/log4j-1.2.16.jar 로 추가됨   
  39.                 -->  
  40.                 <classpathPrefix>lib/</classpathPrefix>  
  41.             </manifest>  
  42.         </archive>  
  43.     </configuration>  
  44. </plugin>  
  45.            


두번째방법은 jar 안에 모든 dependency를 포함시키는 것입니다. jar하나로 모든 라이브러리들이 포함되어 실행이 되는 구조입니다. 당연히 파일크기가 커지겠지요.

  1. <project>  
  2.   <build>  
  3.     <plugins>  
  4.       <plugin>  
  5.         <groupId>org.apache.maven.plugins</groupId>  
  6.         <artifactId>maven-assembly-plugin</artifactId>  
  7.         <version>2.2.1</version>  
  8.         <configuration>  
  9.           <descriptorRefs>  
  10.             <descriptorRef>jar-with-dependencies</descriptorRef>  
  11.           </descriptorRefs>  
  12.         </configuration>  
  13.       </plugin>  
  14.     </plugins>  
  15.   </build>  
  16. </project>  


그리고
maven assembly:assembly 라고 콘솔에서 실행하면
abc-0.0.1-SNAPSHOT.jar
abc-0.0.1-SNAPSHOT-jar-with-dependencies.jar

위와 같이 라이브러리가 포함된 jar와 일반 jar 가 생성된것이 보입니다.

참조

http://entireboy.egloos.com/4615383
http://redrebel.tistory.com/entry/maven-으로-생성한-jar-파일이-실행이-안될때-NullPointerException


Posted by 빨강토끼
,


위와 같은 에러가 나오면서 maven 에서 mvn install 을 통해서 생성한 jar 파일이 실행이 안되는 경우가 있습니다.
이경우에는 실행가능한 jar를 생성할때 실행할 mainClass 를 지정하지 않아서 생기는 문제입니다.

실행가능한 JAR 를 만드는데 아래와 같은 단계를 추천합니다.

1. JAR 의 MAINFEST.MF 파일에서 main 클래스를 정의합니다. (MAINFEST.MF 파일을 Maven에서 애플래케이션을 패키징할때 생성되는 파일입니다.)
2. 프로젝트에 종속된 모든 라이브러리를 찾습니다.
3. 애플리케이션에서 해당 라이브러리를 참조할수 있도록 MAINFEST.MF 파일에 포함시킵니다.

위의 작업을 수동으로 직접할 수 도 있지만 maven-jar-plugin 과 maven-dependency-plugin 이라는 maven 플러그인을 사용하여 효율적으로 수행할 수 있습니다.

maven-jar-plugin
pom.xml 파일의 <build></build> 안에 아래내용을 추가합니다.

  1. <plugin>      
  2. <groupId>org.apache.maven.plugins</groupId>  
  3.     <artifactId>maven-jar-plugin</artifactId>  
  4.     <configuration>  
  5.         <archive>  
  6.             <manifest>  
  7.                 <addClasspath>true</addClasspath>  
  8.                 <classpathPrefix>lib/</classpathPrefix>  
  9.                 <mainClass>com.mypackage.MyClass</mainClass>  
  10.             </manifest>  
  11.         </archive>  
  12.     </configuration>  
  13. </plugin>  


mainClass 에 실행할 메인클래스를 지정합니다.

maven-dependency-plugin

pom.xml 파일의 <build></build> 안에 아래내용을 추가합니다.
  1. <plugin>  
  2.     <groupId>org.apache.maven.plugins</groupId>  
  3.     <artifactId>maven-dependency-plugin</artifactId>  
  4.     <executions>  
  5.         <execution>  
  6.             <id>copy</id>  
  7.             <phase>install</phase>  
  8.             <goals>  
  9.                 <goal>copy-dependencies</goal>  
  10.             </goals>  
  11.             <configuration>  
  12.                 <outputDirectory>  
  13.                      ${project.build.directory}/lib  
  14.                 </outputDirectory>  
  15.             </configuration>  
  16.         </execution>  
  17.     </executions>  
  18. </plugin>  


위와 같이 내용을 추가하였으면 다시 jar를 만들고 실행해 보면 실행이 될겁니다.

참조 :
https://www.ibm.com/developerworks/kr/library/j-5things13/
Posted by 빨강토끼
,

Maven으로 PMD check 중에
[WARNING] Error while parsing xx/xx.java: Can't use generics unless running in JDK 1.5 mode!
라는 메시지가 떠서 구글을 검색해봤는데

<properties> 

   <targetJdk>1.6</targetJdk> 
</properties> 


이것을 추가 하라고 나옵니다.
Posted by 빨강토끼
,