WebSphere Liberty Profile配置MySQL数据源遇类找不到问题求助
解决WebSphere Liberty Profile中MySQL数据源驱动类找不到的问题
首先看你的错误堆栈,核心问题是Liberty找不到com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource这个类,而你在server.xml里配置的javax.sql.XADataSource="com.mysql.cj.jdbc.Driver"是错误的——com.mysql.cj.jdbc.Driver是JDBC驱动类,不是XADataSource的实现类,这就是问题的关键!
下面是针对性的解决方案:
1. 修正jdbcDriver的配置参数
你混淆了JDBC驱动类和数据源实现类的配置:
- 如果要配置XA数据源,应该指定
javax.sql.XADataSource为MySQL对应版本的XA实现类:- MySQL Connector/J 6.x+:
com.mysql.cj.jdbc.MysqlXADataSource - MySQL Connector/J 5.x:
com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
- MySQL Connector/J 6.x+:
- 如果不需要XA事务,也可以配置连接池数据源,用
javax.sql.ConnectionPoolDataSource参数,对应类:- 6.x+:
com.mysql.cj.jdbc.MysqlConnectionPoolDataSource - 5.x:
com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource
- 6.x+:
举个正确的配置示例(适配Connector/J 6.x):
<dataSource id="springdb" jndiName="jdbc/springdb"> <jdbcDriver javax.sql.XADataSource="com.mysql.cj.jdbc.MysqlXADataSource" libraryRef="mysqlJDBCLib"/> <properties databaseName="spring_db" password="**********" portNumber="3306" serverName="localhost" user="root" serverTimezone="UTC"/> </dataSource> <library id="mysqlJDBCLib"> <fileset dir="/opt/IBM/WebSphere/Liberty_16.0.0.4/usr/shared/resources/mysql" includes="mysql-connector-java-6.0.6.jar"/> </library>
2. 匹配Liberty版本与MySQL驱动版本
你用的是Liberty 16.0.0.4,这个版本比较老旧,MySQL Connector/J 6.x引入了很多新特性(比如时区强制配置、CJ包名前缀),可能和旧版Liberty存在兼容性问题。建议试试MySQL Connector/J 5.1.49这个稳定版本,它的类名还是com.mysql.jdbc前缀,更适配旧版Liberty:
配置示例(适配Connector/J 5.x):
<dataSource id="springdb" jndiName="jdbc/springdb"> <jdbcDriver javax.sql.XADataSource="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" libraryRef="mysqlJDBCLib"/> <properties databaseName="spring_db" password="**********" portNumber="3306" serverName="localhost" user="root"/> </dataSource> <library id="mysqlJDBCLib"> <fileset dir="/opt/IBM/WebSphere/Liberty_16.0.0.4/usr/shared/resources/mysql" includes="mysql-connector-java-5.1.49.jar"/> </library>
3. 验证驱动包的权限与路径
确保:
/opt/IBM/WebSphere/Liberty_16.0.0.4/usr/shared/resources/mysql目录下确实存在对应的jar包- Liberty进程拥有读取该目录和jar包的权限(可以用
chown或chmod调整权限) - 重启Liberty服务器,让配置和驱动包加载生效
4. 备选:使用basic驱动配置方式
如果上面的方式还是不行,也可以用更简单的driverClassName配置(不需要指定XA/ConnectionPoolDataSource):
<dataSource id="springdb" jndiName="jdbc/springdb" type="javax.sql.DataSource"> <jdbcDriver driverClassName="com.mysql.cj.jdbc.Driver" libraryRef="mysqlJDBCLib"/> <properties databaseName="spring_db" password="**********" portNumber="3306" serverName="localhost" user="root" serverTimezone="UTC"/> </dataSource>
之前你尝试的方案没解决,大概率是因为没搞清楚javax.sql.XADataSource参数需要的是数据源实现类,而不是驱动类,或者驱动版本和Liberty版本不匹配。按照上面的步骤调整,应该能解决问题。
内容的提问来源于stack exchange,提问作者Hopewell Mutanda




