详解pom如何引入非Maven工程的jar包
作者:暗黑腐竹
背景
系统迁移从某个公有云迁移到私有云,因为现在国内大力推行国产化,所以我们这次迁移有两个国产化的东西(这里不包括硬件)。第一个是操作系统采用了欧拉操作系统(华为爸爸出产据说已捐),第二个就是数据库采用了goldendb。
这次记录这个问题主要是因为使用提供的goldendb的驱动连接不上数据库,启动的时候报错。这次我们使用的对方提供的gdb_mysql-connector-java-5.1.46.28.jar这个驱动,而且是一个普通工程打成的jar包。
maven工程打包结构中包含pom文件:
而普通工程打包后,是不存在pom文件的:
问题
这个jar包如何使用,用maven私库管理?直接引用?当作外部jar包加载?这个时候发现自己的储备已经不够用。
分析
因为本地没有goldendb只能使用mysql8做测试,驱动使用gdb_mysql-connector-java-5.1.46.28.jar。
方案一:通过web页面上传jar包到nexus私库中,使用pom依赖引入,失败现象下载的jar是空包;
方案二:使用java -jar -Dload.path,但百度告诉我应该使用java -cp path/to/external.jar -jar yourJarFile.jar;
方案三:使用maven命令将驱动jar包推入nexus私服中;
方案四:在项目中的pom文件中使用如下配置,引入jar包;
方案一
使用管理员账号登录自己或者公司搭建的nexus私服,找到左边upload菜单,选中目标仓库进行上传界面如下(图片为nexus3的界面仅供参考):
*注意: *最后的packaging填上jar
上传是成功的,因为在仓库里是能找到对应的包和内容的(网络图片仅供参考):
但是,下载的时候却是不成功的,因为每次下载下来的依赖包只有6kb:
然而服务器上是975kb:
那就说明普通java工程打jar不能通过这种方式直接上传,可能使用maven命令将驱动jar包推入nexus私服中,只是猜测需要验证,方案一行不通。
方案四
新建一个springboot maven项目,在application中增加数据源的配置:
spring: datasource: username: rrbbd password: gfdgdf driver-class-name: com.goldendb.jdbc.Driver url: jdbc:goldendb:loadbalance://localhost:3306/monster?useCursorFetch=false&useSSL=false&cachePrepStmts=true&prepStmtCacheSqlLimit=20480&prepStmtCacheSize=2000&characterEncoding=utf8&queryTimeoutKillsConnection=true&isConnectionLevel=true&connectTimeout=60000&shadowThreadSwitch=False
使用了大佬提供的maven配置进行测试,在工程resources目录下创建lib目录,通过在pom中增加如下配置来引入jar包:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/resources/lib/gdb_mysql-connector-java-5.1.46.28.jar</systemPath> </dependency>
*注意: *这里的groupId、artifactId、version可随便命名
然后根据自己的表创建一个jdbc查询语句,用于测试:
Connection con = dataSource.getConnection(); Statement stmt = con.createStatement(); String sql = "select * from t_user;"; ResultSet rs = stmt.executeQuery(sql); ResultSetMetaData metaData = rs.getMetaData(); while (rs.next()) { int id = rs.getInt(1); String name = rs.getString(2); log.info("id:{}", id); log.info("name:{}", name); } con.close();
工程的目录结构:
异常报错
第一次在idea中启动报java.sql.SQLException: Unable to load authentication plugin 'caching_sha2_password'.
问题原因
这是mysql 8.0版本才出现的问题,原因是mysql 8.0 默认使用 caching_sha2_password 身份验证机制 —— 从原来的 mysql_native_password 更改为 caching_sha2_password。所以一般这种报错由于本地的MySQL使用的是最新版8.0版本,而打包的项目使用的则是比较低的版本,可以解释说是版本冲突产生的问题。
解决方法
方案1:安装较低版本的MySQL
方案2:修改身份验证机制:
alter user 'root'@'localhost' identified by '你的密码' password expire never; alter user 'root'@'localhost' identified with mysql_native_password by '你的密码' flush privileges;
解决认证问题,在idea中启动能够成功连接数据库并读取数据如下图:
打包使用命令启动发现,任然报找不到驱动:
检查jar包中驱动已经打包进去了:
大佬又花了几分钟搞了个测试,增加了一个springboot maven打包插件的参数,如下:
再次打包使用java -jar也成功连接上了mysql数据库,同时也读出来了数据。
结论
方案二和方案三还没有进行测试后续再补充,总归还是自己对maven不够了解。至于手动上传普通java jar包到nexus无法下载,我猜可能因为下载的机制需要验证groupId、artifactId、version与jar包中的pom文件中的定义一样。也就是手动上传至少需要这个jar包本身就是一个maven工程打的包含有pom文件,但这个猜测也需要验证。
总结
一开始,使用驱动直接在项目中替换,改apollo配置尝试启动。改来改去我总觉得排查问题的干扰因素太多,那为什么不简单一点呢?我们直接写一个demo用jdbc查询一个测试表,将数据展示出来。这样就简单多了,我们关注问题本身,排除其他因素的干扰。读不到驱动,不是包没有引入,就是配置有问题,这样我们可以集中精力去做更多的尝试。如果包也引入了,配置也没问题,那再排查其他问题。我认为这种控制变量因素最小化,可以帮助我们来更快地定位到问题以及解决问题。记录一下问题排查的过程,方便以后自己和别人查阅。如果文章有错误的描述或者需要修正可以留言联系我。
遗留问题
问题虽然解决了,但还遗留两个问题。
问题1:普通工程的jar是否可以使用nexus进行管理?是否使用maven命令叫jar推到私库里方式就可以了呢?这个问题还需要验证。
问题2:是否可以使用启动命令java上-cp来加载外部jar依赖?这种方式是否能是程序读到依赖的驱动也还需要验证。
以上就是详解pom如何引入非Maven工程的jar包的详细内容,更多关于pom引入非Maven jar包的资料请关注脚本之家其它相关文章!