이번에 spring boot 로 완전히 옮겨타면서 신세계를 경험하고 있는데~


여러가지를 덧붙여 사용하면서 lombok 을 접하게 되었다~


개인적으로 getter, setter 만드는 작업이 굉장히 짜증났는데 (물론 IDE 가 자동으로 만들어 주지만)


그 이유는 변수가 변경, 추가, 삭제될때마다 getter, setter 역시 변경해 줘야 되기 때문에...


lombok 을 사용하면서 그런 고충이 덜었다~ 


이전 프로젝트에 시험삼아 lombok 을 넣었는데...... (spring 3.x / xml configuration)


jenkins 에서 빌드가 안되는상황이 발생!!!!!


하나하나 조목조목 찾아봤더니... 


뭔가 setter 호출이 안되는 상황.... 뭐지....



(그림은 클릭하면 커집니다~)


분명히 intelliJ 에서는 잘 동작했는데.... 뭐여



일단 분명한것은 Compile 에러라는것!! 


구글링을 무지하게 하면서 결국 해결했는데 결론은.... 


maven compile plugin 이 너무 구 버전이었다....


2.3.2 버전을 사용하고 있었는데 2.4 버전부터 동작하는걸 보니 2.4 버전에 뭔가 업데이트 되었다고 판단!! 찾아봤다~


https://github.com/rzwitserloot/lombok/issues/877

참조 사이트에 보면 해당 내용이 존재한다.


 I had the same issue with maven 3 and lombok 1.16.x but simply updating maven-compiler-plugin to 3.3 (from 2.3.2 which does not support forceJavacCompilerUse) fixed it for me (no need for forceJavacCompilerUser, maybe because I'm still using Java 6?)


위 사람은 나랑 똑같은 상황에서 3.3으로 버전을 올려버린다... 뭐 물론 3.3이 현재 최신 버전이기도 하고 lombok 에서 추천하는 것 같다.


http://awhitford.github.io/lombok.maven/plugin-updates-report.html


위 사이트를 참조해 보면 maven compile plugin 3.3 버전의 상태가 나타나 있다. 


근데 문제는 2.3.2버전에서는 문제가 있는데 2.4에서 없으니 분명히 뭔가 수정된게 맞는데... 


릴리즈 노트에서는 아래 내용밖에 없다.... 흠...

Bug

  • [MCOMPILER-64] - "mvn clean install" crashes with java.lang.OutOfMemoryError: PermGen space after update to java 1.6.0_04
  • [MCOMPILER-94] - compiler sets artifact file to target/classes, even if nothing is compiled
  • [MCOMPILER-99] - Spaces in for external executable are not accepted
  • [MCOMPILER-120] - Javac compiler plugin doesn't support -Werror
  • [MCOMPILER-129] - unable to pass in javac -J option
  • [MCOMPILER-130] - compilerArgument option doesn't work with maxerrs option, compilerArguments does
  • [MCOMPILER-135] - Passing multiple parameters to Java 6 annotation processors with javac does not work
  • [MCOMPILER-136] - The description of the skip parameter of the testCompile mojo is incorrect
  • [MCOMPILER-148] - Misleading documentation on <configuration><encoding>
  • [MCOMPILER-149] - Java compiler warning is masking a javac exception, which the compiler plugin doesn't know how to parse
  • [MCOMPILER-167] - Incorrect default for generatedTestSourcesDirectory

Improvement

  • [MCOMPILER-137] - Plugin documentation refers to "Maven 2"
  • [MCOMPILER-147] - The usage page should use pluginManagement for configuring the plugin
  • [MCOMPILER-166] - Use plexus-compiler 1.8.6 for performance improvement

 


해당문제를 겪으시는 분은 간단히 버전업으로 해결할 수 있습니다~


참조로 릴리즈 노트부분도 링크 걸건데.. 혹시 알아내신 분은 알려주세요... 업무가 바빠서 일일이 보기가 힘드네요 ㅠㅠ


개인적으로는 아래 문제가 아닐까 판단됨....


  • [MCOMPILER-135] - Passing multiple parameters to Java 6 annotation processors with javac does not work


https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12317225&version=12330427





'Environment' 카테고리의 다른 글

[Maven-Lombok] cannot find symbol  (2) 2016.01.13
  1. 조우진 2016.01.26 17:01 신고

    제 삽질 3시간을 살려주셨네요...
    정말 감사합니다. :)

보통 빌드 툴로 maven을 가장많이 사용한다고 생각하는데.. 요즘은 gradle 인가요??


maven으로 빌드 시 revision 번호를 남기는 것을 남겨봅니다.


war 파일로 빌드하기 때문에 maven-war-plugin를 사용하며, 버전은 최소 2.3이상을 해야 error 가 없었습니다.. 

2.1 했더니 에러가..ㅎㄷㄷ


현재는 2.5.x 까지 나온걸로 확인됩니다~ 


configuration 의  war..., resource 부분의 경우 경우 build 시 경로지정이므로 생략하고 


Archive 부분을 살펴보면 manifest 부분을 꼭 확인해야 합니다~

<plugin>

<artifactId>maven-war-plugin</artifactId>

<version>2.3</version>

<configuration>

<warSourceDirectory>${basedir}/src/main/webapp</warSourceDirectory>

<webResource>

<directory>${basedir}/src/main/webapp</directory>

<targetPath>WEB-INF</targetPath>

</webResource>

<archive>

<manifest>

<addDefaultImplementationEntries>true</addDefaultImplementationEntries>

</manifest>

<manifestEntries>

<Revision>${build.number}</Revision>

<Build-Date>${build.timestamp}</Build-Date>

</manifestEntries>

</archive>

</configuration>

</plugin>



Application을 배포하면 META-INF 폴더가 생성되는데~ 하위에 MANIFEST.MF 파일안에 build 정보를 담을 수 있습니다~


## addDefaultImplementationEntries - 기본적인 프로젝트의 정보를 담는다.

Implementation-Title: ${project.name}

Implementation-Version: ${project.version}
Implementation-Vendor-Id: ${project.groupId}
Implementation-Vendor: ${project.organization.name}
Implementation-URL: ${project.url}


## manifestEntries 기능으로 추가적으로 정보를 담을 수 있는데 우리는 여기서 Revision, Build-Date 를 담기로 합니다~

${build.number} 변수지정으로 뭔가 값을 담기로 약속했다. ${build.timestamp} 의 경우 기본적으로 제공되는 기능임~

물론 <maven.build.timestamp.format>yyyy-MM-dd HH:mm:s Z</maven.build.timestamp.format> 포맷지정가능!!


## ${build.number} 의 값은 Local 에서 테스트해보면 값이 비어있다!! 멘붕 

>> 이유는 간단하다 revision 이라는 것은 SVN 또는 형상관리툴에서 사용하는 번호로 가장 최근 commit, submit 값을 담고있다. 그런데 로컬에서 빌드시에는 따로 svn 과 연동을 하지 않기때문에 해당값이 정상적으로 담기지 않는다.... 

근데 로컬에서도 SVN 연동되니까 왠지 가능할 것 같기도 한데?? >> 난 실패함 ㅠㅠ


## ${build.number} 해당값은 jenkins 에서 불러온다. 그렇다면 어디서??

- jenkins 프로젝트의 설정부분에 보면 maven 설정부분이 있는데 여기서 Goals and options 에서 지정가능하다!!

- clean , package 로 빌드하고 옵션값으로 SVN_REVISION을 지정할 수 있다. 물론 변수명은 같아야 되니까 build.number 써주는 센스



물론?? SVN Revision 만 되는건 아닌다~ 아래 사이트를 참고하자~

https://wiki.jenkins-ci.org/display/JENKINS/Building+a+software+project#Buildingasoftwareproject-JenkinsSetEnvironmentVariables


사용할 수 있는 모든 값들이 표시되어 있다!!


Local에서 테스트하다가 멘붕오시고 scm 같은거 넣다가 망하신 분들을 위해 넣었습니다. 굉장히 사소하지만 반드시 필요한 revision 입니다.


이게 왜 필요하냐구요??? 

만약 여러분이 서비스하는 사이트가 방대해져서 실제 서버 개수가 100개가 넘어간다 가정해봅시다!! 

자동배포툴을 사용해서 한다고 해도 100개가 넘는서버에 배포작업을 해야되는데 전부 같은 파일이 배포되었는지 어떻게 확인을 할지 생각을 해 봅시다~


실제 서버에서 확인한 결과물입니다.



Revision: 575 부분이 정확하게 찍혀있습니다~


아 그리고... 로컬에서 성공하신분들 꼭 알려주시면 감사요~

+ Recent posts