maven打包命令打出的可执行的jar包和可依赖的jar包的区别

目录

 引出问题:

介绍打包插件

下面开始打包:

解压比较这两个jar包的区别:


 引出问题:

当我建了一个maven的springboot项目A写了一个工具类,我把A项目打包成jar包去给B项目用,结果 B项目报错找不到这个jar包.

百度后发现原来jar包分为可执行jar包和可被依赖的jar包

介绍打包插件

下面是我用的springboot的打包插件

    <!--springboot项目打包插件-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

 此插件的package打包命令会打出来两个jar包,

以.jar结尾的就是可执行不可被依赖的jar包 (一般几十M)

以 .original后缀的jar包把.original后缀后缀去掉,就能变成可依赖不可被执行的jar包 (一般几十KB)

细说一下这个打包插件:spring-boot-maven-plugin:

这个打包插件存在 5 个方面的功能,从插件命令就可以看出:

五个功能分别是:

  • build-info:生成项目的构建信息文件 build-info.properties
  • repackage:这个是默认 goal,在 mvnpackage 执行之后,这个命令再次打包生成可执行的 jar,同时将 mvnpackage 生成的 jar 重命名为 *.origin
  • run:这个可以用来运行 Spring Boot 应用
  • start:这个在 mvn integration-test 阶段,进行 SpringBoot 应用生命周期的管理
  • stop:这个在 mvn integration-test 阶段,进行 SpringBoot 应用生命周期的管理

这里功能,默认情况下使用就是 repackage 功能,其他功能要使用,则需要开发者显式配置。

repackage 功能的 作用,分为两步

1.第一步:首先 mvnpackage 命令 对项目进行打包,打成一个 jar,这个 jar 就是一个普通的 jar,可以被其他项目依赖,但是不可以被执行

2.第二步:通过将第一步打成的 jar重命名为 *.original 文件,得到一个只能被依赖,不能被执行的jar包.

同时进行repackage 命令,对第一步 打包成的 jar 进行再次打包,将之打成一个 可执行 但是不能被依赖的jar包 .

下面开始打包:

对任意一个 Spring Boot 项目进行打包,可以执行 mvnpackage 命令,也可以直接在 IDEA中点击 package.打包成功之后, target 中的文件如下:

解压比较这两个jar包的区别:

可执行 jar 解压之后,目录如下:

 可以看到,可执行 jar 中,我们自己的代码是存在 于 BOOT-INF/classes/ 目录下,项目中依赖的jar包是放在 BOOT-INF/lib/ 目录下,还有一个 META-INF 的目录,该目录下有一个 MANIFEST.MF 文件,打开该文件,内容如下:

可以看到,这里定义了一个 Start-Class,这就是可执行 jar 的入口类, Spring-Boot-Classes 表示我们自己代码编译后的位置, Spring-Boot-Lib 则表示项目依赖的 jar 的位置。

那么可依赖 jar 的结构呢?

我们首先给文件重命名,将默认的后缀 .original 除去,重命名完成,进行解压:

  解压后可以看到,可依赖的 jar 根目录就相当于我们的 classpath,直接就能看到我们的代码,它是没有把自身用到的jar包打进去的.它也有 META-INF/MANIFEST.MF 文件,但是文件中没有定义jar 的入口类等。

 两者不同:

0.大小不同,可运行的jar包一般是几十M,  而可依赖的jar包一般才几十KB

1.包结构不同,可执行的jar包把我们写的类都放到 BOOT-INF/classes/ 目录下了,这导致此jar包在作为依赖包时,B项目不能直接访问到com.exampleb包的工具类,这就是此包作为依赖包时报错的根本所在.

而可依赖包则把我们写的类都直接放在了最外面的目录,就是打开jar包的第一级目录上,这样B项目可以直接引用到com.exampleb包的工具类.

2.可执行的jar包把自己项目所依赖的jar包都打包放在了 BOOT-INF/lib/ 目录下.

而可依赖包并没有把自己项目所依赖的jar包打包,这导致B项目依赖的时候还要自己去下载这些依赖的包.

3. META-INF/MANIFEST.MF 文件不同.可执行的jar包中有入口类等配置,而可依赖jar包则缺少这些.

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值