Отладка "Неправильная настройка инструмента генерации кода jOOQ"

James Hiew спросил: 13 июня 2018 в 05:20 в: maven

Я пытаюсь следовать вместе с учебником jOOQ. Я на шаге 3 (генерация кода), но хочу сделать шаг генерации кода с помощью Maven.

Вот содержимое моего 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>

Каталог моего проекта:

Ошибка при запуске 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

Сообщение об ошибке не так полезно, поэтому я не уверен, как лучше отладить проблему. pom.xml проверяет и база данных существует и доступна, как описано в элементе <configuration>.

3 ответа

Есть решение
wallek876 ответил: 17 июня 2018 в 10:10

Тег конфигурации должен находиться непосредственно под тегом плагина, а не внутри выполнения:

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

Полный тег плагина:

<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>

Обратите внимание, что вам может потребоваться указать вашу версию mariadb в зависимости, я добавил имя переменной defalut.

James Hiew ответил: 17 июня 2018 в 06:06
Благодаря! Это немного улучшилось. Теперь он выплевывает другую ошибку: Error running jOOQ code generation tool: Error generating code for catalog: Error writing /home/james/src/local/jooqtutorial/src/main/java/net/hie w/jooqtutorial/generated/DefaultCatalog.java: /home/james/src/local/jooqtutorial/src/main/java/net/hiew/jooqtutorial/generated/DefaultCatalog.java (No such file or directory). Я создал полный путь туда, где DefaultCatalog.java должен быть сгенерирован, но он все равно не работает одинаково.
wallek876 ответил: 17 июня 2018 в 08:04
@JamesHiew кажется просто ошибкой в ​​отношении целевого пути, вы уверены, что у вас есть правильный путь? Также обратите внимание, что вы можете использовать относительный путь maven для целевого <directory>src/main/java/</directory>, что может быть более удобным.
James Hiew ответил: 17 июня 2018 в 10:50
Обновление элемента <directory>!
James Hiew ответил: 15 июня 2018 в 06:16
Он дает тот же результат, что и mvn -e jooq-codegen:generate
Lukas Eder ответил: 18 июня 2018 в 06:31

В качестве альтернативы ответа wallek876 вы можете переименовать свое исполнениеId в default-cli , как описано здесь . Итак, это должно работать:

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

Другой вариант, который я всегда предпочитаю, заключается в использовании профилей:

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

И затем, запустите это с помощью

mvn install -P jooq-codegen
James Hiew ответил: 17 июня 2018 в 05:55
Maven 3.5.4 работает на Oracle Java 9. Нет кубиков.
Lukas Eder ответил: 18 июня 2018 в 06:32
@JamesHiew: Обновлен ответ