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.