사용자 도구

사이트 도구


gradle:jpa_metamodel_generation

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
다음 판 양쪽 다음 판
gradle:jpa_metamodel_generation [2013/12/16 09:55]
kwon37xi
gradle:jpa_metamodel_generation [2020/10/15 15:43]
kwon37xi
줄 1: 줄 1:
 ====== Gradle에서 JPA 2 MetaModel 생성 ====== ====== Gradle에서 JPA 2 MetaModel 생성 ======
- 
 [[https://github.com/hibernate/hibernate-metamodelgen|Hibernate MetamodelGen]]을 이용하여 JPA2 MetaModel을 생성하는 예를 보여준다. [[https://github.com/hibernate/hibernate-metamodelgen|Hibernate MetamodelGen]]을 이용하여 JPA2 MetaModel을 생성하는 예를 보여준다.
 실제로는 compile 태스크에 들어가는게 좋으나, 현재 지원을 안 해서, 독릭적으로 JavaCompile 태스크를 만들고, 거기서 Annotation Processor만 호출하도록 변경한 것이다. 실제로는 compile 태스크에 들어가는게 좋으나, 현재 지원을 안 해서, 독릭적으로 JavaCompile 태스크를 만들고, 거기서 Annotation Processor만 호출하도록 변경한 것이다.
-''-proc:only'' 옵션 때문에 실제 컴파일을 하지 않는다.+  * ''-proc:only'' 옵션 때문에 실제 컴파일을 하지 않는다. 
 +  * **Java 6** 이상에서만 작동한다.
  
-**Java 6** 이상에서만 작동한다.+  TODO [[http://netframework.tistory.com/462|Programming is Fun :: Gradle 5.0에서의 querydsl Q-class 생성]]
  
 +===== QueryDSL =====
 +  * [[http://honeymon.io/tech/2020/07/09/gradle-annotation-processor-with-querydsl.html|[gradle] 그레이들 Annotation processor 와 Querydsl]]
 +  * [[java:querydsl|QueryDSL]]의 경우 [[https://github.com/ewerk/gradle-plugins/tree/master/querydsl-plugin|Graldle QueryDSL Plugin]]으로 해결 가능하다. : [[:intellij_idea|IntelliJ IDEA]] 연동에 문제 일으킴. ''annotationProcessor'' 더 권장.
 +
 +
 +<code groovy>
 +apply plugin: "com.ewerk.gradle.plugins.querydsl"
 +
 +compile "com.querydsl:querydsl-jpa:$queryDslVersion"
 +
 +
 +ext {
 +    querydslSrcDir = 'src/main/generated'
 +}
 +
 +
 +querydsl {
 +    library = "com.querydsl:querydsl-apt"
 +    jpa = true
 +    querydslSourcesDir = querydslSrcDir
 +}
 +
 +sourceSets {
 +    main {
 +        java {
 +            srcDirs += file(querydslSrcDir)
 +        }
 +    }
 +}
 +
 +idea {
 +    module {
 +        generatedSourceDirs += file(querydslSrcDir)
 +    }
 +}
 +</code>
 +
 +  * ''compileQueryDsl'' task로 코드 생성을 할 수 있다.<code sh>
 +gradlew clean cleanQuerydslSourcesDir compileQueryDsl
 +
 +# cleanQuerydslSourcesDir 를 하지 않을 경우 기존 생성된 코드 때문에 오류가 발생함.
 +</code>
 +===== Cannot find symbol 오류 =====
 +  * [[java:querydsl|QueryDSL]]과 Hibernate/Eclipse Metamodel Generator를 함께 사용할 때 아직 생성되지 않은 메타 모델 클래스를 사용하는 코드들 때문에 ''cannot find symbol'' 에러가 발생할 수 있는데, 이는 이 둘을 서로 따로 생성했을 때 발생하는 현상이다.
 +  * 정황상 [[java:lombok|Lombok]]을 함께 사용할 경우 각 AP가 실행된 뒤에 다시 lombok AP가 돌면서 발생하는 것으로 보인다.
 +  * 이 둘을 함께 지정해서 APT 를 수행해야 에러가 나지 않는다.
 +<code>
 +"-processor",
 +  "com.mysema.query.apt.jpa.JPAAnnotationProcessor,org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor"
 +</code>
 +
 +
 +===== Gradle Annotation Process 예 =====
 http://alvinalexander.com/java/jwarehouse/hibernate/build.gradle.shtml 에 있는 것을 옮겼다. http://alvinalexander.com/java/jwarehouse/hibernate/build.gradle.shtml 에 있는 것을 옮겼다.
 +
 +
 +Gradle 기반으로 정적 분석 도구 사용시에 여기서 자동 생성된 클래스는 정적 분석에서 예외처리해줘야 한다.(''/Q[A-Z].*\.class/'', ''/.*\_.class/'') [[java:static_analysis|Java Static Analysis]] 를 참조한다.
 +
 +
  
 <code groovy> <code groovy>
줄 27: 줄 85:
             srcDir jpaMetamodelGeneratedDir             srcDir jpaMetamodelGeneratedDir
         }         }
 +    }
 +}
 +
 +idea {
 +    module {
 +        sourceDirs += file(jpaMetamodelGeneratedDir)
     }     }
 } }
줄 55: 줄 119:
             "-encoding", "UTF-8",             "-encoding", "UTF-8",
             "-s", targetDir.absolutePath,             "-s", targetDir.absolutePath,
-            "-processor", "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor" // 이 줄은 안해도 된다. 안하면 모든 어노테이션 프로세서 실행 +            // processor 지정은 안해도 된다. 안하면 모든 어노테이션 프로세서 실행 
-        ]+            "-processor", "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor"         ]
     )     )
 } }
줄 62: 줄 126:
 // 필요하면 compileJava가 generateJpaMetamodel 에 의존하도록 변경한다. // 필요하면 compileJava가 generateJpaMetamodel 에 의존하도록 변경한다.
 </code> </code>
 +
 +==== Lombok 사용시 ====
 +[[java:lombok|Lombok]] 사용시 문제가 된다면 [[https://medium.com/@geminikim/%EA%B0%9C%EC%9D%B8%EC%B7%A8%ED%96%A5-jpa-%EC%82%AC%EC%9A%A9%EA%B8%B0-querydsl-gradle-lombok-76c509aec60e|개인취향 JPA 사용기 - QueryDSL + Gradle + Lombok – Gemini Kim – Medium]] 참고. [[https://github.com/ewerk/gradle-plugins/issues/59|querydsl + lombok problem · Issue #59 · ewerk/gradle-plugins]]
 +
 +<code>
 +task generateQueryDSL(type: JavaCompile, group: 'build') {
 + source = sourceSets.main.java
 + classpath = configurations.compile
 + destinationDir = queryDslOutput
 + options.compilerArgs = [
 + "-proc:only",
 +                        /********************* 핵심 포인트! *********************/
 + "-processor", 'com.querydsl.apt.jpa.JPAAnnotationProcessor,lombok.launch.AnnotationProcessorHider$AnnotationProcessor'
 + ]
 +}
 +compileJava.dependsOn(generateQueryDSL)
 +</code>
 +
  
gradle/jpa_metamodel_generation.txt · 마지막으로 수정됨: 2022/06/03 09:23 저자 kwon37xi