Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Debugging "Incorrect configuration of jOOQ code generation tool"

I am trying to follow along with the jOOQ tutorial. I am at Step 3 (code generation) but want to do the code generation step using Maven.

Here is the contents of my pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>net.hiew</groupId>
    <artifactId>jooq-tutorial</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.jooq</groupId>
            <artifactId>jooq</artifactId>
            <version>3.11.2</version>
        </dependency>
        <dependency>
            <groupId>org.jooq</groupId>
            <artifactId>jooq-meta</artifactId>
            <version>3.11.2</version>
        </dependency>
        <dependency>
            <groupId>org.jooq</groupId>
            <artifactId>jooq-codegen</artifactId>
            <version>3.11.2</version>
        </dependency>
        <dependency>
            <groupId>org.mariadb.jdbc</groupId>
            <artifactId>mariadb-java-client</artifactId>
            <version>1.1.7</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <!-- Specify the maven code generator plugin -->
                <!-- Use org.jooq            for the Open Source Edition
                         org.jooq.pro        for commercial editions,
                         org.jooq.pro-java-6 for commercial editions with Java 6 support,
                         org.jooq.trial      for the free trial edition

                     Note: Only the Open Source Edition is hosted on Maven Central.
                           Import the others manually from your distribution -->
                <groupId>org.jooq</groupId>
                <artifactId>jooq-codegen-maven</artifactId>
                <version>3.11.2</version>

                <executions>
                    <execution>
                        <id>jooq-codegen</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <!-- Configure the database connection here -->
                            <jdbc>
                                <driver>org.mariadb.jdbc.Driver</driver>
                                <url>jdbc:mariadb://localhost:3306/library</url>
                                <user>root</user>
                                <password>mysql</password>
                            </jdbc>

                            <generator>
                                <!-- The default code generator. You can override this one, to generate your own code style.
                                     Supported generators:
                                     - org.jooq.codegen.JavaGenerator
                                     - org.jooq.codegen.ScalaGenerator
                                     Defaults to org.jooq.codegen.JavaGenerator -->
                                <name>org.jooq.codegen.JavaGenerator</name>

                                <database>
                                    <!-- The database type. The format here is:
                                         org.util.[database].[database]Database -->
                                    <name>org.jooq.meta.mariadb.MariaDBDatabase</name>

                                    <!-- The database schema (or in the absence of schema support, in your RDBMS this
                                         can be the owner, user, database name) to be generated -->
                                    <inputSchema>library</inputSchema>

                                    <!-- All elements that are generated from your schema
                                         (A Java regular expression. Use the pipe to separate several expressions)
                                         Watch out for case-sensitivity. Depending on your database, this might be important! -->
                                    <includes>.*</includes>

                                    <!-- All elements that are excluded from your schema
                                         (A Java regular expression. Use the pipe to separate several expressions).
                                         Excludes match before includes, i.e. excludes have a higher priority -->
                                    <excludes></excludes>
                                </database>

                                <target>
                                    <!-- The destination package of your generated classes (within the destination directory) -->
                                    <packageName>net.hiew.jooqtutorial.generated</packageName>

                                    <!-- The destination directory of your generated classes. Using Maven directory layout here -->
                                    <directory>/home/james/src/local/jooqtutorial/src/main/java/</directory>
                                </target>
                            </generator>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

My project directory:

project directory

The error I get when running mvn -e jooq-codegen:generate:

[INFO] --- jooq-codegen-maven:3.11.2:generate (default-cli) @ jooq-tutorial ---                                                                                                                              
[ERROR] Incorrect configuration of jOOQ code generation tool                                                                                                                                                 
[ERROR]                                                                                                                                                                                                      
The jOOQ-codegen-maven module's generator configuration is not set up correctly.                                                                                                                             
This can have a variety of reasons, among which:                                                                                                                                                             
- Your pom.xml's <configuration> contains invalid XML according to jooq-codegen-3.11.0.xsd                                                                                                                   
- There is a version or artifact mismatch between your pom.xml and your commandline

The error message is not that helpful, so I am not sure of the best way to debug the problem further. The pom.xml validates and the database exists and is accessible as described in the <configuration> element.

like image 321
James Hiew Avatar asked Jul 07 '18 19:07

James Hiew


2 Answers

The configuration tag has to be directly under the plugin tag, not inside execution:

<plugin>
  ...
  <executions>
     ...
  </executions>

  <configuration>
     ...
  </configuration>
  ...
</plugin>

Full plugin tag:

<plugin>
  <!-- Specify the maven code generator plugin -->
  <!-- Use org.jooq            for the Open Source Edition             org.jooq.pro        for commercial editions,             org.jooq.pro-java-6 for commercial editions with Java 6 support,             org.jooq.trial      for the free trial edition         Note: Only the Open Source Edition is hosted on Maven Central.               Import the others manually from your distribution -->
  <groupId>org.jooq</groupId>
  <artifactId>jooq-codegen-maven</artifactId>
  <version>3.11.2</version>

  <executions>
    <execution>
      <id>jooq-codegen</id>
      <phase>generate-sources</phase>
      <goals>
        <goal>generate</goal>
      </goals>
    </execution>
  </executions>

  <dependencies>
    <dependency>
      <groupId>org.mariadb.jdbc</groupId>
      <artifactId>mariadb-java-client</artifactId>
      <version>${mariadb.version}</version>
    </dependency>
  </dependencies>

  <configuration>
    <!-- Configure the database connection here -->
    <jdbc>
      <driver>org.mariadb.jdbc.Driver</driver>
      <url>jdbc:mariadb://localhost:3306/library</url>
      <user>root</user>
      <password>mysql</password>
    </jdbc>

    <generator>
      <!-- The default code generator. You can override this one, to generate your own code style.                     Supported generators:                     - org.jooq.codegen.JavaGenerator                     - org.jooq.codegen.ScalaGenerator                     Defaults to org.jooq.codegen.JavaGenerator -->
      <name>org.jooq.codegen.JavaGenerator</name>
      <database>
        <!-- The database type. The format here is:                         org.util.[database].[database]Database -->
        <name>org.jooq.meta.mariadb.MariaDBDatabase</name>
        <!-- The database schema (or in the absence of schema support, in your RDBMS this                         can be the owner, user, database name) to be generated -->
        <inputSchema>library</inputSchema>
        <!-- All elements that are generated from your schema                         (A Java regular expression. Use the pipe to separate several expressions)                         Watch out for case-sensitivity. Depending on your database, this might be important! -->
        <includes>.*</includes>
        <!-- All elements that are excluded from your schema                         (A Java regular expression. Use the pipe to separate several expressions).                         Excludes match before includes, i.e. excludes have a higher priority -->
        <excludes>
        </excludes>
      </database>
      <target>
        <!-- The destination package of your generated classes (within the destination directory) -->
        <packageName>net.hiew.jooqtutorial.generated</packageName>
        <!-- The destination directory of your generated classes. Using Maven directory layout here -->
        <directory>/home/james/src/local/jooqtutorial/src/main/java/</directory>
      </target>
    </generator>

  </configuration>

</plugin>

Note tha you may need to specify your mariadb version in the dependency, I added the defalut variable name.

like image 78
wallek876 Avatar answered Oct 22 '22 23:10

wallek876


Alternatively to wallek876's answer, you could rename your executionId to default-cli as documented here. So, this should work:

<executions>
    <execution>
        <id>default-cli</id>
        <phase>generate-sources</phase>
        <goals>
            <goal>generate</goal>
        </goals>
        <configuration>
            <!-- Configure the database connection here -->
            <jdbc>
            ...

Another option, which I always prefer, is to use profiles:

<profiles>
    <profile>
        <id>jooq-codegen</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.jooq</groupId>
                    <artifactId>jooq-codegen-maven</artifactId>
                    <version>3.11.2</version>
                    ...

And then, run that with

mvn install -P jooq-codegen
like image 45
Lukas Eder Avatar answered Oct 22 '22 21:10

Lukas Eder