在 JBoss / Wildfly 上允许部署的应用程序使用不同的 jdbc 驱动程序的正确方法是什么?
Whats the correct way to allow different jdbc drivers for deployed applications on JBoss / Wildfly?
我的设置如下:
- 我得到了一个应用程序,我将其部署在
/standalone/deployments
- 我在
/standalone/deployments
中部署的 jboss-deployment-structure.xml
如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<dependencies>
[...]
<module name="org.postgresql"/>
</dependencies>
</deployment>
</jboss-deployment-structure>
完全删除 jboss-deployment-structure.xml
(因为如果没有类加载问题则不能使用它)是行不通的。我在驱动旁边使用了更多的依赖项(keycloak),然后找不到。
我的模块 org/postgresql/main
中的 module.xml
看起来像这样(如 https://www.keycloak.org/docs/4.8/server_installation/index.html#package-the-jdbc-driver 中所述)
<?xml version="1.0" encoding="UTF-8"?>
<module name="org.postgresql" xmlns="urn:jboss:module:1.5">
<resources>
<resource-root path="postgresql-42.2.5.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
</dependencies>
</module>
- 我的要求是允许不同类型的 jdbc-驱动程序,例如postgres、甲骨文、mssql。
第一个选项:
我可以把我的 jboss-deployment-structure.xml
改成
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<dependencies>
[...]
<module name="org.postgresql" optional="TRUE"/>
<module name="com.oracle.ojdbc6" optional="TRUE"/>
[...]
</dependencies>
</deployment>
</jboss-deployment-structure>
(添加了可选参数)
然后我必须明确允许所有驱动程序。好像不是最好的办法。
想法来自标准documentation。
第二个选项:
我将模块路径更改为 driver/jdbc/main
(而不是 org/postgres/main
)并将 module.xml
更改为
<module name="driver.jdbc" xmlns="urn:jboss:module:1.5">
[...]
</module>
(已更改模块名称)
并使用我的 jboss-deployment-structure.xml
中的模块参考,例如
<jboss-deployment-structure>
[...]
<module name="driver.jdbc"/>
[...]
</jboss-deployment-structure>
现在我强迫我的客户按照我建议的那样命名驱动程序模块。他们不能像每个标准文档中提到的那样命名模块。
思路来源于此question。
我是在 keycloak 安装的上下文中执行此操作的,该密钥斗篷安装有一个自行实现的用户联合来访问一个单独的(旧版)用户数据库。因此删除 jboss-deployment-structure.xml
不是上面提到的选项。
使用 jdbc-驱动程序实现灵活目标的正确方法是什么?
编辑: 提到,删除 jboss-deployment-structure.xml
不起作用。
我建议您将所有数据库驱动程序单独安装为模块。个别模块将帮助您在未来轻松跟踪和升级驱动程序jar。
只要您的应用程序没有任何类加载问题,您就不需要在 jboss-deployment-structure.xml
文件中提及这些驱动程序。它们是静态模块,将在服务器启动时加载。
此外,安装驱动模块后,您必须在standalone.xml文件中添加条目。例如,如果我已经安装了 Oracle 驱动程序,那么
<driver name="oracle" module="com.oracle">
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
</driver>
标签内。
在标记内添加数据源定义(在 ExampleDS 旁边):
<datasource jndi-name="java:/[NAME]" pool-name="OracleDS" enabled="true">
<connection-url>jdbc:oracle:thin:@[HOST_NAME]:1521:[SID]</connection-url>
<driver>oracle[has to match the driver name]</driver>
<pool>
<min-pool-size>1</min-pool-size>
<max-pool-size>5</max-pool-size>
<prefill>true</prefill>
</pool>
<security>
<user-name>[USER]</user-name>
<password>[PWD]</password>
</security>
</datasource>
至少我针对 jboss-deployment-structure.xml
采用了上述两种方法的混合解决方案,如下所示
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="org.postgresql" optional="TRUE"/>
<module name="com.oracle.ojdbc6" optional="TRUE"/>
[...]
<module name="driver.jdbc" optional="TRUE"/>
</dependencies>
</deployment>
</jboss-deployment-structure>
我列出了所有相关的数据库驱动程序作为可选模块,如果需要驱动程序,则列出另一个具有灵活命名的驱动程序,这在上面的列表中没有提到。
Keycloak 有一个设计精良的容器。您可以从中获得灵感进行部署。看看 Dockerfile installs database driver modules and later how to activate those modules using jboss_cli.
是如何实现的
当然,如果可以的话,也许你可以用容器代替。只需确保为您的驱动程序包含 module.xml 并通过提供您自己的入口点在启动时激活它。
我的设置如下:
- 我得到了一个应用程序,我将其部署在
/standalone/deployments
- 我在
/standalone/deployments
中部署的jboss-deployment-structure.xml
如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<dependencies>
[...]
<module name="org.postgresql"/>
</dependencies>
</deployment>
</jboss-deployment-structure>
完全删除
jboss-deployment-structure.xml
(因为如果没有类加载问题则不能使用它)是行不通的。我在驱动旁边使用了更多的依赖项(keycloak),然后找不到。我的模块
org/postgresql/main
中的module.xml
看起来像这样(如 https://www.keycloak.org/docs/4.8/server_installation/index.html#package-the-jdbc-driver 中所述)
<?xml version="1.0" encoding="UTF-8"?>
<module name="org.postgresql" xmlns="urn:jboss:module:1.5">
<resources>
<resource-root path="postgresql-42.2.5.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
</dependencies>
</module>
- 我的要求是允许不同类型的 jdbc-驱动程序,例如postgres、甲骨文、mssql。
第一个选项:
我可以把我的 jboss-deployment-structure.xml
改成
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<dependencies>
[...]
<module name="org.postgresql" optional="TRUE"/>
<module name="com.oracle.ojdbc6" optional="TRUE"/>
[...]
</dependencies>
</deployment>
</jboss-deployment-structure>
(添加了可选参数)
然后我必须明确允许所有驱动程序。好像不是最好的办法。
想法来自标准documentation。
第二个选项:
我将模块路径更改为 driver/jdbc/main
(而不是 org/postgres/main
)并将 module.xml
更改为
<module name="driver.jdbc" xmlns="urn:jboss:module:1.5">
[...]
</module>
(已更改模块名称)
并使用我的 jboss-deployment-structure.xml
中的模块参考,例如
<jboss-deployment-structure>
[...]
<module name="driver.jdbc"/>
[...]
</jboss-deployment-structure>
现在我强迫我的客户按照我建议的那样命名驱动程序模块。他们不能像每个标准文档中提到的那样命名模块。
思路来源于此question。
我是在 keycloak 安装的上下文中执行此操作的,该密钥斗篷安装有一个自行实现的用户联合来访问一个单独的(旧版)用户数据库。因此删除 jboss-deployment-structure.xml
不是上面提到的选项。
使用 jdbc-驱动程序实现灵活目标的正确方法是什么?
编辑: 提到,删除 jboss-deployment-structure.xml
不起作用。
我建议您将所有数据库驱动程序单独安装为模块。个别模块将帮助您在未来轻松跟踪和升级驱动程序jar。
只要您的应用程序没有任何类加载问题,您就不需要在 jboss-deployment-structure.xml
文件中提及这些驱动程序。它们是静态模块,将在服务器启动时加载。
此外,安装驱动模块后,您必须在standalone.xml文件中添加条目。例如,如果我已经安装了 Oracle 驱动程序,那么
<driver name="oracle" module="com.oracle">
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
</driver>
标签内。 在标记内添加数据源定义(在 ExampleDS 旁边):
<datasource jndi-name="java:/[NAME]" pool-name="OracleDS" enabled="true">
<connection-url>jdbc:oracle:thin:@[HOST_NAME]:1521:[SID]</connection-url>
<driver>oracle[has to match the driver name]</driver>
<pool>
<min-pool-size>1</min-pool-size>
<max-pool-size>5</max-pool-size>
<prefill>true</prefill>
</pool>
<security>
<user-name>[USER]</user-name>
<password>[PWD]</password>
</security>
</datasource>
至少我针对 jboss-deployment-structure.xml
采用了上述两种方法的混合解决方案,如下所示
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="org.postgresql" optional="TRUE"/>
<module name="com.oracle.ojdbc6" optional="TRUE"/>
[...]
<module name="driver.jdbc" optional="TRUE"/>
</dependencies>
</deployment>
</jboss-deployment-structure>
我列出了所有相关的数据库驱动程序作为可选模块,如果需要驱动程序,则列出另一个具有灵活命名的驱动程序,这在上面的列表中没有提到。
Keycloak 有一个设计精良的容器。您可以从中获得灵感进行部署。看看 Dockerfile installs database driver modules and later how to activate those modules using jboss_cli.
是如何实现的当然,如果可以的话,也许你可以用容器代替。只需确保为您的驱动程序包含 module.xml 并通过提供您自己的入口点在启动时激活它。