인프런 커뮤니티 질문&답변

Half Lemon님의 프로필 이미지

작성한 질문수

실전! Querydsl

안녕하세요. noClassDefFoundError Q 파일을 찾지 못하는 문제 문의 드립니다.

해결된 질문

작성

·

3.3K

1

안녕하세요. 주말 잘 쉬고 계신지요. 다름이 아니라 갑자기 문제가 발생되어 문의드립니다.

queryDsl을 통해 generated 된  java 파일 생성하고  정상빌드가 되었지만

Runtime시 Q파일을 찾지못하여,  noClassDefFoundError가 발생됩니다.

증상

- complie시 문제 없음, Runtime시 문제발생

- jar/war 생성후 실행시 문제 없음 

- IDE(visual studio code) Debug에서  발생 

- 1일주일 전에는 발생되지 않았음 (업데이트와 관련있어 보입니다.)

- 일주일 사이에는 배포( docker ) 작업만 진행

시도방법 ( 해결되지 않음 )

- build.gradle 내 querydslDir 위치 변경 

- classpath 에 querydslDir 추가  

- modulepath 에 querydslDir 추가  

- sourcepath 에 에 querydslDir 추가  

build.gradle

plugins {
  id 'org.springframework.boot' version '2.2.4.RELEASE'
  id 'io.spring.dependency-management' version '1.0.9.RELEASE'
  // querydsl 추가 
  id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
  id 'java'
}

group = 'dev.moonho'
version = '0.0.2'
sourceCompatibility = '1.8'

configurations {
  developmentOnly
  runtimeClasspath {
    extendsFrom developmentOnly
  }
  compileOnly {
    extendsFrom annotationProcessor
  }
  // querydsl 추가 
  querydsl.extendsFrom compileClasspath
}

repositories {
  mavenCentral()
}

dependencies {
  implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
  implementation 'org.springframework.boot:spring-boot-starter-web'
  implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.6.1'
  compileOnly 'org.projectlombok:lombok'
  developmentOnly 'org.springframework.boot:spring-boot-devtools'
  compile group: 'org.hibernate', name: 'hibernate-core', version: '5.4.14.Final'
  
  runtimeOnly 'com.h2database:h2'
  compile group: 'org.mariadb.jdbc', name: 'mariadb-java-client', version: '2.6.0'

  annotationProcessor 'org.projectlombok:lombok'
  testImplementation('org.springframework.boot:spring-boot-starter-test') {
    exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
  }
  
  compile group: 'org.springframework.boot', name: 'spring-boot-starter-cache', version: '2.2.6.RELEASE'

  // querydsl 추가 
  implementation 'com.querydsl:querydsl-jpa' 
}

test {
  useJUnitPlatform()
}

//querydsl 추가 시작
def querydslDir = "$buildDir/generated/querydsl"
querydsl {
 jpa = true
 querydslSourcesDir = querydslDir
}
sourceSets {
 main.java.srcDir querydslDir
}
compileQuerydsl {
 options.annotationProcessorPath = configurations.querydsl
}
//querydsl 추가 끝

Querydsl을 사용하시면서 그간 경험상 해당 문제를 접해보신 적이 있거나,  의심되는 부분이 있으신지요?

감사합니다.

답변 8

5

Half Lemon님의 프로필 이미지
Half Lemon
질문자

어쩌다보니 자답입니다 .... 

질문글을 지울까 하다가 다른분들에게 혹시 도움일 될까 싶어 글 남깁니다. 

Visual studio code Spring framework tools 중

Debugger for java 버전이 3일 전에 업데이트 되면서 발생된 문제 

0.26 -> 0.25.1  다운그레이드로 해결 

1

안녕하세요.

시간이 많이 지났는데, 저도 Q파일이 생성은 되지만, 참조가 안되는 현상이 있었고,

방법을 찾아서 여기에 남깁니다.

 

현재 플러그인 버전은 아래와 같구요,

Debugger for Java v0.36.0

Test Runner for Java v0.32.0

 

Q파일 생성 이후에 build.gradle 파일을 한번 저장하면
classpath 파일과 동기화할꺼냐고 물어보는 메시지가 나오는데 Now를 눌러 파일 업데이트를 해 주면 참조가 정상적으로 이루어집니다.

 

예전 글에는 .classpath 파일의 classpathentry 를 직접 수정하는 것이 나오는데, 그 방법을 적용하지 않아도 테스트가 성공하였네요.

 

참고가 되었으면 좋겠습니다.

 

 

 

구글링 하던 중 도움 받았습니다. 감사합니다!!

1

Half Lemon님의 프로필 이미지
Half Lemon
질문자

확인을 좀 더 해보니 현재 개발중인 코드에서는 문제가 없었는데,

이전 소스를 git에서 받아서 테스트 해보니  Qclass 참조가 안되네요 

그래서 좀 찾아봤는데 최근에 Java Test Runner,  Debugger for java 가 업데이트 되었습니다. 

다시 downgrade 시켜서 실행해 보니 잘 동작하더군요.

버전을 아래와 같이 수정하시고 

0.22.4

0.25.1

- 터미널

.\gradlew clean 

.\gradlew class 

- Vscode

Ctrl + Shift + p > clear the java language server workspace  

수고하세요 

1

Half Lemon님의 프로필 이미지
Half Lemon
질문자

안녕하세요  

vscode에서 현재 정상 동작됩니다 . 

우선 vscode에서 spring을 사용하기위한  Extenstions 버전을 확인해 보시면 좋을 것 같습니다.

아래와 같은 버전인지 확인해 주시고 Debugger for java는 아래 버전(0.25.1)으로 맞춰주세요 

그리고 build.gradle 파일을  //querydsl  주석 위주로 본인 코드와 비교해 보시면 될 것 같습니다.

1

김영한님의 프로필 이미지
김영한
지식공유자

Visual studio code가 자바 진영까지 슬슬 점령하다니 어마어마 하네요^^!

도움되는 정보 남겨주셔서 고맙습니다

0

Half Lemon님의 프로필 이미지
Half Lemon
질문자

저역시 명확한 답을 얻지 못하였습니다. 

현재는 다운그래이드해서 사용중이지만 본질적인 문제해결이 아니라서 답답한 면이 있습니다.

정확한 이유를 알게되면 답변 달도록 하겠습니다. 

수고하세요 

 

0

Half Lemon님 덕분에 오류를 해결하고 갑니다

근데 버젼을 낮춘것과 Q클래스 참조하는것과의 관계를 아시나요?

검색하는데 잘 안나오네요

0

질문자님께 문의드립니다.ㅠ

Vscode tool에서 qclass파일은 생성되지만 코드에서 사용시 참조는 되지않는데요..혹시 되시는건가요? ㅠㅠ 가능하시면 답변 부탁드려요..