Bledy w wygenerowanym kodzie QueryDSL.

0

Uzywam:

  • Gradle do budowania projektu
  • Javy 9

Poniewaz chcialbym użyć narzędzia QueryDSL postanowiłem wygenerowac klasy QueryDSL za pomocą narzędzia: https://github.com/ewerk/gradle-plugins/tree/master/querydsl-plugin

Klasy generuja sie i nawet wyglada to calkiem ok. Problem w tym, ze jak buduje projekt z poziomu konsoli to wszystko dziala ok, ale z poziomu Idei dostaje cala mase bledow typu:

  1. "Package 'javax.annotation' is declared in module 'java.xml.ws.annotation' which is not in the module graph" - ten blad wystepuje w klasach oznaczonych adnotacja @Generated.

  2. "package com.querydsl.core.types does not exist"

  3. "Cannot resolve symbol 'BooleanPath'", "Cannot resolve symbol 'StringPath'" itd. Klasy BooleanPath oraz "StringPath" to oczywiscie klasy biblioteki QueryDSL, ktore nie wiadomo dlaczego nie sa widziane przez Idee. Moj plik build.gradle wyglada nastepujaco:

plugins {
    id 'war'
    id 'com.ewerk.gradle.plugins.querydsl' version '1.0.9'
    id 'idea'
}

repositories {
    jcenter()
}

querydsl {
    jpa = true
    library = 'com.querydsl:querydsl-apt:4.2.1'
}

apply plugin: 'idea'

sourceSets {
    querydsl {
        java {
            srcDirs = [
                    'src/querydsl/java'
            ]
        }
    }
}

idea{
    module {
        sourceDirs += file('src/querydsl/java')
    }
}

dependencies {
    // Spring
    compile 'org.springframework:spring-core:5.0.5.RELEASE'
    compile 'org.springframework:spring-context:5.0.5.RELEASE'
    compile 'org.springframework:spring-context-support:5.0.5.RELEASE'
    compile 'org.springframework:spring-aspects:5.0.5.RELEASE'
    compile 'org.springframework:spring-aop:5.0.5.RELEASE'
    compile 'org.springframework:spring-webmvc:5.0.5.RELEASE'
    compile 'org.springframework.data:spring-data-commons:2.0.6.RELEASE'
    compile 'org.springframework.data:spring-data-jpa:2.0.6.RELEASE'
    compile 'org.springframework.security:spring-security-web:5.0.5.RELEASE'
    compile 'org.springframework.security:spring-security-config:5.0.5.RELEASE'

    // Hibernate
    compile 'org.hibernate:hibernate-entitymanager:5.2.17.Final'
    compile 'org.hibernate.common:hibernate-commons-annotations:5.0.3.Final'
    compile 'org.hibernate.validator:hibernate-validator:6.0.9.Final'
    compile 'org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.2.Final'

    // QueryDSL
    compile 'com.querydsl:querydsl-apt:4.2.1'
    compile 'com.querydsl:querydsl-core:4.2.1'
    compile 'com.querydsl:querydsl-jpa:4.2.1'
    compile 'com.querydsl:querydsl-sql:4.2.1'
    compile 'com.querydsl:querydsl-sql-spring:4.2.1'
    compile sourceSets.querydsl.output

    // PostgreSQL
    compile 'org.postgresql:postgresql:42.2.2'

    // Joda Time
    compile group: 'joda-time', name: 'joda-time', version: '2.10'

    // Apache Commons
    compile 'org.apache.commons:commons-lang3:3.7'
    compile 'org.apache.commons:commons-text:1.4'
    compile 'commons-io:commons-io:2.6'

    // Google Guava
    compile 'com.google.guava:guava:25.0-jre'

    // Jackson
    compile 'com.fasterxml.jackson.core:jackson-databind:2.9.5'

    // Java
    compile 'javax.el:javax.el-api:3.0.0'
    compile 'javax.xml:jaxb-api:2.1'
    compile 'javax.xml:jaxb-impl:2.1'
    compile 'javax.cache:cache-api:1.1.0'
    compile 'org.glassfish:javax.el:3.0.0'
    compile 'javax.annotation:jsr250-api:1.0'
    providedCompile 'javax.servlet:javax.servlet-api:4.0.1'
    providedCompile 'javax.annotation:javax.annotation-api:1.3.2'

    // Ehcache
    compile 'org.ehcache:ehcache:3.5.2'

    // Logging
    compile 'ch.qos.logback:logback-core:1.2.3'
    compile 'ch.qos.logback:logback-classic:1.2.3'

    // Test
    testCompile 'org.springframework:spring-test:5.0.5.RELEASE'
    testCompile 'org.springframework.security:spring-security-test:5.0.5.RELEASE'
    testCompile 'org.testng:testng:6.14.3'
    testCompile 'org.mockito:mockito-all:1.10.19'
    testCompile 'org.hamcrest:hamcrest-all:1.3'
}

test {
    useTestNG()
}

//================================================================================
// PROFILES
//================================================================================
if (project.hasProperty("production")) {
    sourceSets.main.resources.srcDirs = [
            'src/main/resources/commons',
            'src/main/resources/production',
    ]

    sourceSets.test.resources.srcDirs = [
            'src/test/resources/commons',
            'src/test/resources/production',
    ]
} else {
    sourceSets.main.resources.srcDirs = [
            'src/main/resources/commons',
            'src/main/resources/development',
    ]

    sourceSets.test.resources.srcDirs = [
            'src/test/resources/commons',
            'src/test/resources/development',
    ]
}

Jakies pomysly?

0
  1. W niektórych paczkach Javy normalna adnotacja javax.annotation.Generated jest nieobecna, np w androidzie.
    Nie znam uzasadnień teoretycznych, dlaczego. Musiałem to gwałcić na Android Studio (czyli Idea)

Może automatyczny import wyszukał coś głupio.

  1. Mam intuicję, że narzędzia przetwarzające adnotacje muszą mieć kod czysty, bez błędów kompilacji itd..
0

Ja mam takie sugestie:

  1. IntelliJ się gubi na warunkowych sourceSetach.
  2. IntelliJ ma takie narowy, że wyrzuca poprawne klasy jako niepoprawne. Z czasem mu to mija, ale zdarza się też, że za Chiny nie chce zbudować poprawnego projektu.
  3. Podejrzana ta zależność providedCompile. Testowo zamieniłbym na compile.
  4. Można wyrzucić ze skryptu gradle'a query dsl, a generowanie klas dsl puszczać z palca. Może to jest sposób na wygodną pracę w IntelliJ. Przynajmniej spróbować można, czy to pomaga.
  5. W IntelliJ odświeżyć gradle.

Widzę, że w moim projekcie mam te klasy nie wiadomo skąd. Chyba generowałem mavenem, a potem mi się skrypt zgubił :) A czemu nie gradlem? Bo mi nie chciał działać. :)

0

A ja za przyczynę wskażę javę 9. Kilka dni temu chciałem napisać sobie skrypcik w groovym i mając JAVA_HOME na jdk9 miałem dziwne errory dotyczące właśnie braku pewnych pakietów, i żeby je naprawić musiałbym jakieś cuda odwalać. Podmieniłem javę na jdk8 i gra. Podobnie miałem obecnie z nowym spring bootowym projektem - mając jdk9, podczas startu serwa jakieś warningi od ReflectUtils leciały... wróciłem na jdk8 i juz ich nie było. Być może powinienem coś gdzieś skonfigurować, ale szybciej już użyć tej jdk8, chyba że faktycznie potrzebujemy featerów z javy 9.

0

Problem rozwiazany. Aktualnie moj plik build.gradle wyglada mniej wiecej tak:

plugins {
    id 'war'
}

repositories {
    jcenter()
}

project.ext.set('mainSourceDir', 'src/main/java')
project.ext.set('queryDslSourceDir', 'src/main/generated/querydsl')
project.ext.set('libsDir', 'build/libs')
project.ext.set('persistencePropertiesPath', 'src/main/resources/development/persistence.properties')

sourceSets {
    main {
        java {
            srcDirs = [
                    project.mainSourceDir,
                    project.queryDslSourceDir
            ]
        }
    }
}

task copyLibs(type: Copy) {
    into project.libsDir
    from configurations.runtime
}

task deleteQueryDSLTypes(type: Delete) {
    delete project.queryDslSourceDir
}

task generateQueryDSLTypes(dependsOn: ['deleteQueryDSLTypes', 'copyLibs']) {
    doLast {
        def sourceDir = project.queryDslSourceDir

        def libs = ant.path {
            fileset(
                    dir: project.libsDir,
                    includes: '*.jar'
            )
        }

        def persistenceProperties = new Properties()

        file(project.persistencePropertiesPath).withReader {
            persistenceProperties.load(it)
        }

        ant.taskdef(
                name: 'codegen',
                classname: 'com.querydsl.sql.codegen.ant.AntMetaDataExporter',
                classpath: libs
        )

        def task = ant.codegen(
                jdbcDriver: 'org.postgresql.Driver',
                jdbcUser: persistenceProperties.get('persistence.database.user'),
                jdbcUrl: String.format('jdbc:postgresql://%s:%s/%s',
                        persistenceProperties.get('persistence.database.server'),
                        persistenceProperties.get('persistence.database.port'),
                        persistenceProperties.get('persistence.database.name')
                ),
                packageName: '[nazwa paczki]',
                targetFolder: sourceDir,
        )

        task.setCustomTypes(
                'com.querydsl.sql.types.JSR310LocalDateTimeType'
        )

        task.execute()
    }
}

dependencies {
    // Spring
    compile 'org.springframework:spring-core:5.0.5.RELEASE'
    compile 'org.springframework:spring-context:5.0.5.RELEASE'
    compile 'org.springframework:spring-context-support:5.0.5.RELEASE'
    compile 'org.springframework:spring-aspects:5.0.5.RELEASE'
    compile 'org.springframework:spring-aop:5.0.5.RELEASE'
    compile 'org.springframework:spring-webmvc:5.0.5.RELEASE'
    compile 'org.springframework.data:spring-data-commons:2.0.6.RELEASE'
    compile 'org.springframework.data:spring-data-jpa:2.0.6.RELEASE'
    compile 'org.springframework.security:spring-security-web:5.0.5.RELEASE'
    compile 'org.springframework.security:spring-security-config:5.0.5.RELEASE'

    // Hibernate
    compile 'org.hibernate:hibernate-entitymanager:5.2.17.Final'
    compile 'org.hibernate.common:hibernate-commons-annotations:5.0.3.Final'
    compile 'org.hibernate.validator:hibernate-validator:6.0.9.Final'
    compile 'org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.2.Final'

    // QueryDSL
    compile 'com.querydsl:querydsl-core:4.2.1'
    compile 'com.querydsl:querydsl-sql:4.2.1'
    compile 'com.querydsl:querydsl-sql-spring:4.2.1'
    compile 'com.querydsl:querydsl-sql-codegen:4.2.1'

    // PostgreSQL
    compile 'org.postgresql:postgresql:42.2.2'

    // Joda Time
    compile 'joda-time:joda-time:2.10'

    // Apache Commons
    compile 'org.apache.commons:commons-lang3:3.7'
    compile 'org.apache.commons:commons-text:1.4'
    compile 'commons-io:commons-io:2.6'

    // Google Guava
    compile 'com.google.guava:guava:25.0-jre'

    // Jackson
    compile 'com.fasterxml.jackson.core:jackson-databind:2.9.5'

    // Java
    compile 'javax.el:javax.el-api:3.0.0'
    compile 'javax.xml:jaxb-api:2.1'
    compile 'javax.xml:jaxb-impl:2.1'
    compile 'javax.cache:cache-api:1.1.0'
    compile 'org.glassfish:javax.el:3.0.0'
    providedCompile 'javax.servlet:javax.servlet-api:4.0.1'
    providedCompile 'javax.annotation:javax.annotation-api:1.3.2'

    // Ehcache
    compile 'org.ehcache:ehcache:3.5.2'

    // Logging
    compile 'ch.qos.logback:logback-core:1.2.3'
    compile 'ch.qos.logback:logback-classic:1.2.3'

    // Test
    testCompile 'org.springframework:spring-test:5.0.5.RELEASE'
    testCompile 'org.springframework.security:spring-security-test:5.0.5.RELEASE'
    testCompile 'org.testng:testng:6.14.3'
    testCompile 'org.mockito:mockito-all:1.10.19'
    testCompile 'org.hamcrest:hamcrest-all:1.3'
}

test {
    useTestNG();
}

//================================================================================
// PROFILES
//================================================================================
if (project.hasProperty("production")) {
    processResources {
        dependsOn 'buildFrontendApplication'
    }

    sourceSets.main.resources.srcDirs = [
            'src/main/resources/commons',
            'src/main/resources/production',
    ]

    sourceSets.test.resources.srcDirs = [
            'src/test/resources/commons',
            'src/test/resources/production',
    ]
} else {
    processResources {
        dependsOn 'deleteFrontendApplication'
    }

    sourceSets.main.resources.srcDirs = [
            'src/main/resources/commons',
            'src/main/resources/development',
    ]

    sourceSets.test.resources.srcDirs = [
            'src/test/resources/commons',
            'src/test/resources/development',
    ]
}

Modyfikacja pliku build.gradle rozwiazala problemy opisane w punktach od 2 do 3 (chodzilo glownie o zmiane frazy "querydsl" na "main" w bloku sourceSets). Problem numer 1 udalo sie rozwiazac poprzez upgrade Idei.

Pinek napisał(a):

A ja za przyczynę wskażę javę 9

Aktualnie korzystam z Javy 10, ktora pod tym wzgledem jest raczej podobna do 9 - wspominam o tym poniewaz wydaje mi sie, ze przespales jedna wersje i zapewne zalozyles, ze najnowsza to 9 :)

Pinek napisał(a):

Kilka dni temu chciałem napisać sobie skrypcik w groovym i mając JAVA_HOME na jdk9 miałem dziwne errory dotyczące właśnie braku pewnych pakietów, i żeby je naprawić musiałbym jakieś cuda odwalać.

Bledy byly zglaszane przez Idee czy w trakcie budowy projektu z konsoli za pomoca Maven-a / Gradle-a?

Pinek napisał(a):

Podmieniłem javę na jdk8 i gra.

Mozna w ten sposob rozwiazac problem, ale mnie sie wydaje, ze lepiej jest sie jednak troche pomeczyc. Nie ma sensu uzywac Javy 8 skoro jest juz 10. Mozesz co prawda nie potrzebowac funkcjonalnosci Javy 9 czy 10 ale pewnie predzej czy pozniej przejdziesz na nowsza wersje i wtedy mozesz natrafic na te same problemy.

Pinek napisał(a):

Podobnie miałem obecnie z nowym spring bootowym projektem - mając jdk9, podczas startu serwa jakieś warningi od ReflectUtils leciały... wróciłem na jdk8 i juz ich nie było.

Tez to zauwazylem w swoim projekcie. Na chwile obecna postanowilem to olac - moze wroce do tematu kiedy indziej.

0

@tk: Nie przespałem nic, doskonale zdaję sobie sprawę że najnowsza to java 10 ;) a jdk9 już po prostu miałem zainstalowane, dlatego opisałem moje przygody z nim. Błędy leciały z poziomu konsoli, bez IDE. Oczywiście że kiedyś będzie trzeba się przesiąść, ale wtedy miałem potrzebę skryptu 7-9 linijkowego więc wolałem wybrać drogę na skróty xd

by the way, można sobie samemu akceptować posta? o.O

0
Pinek napisał(a):

Oczywiście że kiedyś będzie trzeba się przesiąść, ale wtedy miałem potrzebę skryptu 7-9 linijkowego więc wolałem wybrać drogę na skróty xd

W takim przypadku to rzeczywiscie nie ma sensu kombinowac :)

Pinek napisał(a):

by the way, można sobie samemu akceptować posta? o.O

Jak najbardziej mozna i w sumie nie ma w tym nic dziwnego. Czasami po prostu autor posta rozwiaze swoj wlasny problem i wtedy wskazane jest zasygnalizowanie tego faktu wlasnie poprzez jego akceptacji. Nie mozna natomiast oddac glosu na swoj wlasny post bo od glosow chyba zalezy pozycja w rankingu :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1