详解pom如何引入非Maven工程的jar包

 更新时间:2023年12月20日 10:54:30   作者:暗黑腐竹  
系统迁移从某个公有云迁移到私有云,因为现在国内大力推行国产化,所以我们这次迁移有两个国产化的东西,第一个是操作系统采用了欧拉操作系统,第二个就是数据库采用了goldendb,本文给大家详细介绍了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包的资料请关注脚本之家其它相关文章!

相关文章

  • TK-MyBatis 分页查询的具体使用

    TK-MyBatis 分页查询的具体使用

    分页查询在很多地方都可以使用到,本文就详细的介绍了一下TK-MyBatis 分页查询的具体使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • springboot jpaRepository为何一定要对Entity序列化

    springboot jpaRepository为何一定要对Entity序列化

    这篇文章主要介绍了springboot jpaRepository为何一定要对Entity序列化,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • MyBatis Generator ORM层面的代码自动生成器(推荐)

    MyBatis Generator ORM层面的代码自动生成器(推荐)

    Mybatis Generator是一个专门为 MyBatis和 ibatis框架使用者提供的代码生成器,也可以快速的根据数据表生成对应的pojo类、Mapper接口、Mapper文件,甚至生成QBC风格的查询对象,这篇文章主要介绍了MyBatis Generator ORM层面的代码自动生成器,需要的朋友可以参考下
    2023-01-01
  • springboot如何通过@PropertySource加载自定义yml文件

    springboot如何通过@PropertySource加载自定义yml文件

    这篇文章主要介绍了springboot如何通过@PropertySource加载自定义yml文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java并发编程示例(六):等待线程执行终止

    Java并发编程示例(六):等待线程执行终止

    这篇文章主要介绍了Java并发编程示例(六):等待线程执行终止,在本节,示例程序演示等待初始化方法完成后,再去执行其他任务,需要的朋友可以参考下
    2014-12-12
  • Java Web程序实现返回JSON字符串的方法总结

    Java Web程序实现返回JSON字符串的方法总结

    Java Web服务器端只要把Java对象数据转成JSON字符串,把JSON字符串以文本的形式通过response输出即可,
    2016-05-05
  • nacos使用外部数据库部署到k8s实践

    nacos使用外部数据库部署到k8s实践

    Nacos 是一个用于发现、配置和管理微服务的平台,提供了一系列简单易用的特性,帮助快速实现动态服务发现、服务配置、服务元数据及流量管理,通过简单的安装和部署,可以快速构建、交付和管理微服务平台
    2026-02-02
  • 基于SpringBoot实现Web应用的登录与退出功能

    基于SpringBoot实现Web应用的登录与退出功能

    登录与退出功能作为 Web 应用中的基础且重要的组成部分,直接关系到用户的安全和隐私保护,所以本文给大家介绍了基于SpringBoot实现Web应用的登录与退出功能,文中有详细的代码供大家参考,需要的朋友可以参考下
    2024-04-04
  • 关于ZooKeeper原理剖析

    关于ZooKeeper原理剖析

    ZooKeeper是一种分布式、高可用性的协调服务,主要用于帮助系统避免单点故障和建立可靠的应用程序,它通过Leader、Follower和Observer的角色来协调节点,并提供分布式协作服务和维护配置信息,ZooKeeper在HDFS、YARN、HBase、SmallFS和Kafka等大数据产品中都有广泛的应用
    2025-02-02
  • Mybatis useGeneratedKeys参数用法及问题小结

    Mybatis useGeneratedKeys参数用法及问题小结

    这篇文章主要介绍了Mybatis useGeneratedKeys参数用法及遇到的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05

最新评论