JOOQ non genera classi (JPADatabase)
Ho un problema con il framework JOOQ (3.13.5) insieme a Spring Boot e Java 8. Sto cercando di generare classi di dominio seguendo le istruzioni dal manuale fornito sulla pagina dell'autore ( link ) usando GenerationTool da JOOQ, che è menzionato qui . Di seguito viene presentata la struttura del progetto:
Il pacchetto del dominio contiene entità JPA. Quindi ho aggiunto la configurazione di esecuzione, dove come classe principale ho contrassegnato GenerationTool dalla libreria di JOOQ con l'argomento: /jooq-config.xml (come menzionato nel manuale dell'autore collegato sopra). Il contenuto del file di configurazione è mostrato di seguito:
<configuration xmlns="http://www.jooq.org/xsd/jooq-codegen-3.13.0.xsd">
<generator>
<database>
<name>org.jooq.meta.extensions.jpa.JPADatabase</name>
<properties>
<property>
<key>packages</key>
<value>com.ormtester.jpa.domain</value>
</property>
<property>
<key>useAttributeConverters</key>
<value>true</value>
</property>
<property>
<key>unqualifiedSchema</key>
<value>none</value>
</property>
<property>
<key>hibernate.physical_naming_strategy</key>
<value>org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy</value>
</property>
</properties>
</database>
</generator>
Per i problemi di analisi aggiungo anche il frammento di pom.xml con le versioni di lib:
<dependencies>
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq-meta-extensions</artifactId>
<version>3.13.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq-codegen</artifactId>
<version>3.13.5</version>
</dependency>
</dependencies>
E ora quando provo a costruire il progetto, ricevo il seguente errore:
18:49:37.330 [main] WARN org.jooq.util.jaxb.tools.MiniJAXB - org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 72; cvc-elt.1: Cannot find the declaration of element 'configuration'.
18:49:42.215 [main] INFO org.jooq.codegen.GenerationTool - Initialising properties : /jooq-config.xml
18:49:43.134 [main] DEBUG org.jooq.codegen.GenerationTool - Input configuration : <onError>FAIL</onError><generator><name>org.jooq.codegen.DefaultGenerator</name><database><name>org.jooq.meta.extensions.jpa.JPADatabase</name><regexMatchesPartialQualification>true</regexMatchesPartialQualification><sqlMatchesPartialQualification>true</sqlMatchesPartialQualification><includes>.*</includes><excludes></excludes><includeExcludeColumns>false</includeExcludeColumns><includeTables>true</includeTables><includeEmbeddables>true</includeEmbeddables><includeRoutines>true</includeRoutines><includeTriggerRoutines>false</includeTriggerRoutines><includePackages>true</includePackages><includePackageRoutines>true</includePackageRoutines><includePackageUDTs>true</includePackageUDTs><includePackageConstants>true</includePackageConstants><includeUDTs>true</includeUDTs><includeSequences>true</includeSequences><includeIndexes>true</includeIndexes><includePrimaryKeys>true</includePrimaryKeys><includeUniqueKeys>true</includeUniqueKeys><includeForeignKeys>true</includeForeignKeys><includeCheckConstraints>true</includeCheckConstraints><includeInvisibleColumns>true</includeInvisibleColumns><recordVersionFields></recordVersionFields><recordTimestampFields></recordTimestampFields><syntheticIdentities></syntheticIdentities><syntheticPrimaryKeys></syntheticPrimaryKeys><overridePrimaryKeys></overridePrimaryKeys><dateAsTimestamp>false</dateAsTimestamp><ignoreProcedureReturnValues>false</ignoreProcedureReturnValues><unsignedTypes>true</unsignedTypes><integerDisplayWidths>true</integerDisplayWidths><inputCatalog></inputCatalog><outputCatalogToDefault>false</outputCatalogToDefault><inputSchema></inputSchema><outputSchemaToDefault>false</outputSchemaToDefault><schemaVersionProvider></schemaVersionProvider><catalogVersionProvider></catalogVersionProvider><orderProvider></orderProvider><forceIntegerTypesOnZeroScaleDecimals>true</forceIntegerTypesOnZeroScaleDecimals><logSlowQueriesAfterSeconds>5</logSlowQueriesAfterSeconds><logSlowResultsAfterSeconds>5</logSlowResultsAfterSeconds><properties><property><key>packages</key><value>com.ormtester.jpa.domain</value></property><property><key>useAttributeConverters</key><value>true</value></property><property><key>unqualifiedSchema</key><value>none</value></property><property><key>hibernate.physical_naming_strategy</key><value>org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy</value></property></properties></database></generator>
Exception in thread "main" java.lang.NoSuchMethodError: org.jooq.meta.jaxb.Configuration.getBasedir()Ljava/lang/String;
at org.jooq.codegen.GenerationTool.run0(GenerationTool.java:272)
at org.jooq.codegen.GenerationTool.run(GenerationTool.java:225)
at org.jooq.codegen.GenerationTool.generate(GenerationTool.java:220)
at org.jooq.codegen.GenerationTool.main(GenerationTool.java:192)
Tuttavia, quando rimuoverò il file jooq-config.xml , l'errore mi dice chiaramente che il file di configurazione non può essere trovato.
Ho provato a eseguire il debug dei metodi GenerationTool ma non riesco a trovare il posto problematico. Non sono in grado di designare l'origine del problema, quindi ti sarò grato per ogni aiuto da parte tua. Grazie in anticipo!
Risposte
Spring boot include una serie di versioni di libreria jOOQ predefinite, che puoi verificare utilizzando le istruzioni che hai ottenuto nei commenti (principalmente mvn dependency:tree). L'errore che stai ricevendo suggerisce che ci sono versioni incompatibili sul tuo classpath.
Se la tua versione è diversa da quella inserita da Spring Boot, potresti dover dire a Spring Boot di non inserire alcuna versione di jOOQ e di inserirle tutte da solo, ad esempio usando questo approccio documentato in questo post del blog qui
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jooq</artifactId>
<exclusions>
<exclusion>
<groupId>org.jooq</groupId>
<artifactId>jooq</artifactId>
</exclusion>
</exclusions>
</dependency>
Ok, seguendo i suggerimenti dati da @Lukas e @Lesiak in questo argomento ho trovato la soluzione. Come puoi vedere nel contenuto iniziale di pom ho aggiunto le versioni jooq-codegene jooq-meta-extensionsmantenendo le versioni 3.13.5ed ero sicuro che "dietro le quinte" quelle dipendenze contenessero le stesse versioni di jooqe jooq-metalibs ma sfortunatamente c'erano 3.12.3in entrambi i casi. Quindi prima ho controllato i suggerimenti forniti da @Lukas e poi ho dovuto escludere quelle librerie dalle dipendenze e aggiungerle come dipendenze separate usando i numeri di versione corretti.
Sto anche parlando di jooq(dove il problema iniziale era solo con jooq-meta) perché dopo che il problema con la Configurationclasse è stato risolto, ho affrontato un problema simile con `org.jooq.SQLDialect, come segue:
java.lang.NoSuchMethodError: org.jooq.SQLDialect.supportedBy ([Lorg / jooq / SQLDialect;) Ljava / util / Set; su org.jooq.meta.AbstractDatabase. (AbstractDatabase.java:117) su java.lang.Class.forName0 (metodo nativo) su java.lang.Class.forName (Class.java:264) su org.jooq.codegen. GenerationTool.loadClass0 (GenerationTool.java:983) su org.jooq.codegen.GenerationTool.loadClass (GenerationTool.java:930) su org.jooq.codegen.GenerationTool.run0 (GenerationTool.java:395) su org.jooq.codegen .GenerationTool.run (GenerationTool.java:225) su org.jooq.codegen.GenerationTool.generate (GenerationTool.java:220) su org.jooq.codegen.GenerationTool.main (GenerationTool.java:192)
E come ho detto è arrivato anche con la mancata corrispondenza della versione, in questo caso con jooq.
Dopo tutti questi cambiamenti il contenuto del mio pom è:
<dependencies>
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq</artifactId>
<version>3.13.5</version>
</dependency>
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq-meta-extensions</artifactId>
<version>3.13.5</version>
<exclusions>
<exclusion>
<groupId>org.jooq</groupId>
<artifactId>jooq</artifactId>
</exclusion>
<exclusion>
<groupId>org.jooq</groupId>
<artifactId>jooq-meta</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq-meta</artifactId>
<version>3.13.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.jooq</groupId>
<artifactId>jooq-codegen</artifactId>
<version>3.13.5</version>
<exclusions>
<exclusion>
<groupId>org.jooq</groupId>
<artifactId>jooq</artifactId>
</exclusion>
<exclusion>
<groupId>org.jooq</groupId>
<artifactId>jooq-meta</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.jibx</groupId>
<artifactId>jibx-tools</artifactId>
<version>1.3.1</version>
</dependency>
</dependencies>
E qui posso darti un piccolo suggerimento: se hai una tabella denominata con forma pluralizzata e vuoi depluralizzarle rapidamente per mantenere singolari i nomi delle classi generate, devi aggiungere l'ultima dipendenza dallo snippet del pom, creare la tua classe che estende DefaultGeneratorStrategye sovrascrive il getJavaClassName()corpo del metodo con il seguente frammento:
String javaClassName = super.getJavaClassName(definition, mode);
boolean hasRecordSuffix = javaClassName.contains("Record");
javaClassName = javaClassName.replace("Record", "");
String val = nameTools.depluralize(javaClassName);
if (hasRecordSuffix)
val += "Record";
return val;
Quindi aggiungi semplicemente la tua strategia di denominazione personalizzata alla configurazione xml. Funziona come un fascino, realizzato utilizzando questo progetto: link
Sono davvero grato a te, @Lukas e @Lesiak, grazie per questo aiuto!