解决Maven重复依赖问题(同一个jar包,多个版本)maven同一依赖多版本共存 maven处理mysql-connector-java多版本问题 解决无法将“mvn”项识别为xxx jarjar

导读:本篇文章讲解 解决Maven重复依赖问题(同一个jar包,多个版本)maven同一依赖多版本共存 maven处理mysql-connector-java多版本问题 解决无法将“mvn”项识别为xxx jarjar,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

问题

今天有个项目,该项目之前依赖的是mysql-connector-java-5.1.24.jar的jar包,现在需要升级为mysql-connector-java-8.0.29.jar,而且,项目中还要保留5.1.24的版本。

当进行如下配置maven:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.24</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.29</version>
</dependency>

源代码如下:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * @author zs
 * @datetime 2022/8/3 15:49
 * @desc
 */
public class Test {
  private static String jdbc = "com.mysql.jdbc.Driver";
  private static String url =
      "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false";
  private static String username = "root";
  private static String password = "123456";

  private static Connection connection = null;

  public static void main(String[] args) {
    try {
      Class.forName(jdbc);
      connection = DriverManager.getConnection(url, username, password);
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    } catch (SQLException e) {
      e.printStackTrace();
    }
  }
}

在测试启动项目时,报出如下错误:

Loading class com.mysql.jdbc.Driver'. This is deprecated. The new driver class is 'com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.

翻译成中文便是:

Loading class com.mysql.jdbc.Driver'.这已被弃用。新的驱动程序类是'com.mysql.cj.jdbc.Driver'。驱动程序通过SPI自动注册,通常不需要手动加载驱动程序类。

分析问题

mysql-connector-java-8.0.29版本中,已经弃用了com.mysql.jdbc.Driver了,而mysql-connector-java-5.1.24版本支持com.mysql.jdbc.Driver来加载jdbc的驱动。

我们目前的项目中,既要用mysql-connector-java-8.0.29,也要用mysql-connector-java-5.1.24,那怎么处理呢?

解决方案

下载jarjar-1.4.jar

使用jarjar对依赖mysql-connector-java-8.0.29的jar包修改包名。

首先是jarjar工具的下载,因为官网的下载不支持jdk1.8,因而,我们需要到这个网站去下载:https://wwa.lanzoui.com/i77tLuset4f

为了避免这个网站到时无法使用,可以访问的我的微云去下载:https://share.weiyun.com/dMjXFRe8 密码:uhq7u8

在这里插入图片描述

使用方式

创建lib目录

我们需要在src的同级目录下,新建一个lib文件夹,如下图所示:

在这里插入图片描述

把下载的jarjar-1.4.jar包放在lib目录下,同时把要修改的mysql-connector-java-8.0.29.jar也放在lib目录

创建rule.txt

lib目录下新建rule.txt,写上rule com.mysql.** com.mysql.demo.@1,这个是改命规则,即把com.mysql.**的全改成com.mysql.demo.**,其中的@1代表匹配第一个*或者**,如果后面还有,就使用@2、@3……

在这里插入图片描述

修改jar包名称

校验能否读取包名

注意:如果在idea编辑器中直接使用如下命令,可能会导致乱码。

因而,cd 进入到lib目录,执行如下命令

java -jar .\jarjar-1.4.jar strings .\mysql-connector-java-8.0.29.jar

查看是否可以正确读取包名,如下图是可以正确读取的:

解决Maven重复依赖问题(同一个jar包,多个版本)maven同一依赖多版本共存 maven处理mysql-connector-java多版本问题 解决无法将“mvn”项识别为xxx jarjar

修改包名

执行如下命令:

java -jar .\jarjar-1.4.jar process .\rule.txt .\mysql-connector-java-8.0.29.jar mysql-connector-java-demo-8.0.29.jar

rule.txt的规则修改mysql-connector-java-8.0.29.jar,生成的文件名为mysql-connector-java-demo-8.0.29.jar,新文件名随意。

执行完上诉命令之后,可以在lib目录下,看到mysql-connector-java-demo-8.0.29.jar这个jar包,如下图所示:

在这里插入图片描述

使用修改后的jar包

把新打的mysql-connector-java-demo-8.0.29.jar包,作为第三方依赖添加到项目里面。

以下是两种方式在maven项目中引入第三方依赖,以及让其打包的配置方式。

第1种方式引入依赖

  1. 在src的同级目录创建一个lib的文件夹,放入mysql-connector-java-demo-8.0.29.jar包然后引用
<dependency>
    <!--自定义(随便填)-->
    <groupId>com.apache</groupId>
    <!--自定义(随便填,但需确保不重复)-->
    <artifactId>poi</artifactId>
    <!--自定义(随便填)-->
    <version>4.1.2</version>
    <!--system,类似provided,需要显式提供依赖的jar以后,Maven就不会在Repository中查找它-->
    <scope>system</scope>
    <!--项目根目录下的lib文件夹下-->
    <systemPath>${basedir}/lib/mysql-connector-java-demo-8.0.29.jar</systemPath>
</dependency>
  1. 这种方式需要对打包进行配置:
<build>
    <!--    第三方包打包    -->
    <resources>
        <resource>
            <directory>lib</directory>
            <targetPath>/BOOT-INF/lib/</targetPath>
            <includes>
                <include>**/*.jar</include>
            </includes>
        </resource>
    </resources>
</build>

第2种方式引入依赖

  1. 执行如下命令把jar包安装到本地仓库:
mvn install:install-file -Dfile=mysql-connector-java-demo-8.0.29.jar -DgroupId=com.apache -DartifactId=mysqldemo -Dversion=8.0.29 -Dpackaging=jar

但这种方式,可能会报出如下错误:

在这里插入图片描述

这个错误提示你可能没有安装maven,你需要去安装maven或者正确配置maven。

  1. 在pom文件中直接引用:
<dependency>
    <groupId>com.apache</groupId>
    <artifactId>mysqldemo </artifactId>
    <version>8.0.29</version>
</dependency>

测试

配置文件

<!--配置8.0.29版本的mysql-connector-java-->
<dependency>
    <!--自定义(随便填)-->
    <groupId>com.apache</groupId>
    <!--自定义(随便填,但需确保不重复)-->
    <artifactId>poi</artifactId>
    <!--自定义(随便填)-->
    <version>4.1.2</version>
    <!--system,类似provided,需要显式提供依赖的jar以后,Maven就不会在Repository中查找它-->
    <scope>system</scope>
    <!--项目根目录下的lib文件夹下-->
    <systemPath>${basedir}/lib/mysql-connector-java-demo-8.0.29.jar</systemPath>
</dependency>

<!--配置5.1.24版本的mysql-connector-java-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.24</version>
</dependency>

测试代码

/**
 * @author zs
 * @datetime 2022/8/3 15:49
 * @desc
 */
public class Test {
  private static String jdbc = "com.mysql.jdbc.Driver";
  private static String jdbc8 = "com.mysql.cj.jdbc.Driver";

  public static void main(String[] args) {
    try {
      Class<?> aClass = Class.forName(jdbc);
      String name = aClass.getName();
      System.out.println("jdbc5.1.24. ->" + name);

      Class<?> aClass1 = Class.forName(jdbc8);
      String name1 = aClass1.getName();
      System.out.println("jdbc8.0.29 ->" + name1);
      System.out.println("能够正常加载驱动");
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    }
  }
}

效果展示如下图:

在这里插入图片描述

两个jar包同时使用没有出现任何问题,说明这种修改方式是正确的的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/99192.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!