java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > pom引入非Maven jar包

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

作者:暗黑腐竹

系统迁移从某个公有云迁移到私有云,因为现在国内大力推行国产化,所以我们这次迁移有两个国产化的东西,第一个是操作系统采用了欧拉操作系统,第二个就是数据库采用了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包的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文