记一次线上构建jar包所遭遇的环境问题

背景:给用户部署一套数据迁移服务,因原centos构建机器故障,故只能采用在ubuntu环境、windows本地机器进行构建Jar包。

问题一:centos构建与ubuntu构建

两边是同样的jdk与maven仓库等,均采用的oracle jdk。发现用ubuntu构建的jar包无法启动。实验对比方向两个环境编译下,bean加载的顺序不一致
编译顺序
问题处代码
ubuntu编译的Jar包,执行日志里看不到regist的调用,导致get时报了空指针异常。
Java号称一次编译,到处运行。通过实验可以发现,Java的跨平台在某些地方并不完全一致。1是多线程,2是自然排序,其中多线程下不一致也是自然排序不一致导致的。而自然排序是操作系统提供的能力,不同平台顺序可能不一样,应避免使用自然排序来驱动业务流程。
关于spring业务流程中的bean依赖问题可以参考以下文章如何正确控制springboot中bean的加载顺序总结
总结一下,主要有以下方法

  1. @DependsOn @DependsOn注解可以用来控制bean的创建顺序,该注解用于声明当前bean依赖于另一个bean,所依赖的bean会被容器确保在当前bean实例化前被实例化;
  2. 参数注入 在@Bean标注的方法上,如果传入了参数,springboot会自动为这个参数在spring上下文里寻找这个类型的应用,并先初始化这个类实例;
  3. 利用bean的生命周期中的扩展点;
  4. @AutoConfigureOrder @AutoConfigureOrder 只能改变spring.factories(外部依赖)中的@Configuration顺序。

问题二 Jenkins构建与手工构建

手工构建报以下问题,Jenkins构建不会出问题
在这里插入图片描述
该问题的缘由是后台Jar作了加解密,手工构建的时候没有对Jar加密,手工打包的时候没用premain-class,用解密的方式去启动Jar包就会报以上的错误。
手工构建的包
手工构建
Jenkins自动构建会存在Premain-Class
在这里插入图片描述

在启动脚本中注释掉加密相关语句即可
在这里插入图片描述
下面简单介绍一下javaagent
Javaagent是java命令的一个参数。参数 javaagent 可以用于指定一个 jar 包,并且对该 java 包有2个要求:

  1. 这个 jar 包的 MANIFEST.MF 文件必须指定 Premain-Class 项。
  2. Premain-Class 指定的那个类必须实现 premain() 方法。

premain 方法,从字面上理解,就是运行在 main 函数之前的的类。当Java 虚拟机启动时,在执行 main 函数之前,JVM 会先运行-javaagent所指定 jar 包内 Premain-Class 这个类的 premain 方法 。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值