awk处理小问题-解决局部jar包替换

awk一个神奇而又强大的功能,绝对是一个开发利器,效率直选!希望这里的一些总结能帮到那些存在困惑的人!

awk实战1-基础语法说明

awk实战2-流程控制语句总结

awk实战3-awk数组技巧

awk实战4-函数系列-算数函数说明

awk实战5-函数系列-基本字符串函数

awk实战6-函数系列-字符串函数说明-asort和sub

awk实战7-函数系列-时间函数

awk实战8-函数系列-字节操作

awk实战9-IO函数-getline和close

awk实战10-IO函数-其他介绍

awk实战11-进阶-10种awk有效应用实战

awk实战12-进阶-再谈awk匹配模式

awk处理小问题-解决局部jar包替换

awk结合maven编译-局部jar包替换

W0 问题阐述

osgi框架的大型开源代码运行包,会包含很多bundle,这些包通过maven编译后会产生大量jar,并通过安装打包产生一个整包.

例如开源控制器opendaylight

  • 通常一个项目都含有一个或这多个feature文件,将许多bundle聚合;
  • 每个项目也会含有一个karaf目录,pom文件通过feature依赖,最终编译安装打包产生一个karaf的运行包;

但是程序内部联调纠错时候往往不需要编译整个工程产生一个运行包,这样花费额外的时间,编译局部模块替换jar包则是一个更加高效的选择;

但是传统替换jar包方式是一个纯手工劳动,需要在.m2仓库找到相关包,并人工拷贝到新的运行包位置,这个过程随机也目录层次结构深,需要花费额外的时间,本文就是想在maven局部模块编译中,通过编译信息识别修改jar,通过一键操作,自动完成jar替换;

1 需求分析

将大型工程maven编译产生的多个成功的jar包提取出来,分别替换到指定子集目录,完成编译后更新jar动作;

需求分解:

  1. 读取maven bundler编译文件,通过awk识别出需要替换的jar包,生成搜索正则表达式;
  2. 查找需要替换的jar包,找到运行软件位置,将识别jar包替换到指定的各个文件夹;
  3. 检查是否正常替换;

2 脚本原文

如下所示为本次功能实现的shell代码案例:

其中jar_path代表控制器的运行版本路径;odl_path为本地m2仓库位置;m2_build为一个文件名,存放maven编译打印信息–通常只用复制一组bundle编译过程中最后的编译结果打印即可

#!/usr/bin/env bash
odl_path=/home/user/.m2/repository/
jar_path=./opendaylight/system/
##### 1-检查参数
[ ! -f m2_build ] && echo "please input your last build message to m2_build file!" && exit -1
##### 2-读取maven输入结构,识别需要处理jar包,生成搜索正则表达式
path_regex=`cat m2_build | awk '/SUCCESS \[/{gsub("[.]+","/",$2);print ".*"$2".*1.0.0-SNAPSHOT.jar"}'`
#tocp_path=`echo $path_regex | xargs -d " " -I {} find $jar_path -type f -regex {} -printf "%s\n"`
##### 3-根据正则表达式搜索并替换jar包
echo $path_regex | xargs -d " " -I {} find $odl_path -type f -mtime -1 -regex {} -print \
    | awk -v m2path=$odl_path -v tocp=$jar_path '{jarfile=$1;gsub(m2path,"",$1);print $1}' \
    | xargs -t -I {} cp -fr $odl_path{} $jar_path{}
##### 4-检查运行位置jar包是否正常替换
echo $path_regex | xargs -d " " -I {} find $jar_path -type f -mtime -1 -regex {} -print | xargs -I{} ls -l {}


3 核心实现

3.1 检查入参

如下所示主要目的是为了检查命令行入参是否携带相关maven编译打印文件;

[ ! -f m2_build ] && echo "please input your last build message to m2_build file!" && exit -1

3.2 检索maven打印利用awk提取主要编译jar包

path_regex=`cat m2_build | awk '/SUCCESS \[/{gsub("[.]+","/",$2);print ".*"$2".*1.0.0-SNAPSHOT.jar"}'`

这里有如下要点需要提醒:

  1. 使用``号(不是单引号),运行一段命令,并将最终打印结果传给path_regex;

  2. /SUCCESS \[/这里是一个正则表达式匹配,主要为了匹配编译过程中的成功信息行;

  3. {gsub("[.]+","/",$2);print ".*"$2".*1.0.0-SNAPSHOT.jar"}

    使用gsub替换掉了匹配行第二列的字符串中所有的.变成斜杠,相当于将包名替换成了一段路径,并将处理内容前后加入’.*'以及版本号,生成了一个用于find检索的正则表达式;

3.3 使用find查找相关jar包进行拷贝

echo $path_regex | xargs -d " " -I {} find $odl_path -type f -mtime -1 -regex {} -print \
    | awk -v m2path=$odl_path -v tocp=$jar_path '{jarfile=$1;gsub(m2path,"",$1);print $1}' \
    | xargs -t -I {} cp -fr $odl_path{} $jar_path{}

这里有如下要点:

  1. 将检索表达式列表通过xargs参数化,逐个进行find处理;
  2. find在odl_path中寻找最近一天内修改/类型为文件/符合上文正则表达式的包进行打印;
  3. awk传入本地m2仓库路径和目的运行包路径,通过gsub将找到文件的绝对路径换成m2库的相对路径;
  4. 使用xargs将jar包相对路径与odl_path和jar_path结合,进行拷贝;

3.4 查看运行包路径jar是否正常替换

基本所有原理同3.3,使用ls -l查看就可以指导是否正常替换了jar包;

echo $path_regex | xargs -d " " -I {} find $jar_path -type f -mtime -1 -regex {} -print | xargs -I{} ls -l {}

5 总结及性能优化分析

本文实战脚本主要使用awk完成一些字符串模式识别和替换,这里主要包括:

  • 生成find检索正则表达式;
  • 绝对路径替换成相对路径;

在find的使用中一开始是没有加入-type f -mtime -1,而maven仓库以及karaf运行包目录一般又很大,整个过程非常的缓慢,在加入这两个选项后,则极大提高了检索效率–因为事实上该脚本运行的前提也是一些jar包在完成编译后,立即替换,达到仅编译一个或者几个模块,就能生成新的运行包的目的.

当然脚本也存在一些不足:

1-必须将maven编译信息复制到一个文件进行处理;

2-相对路径提取似乎值得优化,特别是如果jar_pathodl_path为相对路径会存在一些使用问题!

发布了88 篇原创文章 · 获赞 16 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/xinquanv1/article/details/100111885