springboot应用上线后,提示找不到本地jar包的原因

背景

有时候项目里需要使用一些没有源码的三方jar包,通过在pom里添加systemPath来指明jar包的位置,在本地调试的时候一切ok,但是同样的代码通过mvn package发到线上运行就提示依赖的jar包找不到。

原因

当引用第三方包,且没有源代码时候,可以使用systemPath

<dependency>
    <groupId>ctec</groupId>
    <artifactId>xxx-core</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/src/main/resources/libs/xxxxxx.jar</systemPath>
</dependency>

划重点!!!敲黑板!!!下面的一步配置也是最重要的一步,缺少这一步,就会导致虽然本地可以运行,但是只要使用mvn打包就不行,因为scope为system的maven默认是不打包进去的。

需要使用true

<plugins>
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
            <includeSystemScope>true</includeSystemScope>
        </configuration>
    </plugin>
</plugins>

原理讲解

pom中的scope类型

dependency的scope有五种:

  1. compile:默认值 他表示被依赖项目需要参与当前项目的编译,还有后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去

  2. test:依赖项目仅仅参与测试相关的工作,包括测试代码的编译和执行,不会被打包,例如junit

  3. runtime:表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过了编译而已。例如JDBC驱动,适用运行和测试阶段

  4. provided:打包的时候可以不用包进去,别的设施会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是打包阶段做了exclude操作

  5. system:从参与度来说,和provided相同,不过被依赖项不会从maven仓库下载,而是从本地文件系统拿。需要添加systemPath的属性来定义路径

由此可见,scope为system的依赖,maven默认是不打包进去的,这也是导致线上提示jar缺失的原因。如果需要将scope为system的依赖也打包进来,需要添加true。

常见内置变量

  • ${project.basedir} 项目根目录
  • ${project.build.directory} 构建目录,缺省为target
  • ${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes
  • ${project.build.finalName}产出物名称,缺省为${project.artifactId}-${project.version}
  • ${project.packaging} 打包类型,缺省为jar
  • ${project.xxx} 当前pom文件的任意节点的内容
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值