User Storage SPI: persistence.xml not found


My goal is to write a Keycloak user storage SPI to interface with a legacy MySQL database.

I have a small project that can query the database successfully in my test-module.

My issue is that once I deploy my main-module to Keycloak/Wildfly, it can’t seem to find my persistent-unit:

17:04:44,398 INFO  [org.hibernate.jpa.boot.internal.PersistenceXmlParser] (default task-3) HHH000318: Could not find any META-INF/persistence.xml file in the classpath
17:04:44,399 ERROR [] (default task-3) Uncaught server error: com.fasterxml.jackson.databind.JsonMappingException: No Persistence provider for EntityManager named CRM

I am not sure which of the following is really relevant to this, but I will describe my setup:

I am using live deployment of the .jar, because that’s what the Keycloak doc recommends
(Server Developer Guide) and so I can use hot/re-deployment.

As far as I know, this means that I can’t use external dependencies other than the modules I manually install in keycloak as well. So I set my dependencies in gradle to compileOnly:

dependencies {
    compileOnly 'org.keycloak:keycloak-server-spi:15.0.2'
    compileOnly 'mysql:mysql-connector-java:8.0.27'
    compileOnly 'org.hibernate:hibernate-core:5.3.20.Final'

I installed the module mysql:mysql-connector-java manually to Keycloak/Wildfly and it is working (tested using the Wildfly Management Console webinterface) correctly.

So, as I am only using dependencies that are already installed in the Keycloak/Wildfly system, I figured, I would need an additional file to tell Wildfly, what my SPI depends on. So I created src/main/resources/META-INF/jboss-deployment-structure.xml, although I am not exactly sure if this is doing anything:

<?xml version="1.0" encoding="UTF-8"?>
            <module name="org.keycloak.keycloak-core" export="true" />
            <module name="org.keycloak.keycloak-server-spi" export="true" />
            <module name="org.keycloak.keycloak-server-spi-private" export="true" />
            <module name="org.keycloak.keycloak-services" export="true" />
            <module name="com.mysql" export="true" />
            <module name="org.hibernate" export="true" />

I’m simply building my SPI with gradlew build and am deploying it with the following command: $KEYCLOAK_HOME/bin/ -c --command="deploy --force keycloak-spi-1.0-SNAPSHOT.jar".

The SPI is properly recognised in Keycloak and deployment, as well as activating it in Keycloak, works without error. But once I try to use it (query the database using the Keycloak webinterface), it throws aforementioned error.

Here’s my persistence.xml, which resides in src/main/resources/META-INF/persistence.xml.

<persistence xmlns=""

    <persistence-unit name="CRM">

            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/example?useSSL=false&amp;characterEncoding=UTF-8" />

            <property name="javax.persistence.jdbc.user" value="keycloak" />
            <property name="javax.persistence.jdbc.password" value="keycloak" />
            <property name="hibernate.show_sql" value="true" />
            <property name="" value="update" />

This persistence.xml works well within my test-module. If I unpack the .jar, I can also find it in there in /META-INF/persistence.xml.

Somehow, Keycloak ist not picking up the file and I have no idea how to solve this.

What’s the classpath of Keycloak or Wildfly?
How do I make it, so the file can be read by Keycloak?