Docker创建MySql服务,Navicat能连上,项目代码却保错,一样的IP、端口、密码,给我整懵了!
如图,Navicat和IDEA自带的Database插件都能连接成功。项目datasource的配置完全一致。
然而,项目运行后总是说连接数据库失败。
经反复尝试,排除了代码写错的原因,也排除了jdbc.url中设定serverTimezone、characterEncoding等参数的影响。
最后,发现是当前mysql驱动版本不支持当前Docker的MySql服务所导致的。
我之前的mysql驱动版本是5.1.9,换成5系列最新版本5.1.49后连接成功。
在解决问题的过程中,又发现了两个问题
1、Docker创建的MySql服务并不支持localhost形式的数据库连接方式,虽然项目包上传到服务器后理论上可以使用localhost的方式访问服务器上的数据库。但经测试,这种方式不可行,使用Docker创建的MySQL服务,最好使用真实IP作为数据源连接方式。
2、Maven生命周期打包项目和IDEA自带打包项目方式的区别。
Maven打包项目
这种方式对项目的要求较高,在打包过程中,maven会自动测试你的代码是否存在错误。即使是测试类中的单元测试没有通过,也会导致项目打包失败。
另外,如果项目中有某个第三方包没有交给maven管理,而是交给额外配置的Tomcat管理,比如net.sf.json.JSONArray,也会导致项目打包失败。Maven项目最好把所有第三方包都交给maven管理。
特别注意:
Maven生命周期中的package(打包)基于compile(编译),也许项目在Tomcat的运行下是正常的,但单独使用compile进行编译可能会失败,比如没有添加resources目录的映射。
Maven生命周期中的compile(编译)需要配合clean(清空)使用,一旦编译失败,记得清空后再重新编译。
IDEA自带的打包功能
如下图,Artifacts中所有的非exploed的项目包都可以打成war包
这种打包方式对项目的要求较低,Maven打包方式无法通过的话,可以尝试这种打包方式。
总结:两种打包方式都是将war包放到了target根目录下。