Solving Jboss Wildfly Oracle JDBC driver problem, with Dockerfile

August 10, 2019

Assuming your web application is using oracle, and you are deploying your app on Jboss wildfly. If you run on fresh download of wildfly or docker image of jboss/wildfly, you will get following error:

ERROR [org.jboss.msc.service.fail] (MSC service thread 1-6) MSC000001: Failed to start service
.
.
.
10:15:56,901 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) WFLYCTL0013: Operation ("add") failed - address: ([
    ("subsystem" => "datasources"),
    ("data-source" => "oracle")
]) - failure description: {
    "WFLYCTL0412: Required services that are not installed:" => ["jboss.jdbc-driver.OracleJDBCDriver"],
    "WFLYCTL0180: Services with missing/unavailable dependencies" => [
        "org.wildfly.data-source.oracle is missing [jboss.jdbc-driver.OracleJDBCDriver]",
        "jboss.driver-demander.java:/oracle is missing [jboss.jdbc-driver.OracleJDBCDriver]"
    ]
}
10:15:56,903 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) WFLYCTL0013: Operation ("add") failed - address: ([
    ("subsystem" => "datasources"),
    ("data-source" => "oracle")
]) - failure description: {
    "WFLYCTL0412: Required services that are not installed:" => [
        "jboss.jdbc-driver.OracleJDBCDriver",
        "jboss.jdbc-driver.OracleJDBCDriver"
    ],
    "WFLYCTL0180: Services with missing/unavailable dependencies" => [
        "org.wildfly.data-source.oracle is missing [jboss.jdbc-driver.OracleJDBCDriver]",
        "jboss.driver-demander.java:/oracle is missing [jboss.jdbc-driver.OracleJDBCDriver]",
        "org.wildfly.data-source.oracle is missing [jboss.jdbc-driver.OracleJDBCDriver]"
    ]
}

Solution to Oracle jdbc driver issue

  • First you need to download jdbc driver from oracle website.
  • Download ojdbc7.jar
  • Now, you need to make this as module in Jboss wildfly so that it can load this as module.
  • Assumming your wildfly path is in variable: $WILDFLY_HOME
  • Copy ojdbc to directory: $WILDFLY_HOME/modules/system/layers/base/com/oracle/main

    • NOTE: You need to create few directories under modules/system/layers/base directory
  • Create a file in that folder named: module.xml, and put following content:
<?xml version="1.0" encoding="UTF-8"?>
    
<module name="com.oracle" xmlns="urn:jboss:module:1.1">
    <resources>
        <resource-root path="ojdbc7.jar"/>
    </resources>
    <dependencies>
        <module name="javax.api"/>
        <module name="javax.transaction.api"/>
    </dependencies>
</module>
  • Open $WILDFLY_HOME/standalone/configuration/standalone.xml file
  • Put following:

    • Look for more subsystem tags, to see where this block of xml will go.
    • Also be careful, not to duplicate this block. If another block exist with same xmlns, remove it.
<subsystem xmlns="urn:jboss:domain:datasources:5.0">
    <datasources>
        <datasource jndi-name="java:/oracle-ds" pool-name="oracle-ds" enabled="true">
            <connection-url>jdbc:oracle:thin:@HOSTNAME:PORT/DATABASE</connection-url>
            <driver>OracleJDBCDriver</driver>
            <pool>
                <min-pool-size>5</min-pool-size>
                <max-pool-size>100</max-pool-size>
                <prefill>true</prefill>
                <flush-strategy>IdleConnections</flush-strategy>
            </pool>
            <security>
                <user-name>USERNAME</user-name>
                <password>PASSWORD</password>
            </security>
            <validation>
                <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker"/>
                <check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>
                <background-validation>true</background-validation>
                <stale-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleStaleConnectionChecker"/>
                <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"/>
            </validation>
            <timeout>
                <blocking-timeout-millis>5000</blocking-timeout-millis>
                <idle-timeout-minutes>5</idle-timeout-minutes>
            </timeout>
        </datasource>
        <drivers>
            <driver name="OracleJDBCDriver" module="com.oracle">
                <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
                <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
            </driver>
        </drivers>
    </datasources>
</subsystem>
  • Restart your wildfly.

Solution using Docker

If you are using wildfly docker image, you might require following Dockerfile

FROM jboss/wildfly

COPY ojdbc7.jar /opt/jboss/wildfly/modules/system/layers/base/com/oracle/main/
COPY module.xml /opt/jboss/wildfly/modules/system/layers/base/com/oracle/main/

#Copying required scripts and files
COPY standalone.xml /opt/jboss/wildfly/standalone/configuration/
COPY <WEBAPP>.war /opt/jboss/wildfly/standalone/deployments/

Note: In above file, module.xml is file having following content:

<?xml version="1.0" encoding="UTF-8"?>
    
<module name="com.oracle" xmlns="urn:jboss:module:1.1">
    <resources>
        <resource-root path="ojdbc7.jar"/>
    </resources>
    <dependencies>
        <module name="javax.api"/>
        <module name="javax.transaction.api"/>
    </dependencies>
</module>
  • standalone.xml file is copied from the container itself. To take this, use following method;
docker run -it -d jboss/wildfly

# get its container id
docker ps

# Copy standaline.xml file to current path
docker cp <container-id>/opt/jboss/wildfly/standalone/configuration/standalone.xml .

Final solution for docker

Now, we just need to build another image from our Dockerfile

docker build -t MY_IMAGE_NAME .

# To run it,
docker run -it -d MY_IMAGE_NAME

Hope you get your problem resolved.


Similar Posts

Latest Posts