title: Upgrade Spring Boot app (using javax.persistence) to JDK 11
body: <p>I'm in the process of converting a JDK 8 app over to JDK 11.  It builds using Gradle and uses JPA/Hibernate under the hood.  I've upgraded the necessary Gradle modules, Spring Boot is now 2.1 and it's using the Gradle 5.1 wrapper.  It uses QueryDSL JPA annotation processing to build the Q* classes off of a PostgreSQL database.  </p>
  
  <p>The following task in the build script generates the aformentioned classes:</p>
  
  <pre><code>compileJava {
      doFirst {
          generatedSourcesDir.mkdirs();
      }
      options.compilerArgs += [
              '-s', generatedSourcesDir,
      ]
  
  //    dependsOn generateQueryDSL
  }
  </code></pre>
  
  <p>And the commented-out QueryDSL generation task is:</p>
  
  <pre><code>task generateQueryDSL(type: JavaCompile, group: 'build', description: 'Generates the QueryDSL query types') {
      source = sourceSets.main.java
      classpath = configurations.compile + configurations.querydslapt
      options.compilerArgs = [
              "-proc:only",
              "-processor", "com.querydsl.apt.jpa.JPAAnnotationProcessor"
      ]
      destinationDir = generatedSourcesDir
  }
  </code></pre>
  
  <p>The main error I'm receiving when running the Gradle compileJava task is the following:</p>
  
  <pre><code>* What went wrong:
  Execution failed for task ':app-base:compileJava'.
  &gt; java.lang.NoClassDefFoundError: javax/persistence/Entity
  </code></pre>
  
  <p>I'm using the following build dependency:</p>
  
  <pre><code>compile group: 'org.eclipse.persistence', name: 'javax.persistence', version: '2.2.1'
  </code></pre>
  
  <p>Which hasn't been updated since last summer.  Is there any way I can make the JavaCompile Gradle task work with JDK 11 and JPA 2.2?</p>
  
  <p><strong>UPDATE 2/1/2019</strong> - build.gradle for the API project as requested by a user (works with JDK 11 and Spring Boot 2.1 and Gradle 4.8, it needs significant cleanup though for Gradle 5)</p>
  
  <pre><code>buildscript {
      repositories {
          jcenter()
          mavenLocal()
          mavenCentral()
          maven { url "http://repo.spring.io/libs-release" }
      }
      dependencies {
          classpath("org.springframework.boot:spring-boot-gradle-plugin:2.1.2.RELEASE")
      }
  }
  
  apply plugin: 'java'
  apply plugin: 'eclipse'
  apply plugin: 'idea'
  apply plugin: 'org.springframework.boot'
  apply plugin: 'io.spring.dependency-management'
  apply plugin: "jacoco"
  
  jar {
      enabled = true
  }
  
  repositories {
      mavenLocal()
      mavenCentral()
      maven { url "http://repo.spring.io/libs-release" }
  }
  
  ext {
      generatedSourcesDir = file("${buildDir}/generated-sources")
      pojogenGeneratedDir = file("src/pojogen")
  }
  
  sourceSets {
      main {
          java {
              srcDir "src/main/java"
              srcDir pojogenGeneratedDir
              srcDir generatedSourcesDir
          }
      }
  }
  
  configurations {
      provided
      compile.extendsFrom provided
  }
  
  compileJava {
      doFirst {
          generatedSourcesDir.mkdirs();
      }
      options.compilerArgs += [
              '-s', generatedSourcesDir,
      ]
  }
  
  jar {
      enabled = true
  }
  
  sourceCompatibility = JavaVersion.VERSION_11
  targetCompatibility = JavaVersion.VERSION_11
  
  dependencies {
  
      /*
          SPRING
       */
  
      testCompile("org.springframework.boot:spring-boot-starter-test:2.1.2.RELEASE")
  
      // tag::tomcat[]
      compile("org.springframework.boot:spring-boot-starter-web:2.1.2.RELEASE") {
          exclude module: "spring-boot-starter-jetty:2.1.2.RELEASE"
      }
      compile("org.springframework.boot:spring-boot-starter-tomcat:2.1.2.RELEASE")
      // end::tomcat[]
      // tag::actuator[]
      compile("org.springframework.boot:spring-boot-starter-actuator:2.1.2.RELEASE")
      compile("org.springframework.boot:spring-boot-starter-security:2.1.2.RELEASE")
      compile("org.springframework.boot:spring-boot-starter-data-jpa:2.1.2.RELEASE")
      compile("org.springframework.boot:spring-boot-starter-batch:2.1.2.RELEASE")
      compile("org.springframework.boot:spring-boot-devtools:2.1.2.RELEASE")
      // end::actuator[]
  
      /*
          APACHE COMMONS
       */
  
      // https://mvnrepository.com/artifact/org.apache.commons/commons-lang3
      compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.8.1'
  
      // https://mvnrepository.com/artifact/commons-io/commons-io
      compile group: 'commons-io', name: 'commons-io', version: '2.6'
  
      /*
          GOOGLE GUAVA
       */
  
      // https://mvnrepository.com/artifact/com.google.guava/guava
      compile group: 'com.google.guava', name: 'guava', version: '27.0.1-jre'
  
      /*
          LOGBACK
       */
  
      // https://mvnrepository.com/artifact/ch.qos.logback/logback-classic
      testCompile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'
  
      /*
          MOCKITO
       */
  
      // https://mvnrepository.com/artifact/org.mockito/mockito-core
      testCompile group: 'org.mockito', name: 'mockito-core', version: '2.23.4'
  
      /*
          JWT
       */
  
      // https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt
      compile group: 'io.jsonwebtoken', name: 'jjwt', version: '0.9.1'
  
      /*
          MAIL
       */
  
      // https://mvnrepository.com/artifact/com.sun.mail/javax.mail
      compile group: 'com.sun.mail', name: 'javax.mail', version: '1.6.2'
  
      // https://mvnrepository.com/artifact/javax.mail/javax.mail-api
      compile group: 'javax.mail', name: 'javax.mail-api', version: '1.6.2'
  
      /*
          SWAGGER
       */
  
      // https://mvnrepository.com/artifact/io.springfox/springfox-swagger2
      compile group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2'
  
      // https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui
      compile group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.9.2'
  
      /*
          PASSWORD VALIDATOR
      */
  
      // https://mvnrepository.com/artifact/org.passay/passay
      compile group: 'org.passay', name: 'passay', version: '1.3.1'
  
      /*
          LOMBOK
       */
  
      // https://mvnrepository.com/artifact/org.projectlombok/lombok
      provided group: 'org.projectlombok', name: 'lombok', version: '1.18.4'
  
      /*
          Thymeleaf
       */
  
  //    // https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf
  //    compile group: 'org.thymeleaf', name: 'thymeleaf', version: '3.0.9.RELEASE'
  //
  //    // https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf-spring4
  //    compile group: 'org.thymeleaf', name: 'thymeleaf-spring4', version: '3.0.9.RELEASE'
  
      /*
          H2 (unit testing)
       */
  
      // https://mvnrepository.com/artifact/com.h2database/h2
      testCompile group: 'com.h2database', name: 'h2', version: '1.4.197'
  
      /*
          Thumbnail tools
       */
  
      // https://mvnrepository.com/artifact/net.coobird/thumbnailator
      compile group: 'net.coobird', name: 'thumbnailator', version: '0.4.8'
  
      /*
          JUNIT
       */
  
      testCompile("junit:junit")
  }
  
  /*
      BUILD EXCLUSIONS
   */
  
  test {
      systemProperties 'property': 'value'
      testLogging {
          events "passed", "skipped", "failed", "standardOut", "standardError"
      }
  }
  
  /*
      JaCoCo
   */
  jacoco {
      toolVersion = "0.7.6.201602180812"
      reportsDir = file("$buildDir/customJacocoReportDir")
  }
  
  jacocoTestReport {
      reports {
          xml.enabled false
          csv.enabled false
          html.destination "${buildDir}/jacocoHtml"
      }
  }
  </code></pre>