Tech stack – #java, #maven, #liquibase, #docker
Why?
I will talk about what we did to achieve below things,
-
Generate jooq-classes from an in-memory or Adhoc database instead of connecting to prelive/live environments.
-
How to apply all the migrations using liquibase before generating jooq-classes.
-
Generate jooq-classes based on Postgres driver. Jooq supports generating classes connecting to h2 (in-memory database) but not Postgres. We use Postgres mostly and h2 mostly does not support many features Postgres has.
-
Avoid using multiple maven plugins and 100 lines of code instead use one maven plugin.
What we did
-
Start “Test-containers” during maven pre-compile stage. (https://www.testcontainers.org/#about)
-
Apply liquibase migrations over the test-container.
-
Generate jooq-classes based for the schema provided.
Where can I find
jango89 / jooqgen-liquibase-postgres
Maven plugin with jooq, liquibase and postgres
What is this
Maven plugin which can be integrated to any maven project Sample :
<plugin><groupId>com.mytaxi</groupId><artifactId>jooqgen-liquibase-postgres</artifactId><configuration><schema>bookingoptionsservice</schema> <-- schema name --><packageName>com.mytaxi.bookingoptionsservice</packageName> <-- package to be created for generated classes --><liquibaseChangeLogFile>${liquibase.changeLogFile}</liquibaseChangeLogFile></configuration><executions><execution><phase>generate-sources</phase><goals><goal>jooqOverPostgresContainer</goal></goals></execution></executions></plugin><plugin> <groupId>com.mytaxi</groupId> <artifactId>jooqgen-liquibase-postgres</artifactId> <configuration> <schema>bookingoptionsservice</schema> <-- schema name --> <packageName>com.mytaxi.bookingoptionsservice</packageName> <-- package to be created for generated classes --> <liquibaseChangeLogFile>${liquibase.changeLogFile}</liquibaseChangeLogFile> </configuration> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>jooqOverPostgresContainer</goal> </goals> </execution> </executions> </plugin><plugin> <groupId>com.mytaxi</groupId> <artifactId>jooqgen-liquibase-postgres</artifactId> <configuration> <schema>bookingoptionsservice</schema> <-- schema name --> <packageName>com.mytaxi.bookingoptionsservice</packageName> <-- package to be created for generated classes --> <liquibaseChangeLogFile>${liquibase.changeLogFile}</liquibaseChangeLogFile> </configuration> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>jooqOverPostgresContainer</goal> </goals> </execution> </executions> </plugin>
What it does
- Starts a postgress docker container.
- Applies liquibase changes over the container.
- Generates JOOQ classes for the source project connecting to postgres container.
Problems and solutions
If generated classes fail to compile,
- include
/target/generated-sources/jooq/
folder to corresponding compiler plugin. - If kotlin-maven-plugin compilation failes, add
<configuration><sourceDirs><source>src/main/java</source><source>target/generated-sources/jooq</source></sourceDirs></configuration>
<configuration> <sourceDirs> <source>src/main/java</source> <source>target/generated-sources/jooq</source> </sourceDirs> </configuration>
<configuration> <sourceDirs> <source>src/main/java</source> <source>target/generated-sources/jooq</source> </sourceDirs> </configuration>
- If the
NoClassDefError
happens, this means the class files are missing. Add the following plugin
<plugin><groupId>org.codehaus.mojo</groupId><artifactId>build-helper-maven-plugin</artifactId><executions><execution><phase>generate-sources</phase><goals><goal>add-source</goal></goals><configuration><sources><source>${project.build.directory}/generated-sources/jooq</source></sources></configuration></execution></executions></plugin><plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>add-source</goal> </goals> <configuration> <sources> <source>${project.build.directory}/generated-sources/jooq</source> </sources> </configuration> </execution> </executions> </plugin><plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>add-source</goal> </goals> <configuration> <sources> <source>${project.build.directory}/generated-sources/jooq</source> </sources> </configuration> </execution> </executions> </plugin>
暂无评论内容