开发者

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

开发者 https://www.devze.com 2023-12-22 10:17 出处:网络 作者: 暗黑腐竹
目录背景问题分析方案一方案四异常报错问题原因解决方法结论总结遗留问题背景
目录
  • 背景
  • 问题
  • 分析
  • 方案一
  • 方案四
    • 异常报错
      • 问题原因
      • 解决方法
  • 结论
    • 总结
      • 遗留问题

        背景

        系统迁移从某个公有云迁移到私有云,因为现在国内大力推行国产化,所以我们这次迁移有两个国产化的东西(这里不包括硬件)。第一个是操作系统采用了欧拉操作系统(华为爸爸出产据说已捐),第二个就是数据库采用了goldendb。

        这次记录这个问题主要是因为使用提供的goldendb的驱动连接不上数据库,启动的时候报错。这次我们使用的对方提供的gdb_mysql-connector-Java-5.1.46.28.jar这个驱动,而且是一个普通工程打成的jar包。

        maven工程打包结构中包含pom文件:

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

        而普通工程打包后,是不存在pom文件的:

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

        问题

        这个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的界面仅供参考):

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

        *注意: *最后的packaging填编程上jar

        上传是成功的,因为在仓库里是能找到对应的包和内容的(网络图片仅供参考):

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

        但是,下载的时候却是不成功的,因为每次下载下来的依赖包只有6kb:

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

        然而服务器上是975kb:

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

        那就说明普通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>myswww.devze.comql-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();
        

        工程的目录结构:

        oyaZZW

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

        异常报错

        第一次在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中启动能够成功连接数据库并读取数据如下图:

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

        打包使用命令启动发现,任然报找不到驱动:

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

        检查jar包中驱动已经打包进去了:

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

        大佬又花了几分钟搞了个测试,增加了一个springboot maven打包插件的参数,如下:

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

        再次打包使用java -jar也成功连接上了mysql数据库,同时也读出来了数据。

        结论

        方案二和方案三还没有进行测试后续再补充,总归还是自己对maven不够了解。至于手动上传普通java jar包到nexus无法下载,我猜可能因为下载的机制需要验证groupId、artifactId、version与jar包中的pom文件中的定义一样。也就是手动上传至少需要这个jar包本身就是一个maven工程打的包含有pom文件,但这个猜测也需要验证。

        总结

        一开始,使用驱动直接在项目中替换,改apollo配置尝试启动。改来改去我总觉得排查问题的干扰因素太多,那为什么不简单一点呢?我们直接写一个demo用jdbc查询一个测试表,将数据展示出来。这样就简单多了,我们关注问题本身,排除其他因素的干扰。读不到驱动php,不是包没有引入,就是配置有问题,这样我们可以集中精力去做更多的尝试。如果包也引入了,配置也没问题,那再排查其他问题。我认为这种控制变量因素最小化,可以帮助我们来更快地定位到问题以及解决问题。记录一下问题排查的过程,方便以后自己和别人查阅。如果文章有错误的描述或者需要修正可以留言联系我。

        遗留问题

        问题虽然解决了,但还遗留两个问题。

        问题1:普通工程的jar是否可以使用nexus进行管理?是否使用maven命令叫jar推到私库里方式就可以了呢?这个问题还需要验证。

        问题2:是否可以使用启动命令java上-cp来加载外部jar依赖?这种方式是否能是程序读到依赖的驱动也还需要验证。

        以上就是详解pom如何引入非Maven工程的jar包的详细内容,更多关于pom引入非Mavjavascripten jar包的资料请关注编程客栈(www.devze.com)其它相关文章!

        0

        精彩评论

        暂无评论...
        验证码 换一张
        取 消

        关注公众号