达内广州C++学院|c++培训|广州达内科技C++/C#培训|.NET培训|IT培训|达内广州岗顶中心 达内广州C++学院|c++培训|广州达内科技C++/C#培训|.NET培训|IT培训|达内广州岗顶中心
java程序员
 当前位置:主页 > 高端课程 > java程序员 >

通过jgit一次性升级fastjson版本

时间:2019-11-19  来源:未知  作者:广州达内培训

背景:笔者所在公司经历了三次fastjson的升级,由于集群,工程数量众多,每次升级都很麻烦。因此开发了一个java的升级工具。
功能介绍:

功能介绍:一个jar文件,通过java -jar命令,输入用户名,密码,所负责的git项目主目录,即可对所负责的本地工作区目录下的项目工程中的pom.xml文件进行检测,然后对其依赖的低版本fastjson直接升级到最新版本。
pom依赖:

 <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.61</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.eclipse.jgit</groupId>
      <artifactId>org.eclipse.jgit</artifactId>
      <version>5.1.3.201810200350-r</version>
      <optional>true</optional>
    </dependency>


    <dependency>
      <groupId>org.eclipse.jgit</groupId>
      <artifactId>org.eclipse.jgit.archive</artifactId>
      <version>4.11.0.201803080745-r</version>
    </dependency>

    <dependency>
      <groupId>com.jcraft</groupId>
      <artifactId>jsch</artifactId>
      <version>0.1.54</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>8</source>
          <target>8</target>
        </configuration>
      </plugin>

      <plugin>
        <artifactId> maven-assembly-plugin </artifactId>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <archive>
            <manifest>
              <mainClass>com.daojia.qypt.mvnpom.up.GitUtils</mainClass>
            </manifest>
          </archive>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

    </plugins>

  </build>

工具包:

package com.qy.mvnpom.up;

import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.ListBranchCommand;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.transport.CredentialsProvider;
import org.eclipse.jgit.transport.HttpConfig;
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;

import java.io.File;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * @Author fanchunshuai
 * @Date 2019/6/27 14
 * @Description:
 */
public class GitUtils {


    public static Git getGit(String uri, CredentialsProvider credentialsProvider, String localDir) throws Exception {
        Git git = null;
        if (new File(localDir).exists()) {
            git = Git.open(new File(localDir));
        } else {
            git = Git.cloneRepository().setCredentialsProvider(credentialsProvider).setURI(uri)
                    .setDirectory(new File(localDir)).call();
        }
        //设置一下post内存,否则可能会报错Error writing request body to server
        git.getRepository().getConfig().setInt(HttpConfig.HTTP, null, HttpConfig.POST_BUFFER_KEY, 512 * 1024 * 1024);
        return git;
    }

    public static CredentialsProvider getCredentialsProvider(String username, String password) {
        return new UsernamePasswordCredentialsProvider(username, password);
    }

    //切换分支
    public static void checkoutBranch(Git git, String localPath, String branchName) {
        String projectURL = localPath + "\\.git";
        try {
            git.checkout().setCreateBranch(true).setName(branchName).call();
            git.pull().call();
            System.out.println("切换分支成功");
        } catch (Exception e) {
            System.out.println("已是当前分支,不需要切换!");
        } finally {
            if (git != null) {
                git.close();
            }
        }
    }

    public static void main(String[] args) throws Exception {
        if(args.length<2){
            System.out.println("请输入git用户名&密码!");
            return;
        }
        //获取输入参数
        String username = args[0];
        String password = args[1];
        //远程项目的git用户组,如http://github.com/fanchunshuai/ 用于从远程下载切换分支代码
        String uri = args[2];

        System.out.println("用户名:"+username+",密码:*********");
        CredentialsProvider credentialsProvider = getCredentialsProvider(username, password);
        //将此工具类的jar文件放到本地所有项目的目录下,与项目代码目录平级
        String localDir = System.getProperty("user.dir");
        System.out.println("当前项目空间:"+localDir);

        File file = new File(localDir);
        Set<String> checkSet = new HashSet<>();

        for (File childFile : file.listFiles()){

            //检查当前项目空中是否有git文件

            File [] filex = childFile.listFiles();
            if(filex == null || filex.length == 0){
                continue;
            }
            boolean b = false;
            for (File file1 : filex){
                if(file1.getName().endsWith("git")){
                    b = true;
                }
            }

            if(!b){
                String url = uri+childFile.getName()+".git";
                System.out.println("url = "+url+" 不在远程git项目里,忽略");
                continue;
            }

            String url = uri+childFile.getName()+".git";
            Git git = getGit(url, credentialsProvider, childFile.getAbsolutePath());
            List<Ref> call = git.branchList().setListMode(ListBranchCommand.ListMode.ALL).call();
            int max = 0;
            String maxBranchs = "";

            //分支格式校验
            for (Ref ref : call) {
                String branchName = ref.getName();
                if (branchName.contains("-") && branchName.contains("refs/remotes/origin") && branchName.contains("_8-")) {
                    String[] branchArray = branchName.split("_");
                    if(branchArray.length < 3){
                        System.out.println(branchName+"不是标准的分支格式");
                        continue;
                    }
                    if(branchArray[2].split("-").length < 3){
                        System.out.println(branchName+"不是标准的分支格式");
                        continue;
                    }
                    String lastNumber = branchArray[2].split("-")[2];
                    if (max < Integer.parseInt(lastNumber)) {
                        max = Integer.parseInt(lastNumber);
                        maxBranchs = branchName;
                    }
                }
            }

            if(maxBranchs.equals("") || maxBranchs == null){
                maxBranchs = "refs/remotes/origin/dev/"+childFile.getName()+"_8-0-0";
            }

            String newBranch = maxBranchs.replace("refs/remotes/origin/", "");
            System.out.println("需要修复的分支是:" + newBranch);
            checkoutBranch(git, localDir, newBranch);
            for (File childFile2 : childFile.listFiles()) {
                String path;
                if (childFile2.isDirectory()) {
                    path = getPomPath(childFile2.getAbsolutePath());
                    if (path == null || path.equals("")) {
                        continue;
                    }
                } else if (childFile2.isFile() && childFile2.getName().equals("pom.xml")) {
                    path = childFile2.getAbsolutePath();
                } else {
                    continue;
                }
                List<String> lines;
                try {
                    lines = Files.readAllLines(Paths.get(path), Charset.forName("UTF-8"));
                    System.out.println("POM.xml文件格式为UTF-8........");
                }catch (Exception e){
                    lines = Files.readAllLines(Paths.get(path), Charset.forName("GBK"));
                    System.out.println("POM.xml文件格式为GBK........");
                }
                if(lines.size()<=10){
                    continue;
                }
                int i;
                StringBuilder builder = new StringBuilder();

                String newVersionLine = "";
                int newIndex = 0;
                boolean haveTo = false;
                for (i = 0; i < lines.size(); i++) {
                    String line = lines.get(i);
                    if (line.contains("groupId") && line.contains("com.alibaba")) {

                        String artifactIdLine = lines.get(i + 1);
                        builder.append(line + "\n");
                        if (artifactIdLine.contains("artifactId") && artifactIdLine.contains("fastjson")) {
                            String versionLine = lines.get(i + 2);
                            if (versionLine.contains("version")) {
                                String[] lineArry = versionLine.split("\\.");
                                //此处进行替换
                                newVersionLine = lineArry[0] + "." + lineArry[1] + ".60</version>";
                                newIndex = i + 2;
                                haveTo = true;
                            }
                        }
                    } else {
                        if (newIndex > 0 && newIndex == i) {
                            builder.append(newVersionLine + "\n");
                            newIndex = 0;
                            continue;
                        } else {
                            if (i == lines.size() - 1) {
                                builder.append(line);
                            } else {
                                builder.append(line + "\n");
                            }
                        }
                    }
                }
                if(!haveTo){
                    checkSet.add(newBranch);
                    continue;
                }

                Files.write(Paths.get(path), builder.toString().getBytes());
                git.add().addFilepattern("pom.xml").call();
                //提交
                git.commit().setMessage("update fastjson to 1.2.60 auto by qypomup.jar").call();
                //推送到远程
                //推送
                git.push().setCredentialsProvider(credentialsProvider).call();
                System.out.println("恭喜,自助升级fastjson&代码提交完成!升级分支为:"+newBranch);
            }
        }

        if(checkSet.size()>0){
            checkSet.forEach(str->{
                System.out.println("当前分支["+str+"]中的pom.xml文件中没有包含fastjson依赖,请手工检查!");
            });
        }
    }

    private static String getPomPath(String localPath) {
        File file = new File(localPath);
        File[] fileArray = file.listFiles();
        if (fileArray == null || fileArray.length == 0) {
            return "";
        }
        for (File file1 : fileArray) {
            if (file1.isDirectory()) {
                getPomPath(file1.getAbsolutePath());
            } else {
                if (file1.isFile() && file1.getName().equals("pom.xml")) {
                    return file1.getAbsolutePath();
                }
            }
        }
        return "";
    }
}

通过pom依赖和工具类构件maven jar

  1. 新建需要升级的项目工程的分支
  2. 构建升级jar包,放到项目空间目录中,与其他工程项目同级
  3. cmd打开命令行cd到项目空间目录中,执行命令
    java -jar \pomup.jar username password http://github.com/username/xxxx

说明:pomup.jar:构建的jar包名称
username,password :git的用户名,密码
http://github.com/username/xxxx:整体的git项目空间

本文由博客一文多发平台 OpenWrite 发布!
架构设计@工程设计@服务稳定性之路




上一篇:《Java多线程面试题》系列-创建线程的三种方法及
下一篇:AngularJS重型前端框架

友情链接:
  • 全球最大晶圆代工半导体制造厂,台积电斥资订购艾斯摩尔机器设备
  • 英特尔依然是那个英特尔,且看英特尔的城防体系
  • 支持双 DRAM 内存接口,慧荣企业级 SSD 主控方案披露
  • 在全球被反垄断罚款,冤!高通到底哪里得罪了欧盟?
  • 强强联合!万业、微电子所和芯鑫共同打造全新半导体设备
  • 复旦大学校长称:对于集成电路产业发展,大学应该主动担当
  • 技术再升级!无锡中科芯攻克晶圆级再布线及晶圆级凸点制备关键技
  • 聚力!万业企业设立集成电路装备集团,提供自主可控设备
  • 德州仪器C2000微控制器增强连通性和控制性
  • 英特尔打出降价策略,以免被竞争对手 AMD 打败?
  • 贸易摩擦的闹剧没有赢家,苹果有勇气离开中国吗?
  • 图像信号与视觉处理器的发展趋势
  • 真干快消品定位方案班(第二期)火热开班
  • Java集合 ArrayList原理及使用
  • TDD(测试驱动开发)死了吗?
  • JAVA基础之XML相关
  • javaweb项目搭建ehcache缓存系统
  • 每日一码——字符串统计
  • 一篇文章帮你彻底搞清楚“I/O多路复用”和“异步I/O”的前世今生
  • 九:模板方法模式
  • 十二:命令模式(人员解耦和)
  • Java 转PPT为图片、PDF、SVG、XPS、ODP以及PPT和PPTX互转
  • SpringCloud学习(SPRINGCLOUD微服务实战)一
  • 记一次微信网页授权后获取用户信息并重定向
  • 速途新营销五点实战洞察解码“品效合一”
  • 十一:外观模式详解(Service,action与dao)
  • 手把手教你学会 基于JWT的单点登录
  • mysql锁机制总结,以及优化建议
  • 解决多个版本jar包冲突【jar内包名重命名】
  • 中国首张5G终端电信设备进网许可证 华为Mate 20 X 5G版入网
  • RPC之Thrift
  • 高级Java工程师必备 ----
  • 天猫618期间实物支付GMV增长38.5%
  • 换季了,老板你的库存处理好了吗?
  • 从“618”大数据看中国消费新活力
  • 小米生态链:贵在格局感与收放度
  • CODING 2.0 企业级持续交付解决方案
  • 老铁奇趴“新京济” 快手*京东618战报出炉
  • 中小企业新媒体运营基本技能
  • 上汽大通房车再度携手LINE FRIENDS 魔都巡游顺利开启
  • 华为高端手机国内市场份额超苹果夺得榜首
  • 中国智能制造分析报告
  • iPlus艾加营销助力腾讯广告牵手吴晓波 推进商业IP变现
  • 2019世界新能源汽车大会7月1日将在海南举行
  • 区域酒企如何转型突围
  • 时时彩论坛
  • 五星体育斯诺克
  • 北单比分直播
  • 河北11选5走势图
  • 福建体彩36选7开奖结果
  • 九龙图库下载