0

My problem is as follows, I have a Spring boot application and I use Jooq for sql, I set my pom to generate the tables. Database information is set in environment variables. It's working fine inside Intellij but when I generate the .WAR and upload the application on the client it only works if the client database name is the same as the name in my pom.xml when the jooq code was created. The tables are exactly the same, the only thing that can change is the database name, so I look up the name information in the environment variables. My variables are all set in the properties, In debugging I can see my connection object with the variable data.

My pom.xml is as follows:

<?xml version="1.0" encoding="UTF-8"?>

http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0

<groupId>com.speedsoft</groupId>
<artifactId>bedelServer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!--    <packaging>jar</packaging>-->
<packaging>war</packaging>

<name>BWS</name>
<description>BWS</description>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>


<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <java.version>1.8</java.version>
    <quartz.version>2.2.1</quartz.version>
    <jooq.version>3.9.1</jooq.version>
    <logback.version>1.2.3</logback.version>
    <logbackaccess.version>1.3.0-alpha4</logbackaccess.version>
    <mysql.version>6.0.3</mysql.version>
    <exec-maven-plugin>1.7</exec-maven-plugin>

    <start-class>com.speedsoft.bws.BwsApplication</start-class>
</properties>



<dependencies>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>


    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>


    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>${quartz.version}</version>
    </dependency>

    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz-jobs</artifactId>
        <version>${quartz.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-quartz</artifactId>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.version}</version>
    </dependency>

    <dependency>
        <groupId>org.jooq</groupId>
        <artifactId>jooq</artifactId>
        <version>${jooq.version}</version>
    </dependency>

    <dependency>
        <groupId>org.jooq</groupId>
        <artifactId>jooq-meta</artifactId>
        <version>${jooq.version}</version>
    </dependency>

    <dependency>
        <groupId>org.jooq</groupId>
        <artifactId>jooq-codegen</artifactId>
        <version>${jooq.version}</version>
    </dependency>

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>${logback.version}</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jul-to-slf4j</artifactId>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>log4j-over-slf4j</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-commons</artifactId>
        <version>2.0.6.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-access</artifactId>
        <version>${logbackaccess.version}</version>
    </dependency>

    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5</version>
    </dependency>

    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpmime</artifactId>
        <version>4.3.1</version>
    </dependency>

    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpcore</artifactId>
        <version>4.4.9</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpcore</artifactId>
        <version>4.0.1</version>
    </dependency>

</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.jooq</groupId>
            <artifactId>jooq-codegen-maven</artifactId>
            <version>3.8.3</version>

            <!-- The plugin should hook into the generate goal -->
            <executions>
                <execution>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>

            <dependencies/>

            <configuration>
                <jdbc>
                    <driver>${jdbc.driver}</driver>
                    <url>${jdbc.url}</url>
                    <user>${jdbc.user}</user>
                    <password>${jdbc.password}</password>
                </jdbc>

                <generator>
                    <database>
                        <inputSchema>bedel</inputSchema>
                        <name>org.jooq.util.mysql.MySQLDatabase</name>
                    </database>
                    <target>
                        <packageName>com.speedsoft.bws.jooq.model</packageName>
                        <directory>target/generated-sources/jooq</directory>
                        <encoding>UTF-8</encoding>
                    </target>
                    <generate>
                    <fluentSetters>false</fluentSetters>
                    <daos>false</daos>
                    </generate>
                </generator>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.5.0</version>
            <executions>
                <execution>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <systemProperties>
                    <systemProperty>
                        <key>jdbc.driver</key>
                        <value>${jdbc.driver}</value>
                    </systemProperty>
                    <systemProperty>
                        <key>jdbc.user</key>
                        <value>${jdbc.user}</value>
                    </systemProperty>
                    <systemProperty>
                        <key>jdbc.password</key>
                        <value>${jdbc.password}</value>
                    </systemProperty>
                    <systemProperty>
                        <key>jdbc.url</key>
                        <value>${jdbc.url}</value>
                    </systemProperty>
                </systemProperties>
            </configuration>
        </plugin>
    </plugins>
</build>

<profiles>
    <profile>
        <id>default</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <jdbc.user>root</jdbc.user>
            <jdbc.password>%47**¨00</jdbc.password>
            <jdbc.url>jdbc:mysql://localhost:3306/bedel?serverTimezone=UTC</jdbc.url>
            <jdbc.driver>com.mysql.cj.jdbc.Driver</jdbc.driver>
        </properties>
    </profile>
</profiles>

How do I have to configure my pom.xml so that when generating the .WAR it does not insert the dependency on having a database with the same name as the code generation time?

Will I have to enter all possible names in the schemas?

<schemata>
  <schema>
    <inputSchema>ui</inputSchema>
  </schema>
  <schema>
    <inputSchema>other_schema</inputSchema>
  </schema>
</schemata>
Manzini
  • 117
  • 1
  • 10
  • 2
    Have you tried using application.properties to set these? –  Sep 16 '19 at 12:59
  • My variables are all set in the properties, the problem is that when I generate war (mvn install), even if my connection object already has the correctly configured database name the application looks for the generation name "bedel" – Manzini Sep 16 '19 at 13:04
  • 1
    For your remote environment you will need one more maven profile `mvn package -P other_profile` – Serg Vasylchak Sep 16 '19 at 13:23
  • @SergVasylchak In this new profile I enter the data from another database? – Manzini Sep 16 '19 at 13:33
  • 2
    Probably, this topic https://stackoverflow.com/questions/10730755/using-maven-settings-xml-properties-inside-spring-context and tutorial http://maven.apache.org/plugins/maven-war-plugin/examples/adding-filtering-webresources.html will help you – Dmitriy S Sep 16 '19 at 13:43

1 Answers1

1

Reading environment variables

You can read environment variables directly with Maven by using the ${env.VARIABLE_NAME} syntax. If you know there are only two schemata, but their specific names may differ depending on the environment, you could write:

<schemata>
  <schema>
    <inputSchema>${env.UI_SCHEMA}</inputSchema>
  </schema>
  <schema>
    <inputSchema>${env.OTHER_SCHEMA}</inputSchema>
  </schema>
</schemata>

Using programmatic code generation configuration

There is always the possibility of implementing a programmatic code generation configuration, which would allow for a more dynamic configuration of your input schemata. This is documented here: https://www.jooq.org/doc/latest/manual/code-generation/codegen-programmatic

Using runtime schema mapping

Instead of re-generating your code per environment, you could choose to check in generated code in version control (there are pros and cons to that), and patch the generated schema at runtime using the runtime schema mapping feature: https://www.jooq.org/doc/latest/manual/sql-building/dsl-context/custom-settings/settings-render-mapping/

Lukas Eder
  • 211,314
  • 129
  • 689
  • 1,509