文档章节

Java 实现Git拉包 maven打包项目

MrPei
 MrPei
发布于 2018/08/14 17:16
字数 1064
阅读 140
收藏 2

开发过程中遇到这样的需求,Java拉取指定代码库指定分支的代码java代码,然后有maven打包,将打包好的jar上传到文件服务器。

解决思路分三步:

1.从Git仓库下载代码文件

2.用maven打包下载好的代码文件

3.上传jar

解决方案:

1.利用eclipse提供的JGit工具包实现拉包,Java执行Windows/Linux脚本实现maven构建(Linux类似)

参考地址:https://github.com/eclipse/jgit

import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;

import java.io.File;

public class GitTest {
    public static void main(String[] arg) {
        String url = "http://git.mrpei.com/peizhouyu/HelloTest.git";
        String localPath = "D:\\project\\";
        String branchName = "master";
        String username = "peizhouyu";
        String password = "123456.";
        try {
            
            //1. 克隆代码
            Git.cloneRepository()
                    .setURI(url).setBranch(branchName)
                    .setDirectory(new File(localPath))
                    .setCredentialsProvider(new UsernamePasswordCredentialsProvider(username, password))
                    .call();

            //2.执行mvn打包 并等待命令执行完成
            String commond = "cmd /c d: && cd d:\\project && mvn clean package -Dmaven.test.skip=true";
            Process process = Runtime.getRuntime().exec(commond);
            process.waitFor();
            System.out.println("package finish");
            //3.上传文件服务 target文件夹 后缀 jar文件

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2.经过阅读JGit源码发现JGit其实也是依靠本地安装的git工具来执行代码下载,所以我们可以直接通过命令调用本地Git工具实现(Linux类似)

public class LocalTest {

    public static void main(String[] args) {
        String url = "http://git.mrpei.com/peizhouyu/HelloTest.git";
        String localPath = "D:\\project\\";
        String branchName = "master";
        String username = "peizhouyu";
        String password = "123456.";
        String newUrl = "http://peizhouyu:123456.@git.jd.com/peizhouyu/HelloTest.git";
        try {
            //0.命令拼接
            String[] result = url.split("/");
            String projectName = result[result.length - 1].split("\\.")[0];
            System.out.println(projectName);
            //1. 克隆代码
            String cloneCommand = "cmd /c d: && cd d:\\project && git clone -b " + branchName + " " + result[0] + "//" + username + ":" + password + "@"
                    + result[2] + "/" + result[3] + "/" + result[4];
            System.out.println(cloneCommand);
            Process cloneProcess = Runtime.getRuntime().exec(cloneCommand);
            cloneProcess.waitFor();
            System.out.println("clone success");
            //2.执行mvn打包 并等待命令执行完成
            //String real = "cmd /c d: && cd d:\\project && git clone -b master http://peizhouyu:123456.@git.mrpei.com/peizhouyu/HelloTest.git && cd d:\\project\\HelloTest && mvn clean package -Dmaven.test.skip=true";
            String packageCommand = "cmd /c d: && cd d:\\project\\" + projectName + " && mvn clean package -Dmaven.test.skip=true";
            System.out.println(packageCommand);
            Process process = Runtime.getRuntime().exec(packageCommand);
            process.waitFor();
            System.out.println("package finish");
            //3.上传文件服务 target文件夹 后缀 jar文件

        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}

3.利用GitLab API 通过http来下载源码包,本地解压,调用maven命令编译。

import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
import org.apache.tools.tar.TarEntry;
import org.apache.tools.tar.TarInputStream;

import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.GZIPInputStream;



public class GitApiTest {

    private final static int BUFFER = 1048576;

    public static void main(String[] args) {
        String apiUrl = "http://git.xx.com/api/v4/projects/";
        String projectId = "11111";
        String branchName = "master";
        String privateToken = "c1EssB1213232ZAvTdL";
        String path = "D:\\project\\hello.tar.gz";
        String sourceFolder = "D:\\project\\hello";

        String projectDir = null;
        String url = apiUrl + projectId + "/repository/archive";
        System.out.println(url);

        Map<String,String> map = new HashMap<String, String>();
        map.put("private_token",privateToken);
        map.put("sha",branchName);
        HttpDownUtil.download("http://git.jd.com/api/v4/projects/30186/repository/archive",map,path);

        System.out.println("下载完成 开始解压");
//            unCompressArchiveGz(path);
        //解压
        File project = new File(path);
//        decompress(project, sourceFolder);
        try {
            unTarGz(project,sourceFolder);

            System.out.println("解压完成");
            //获取解压后的文件夹名(项目文件夹名)
            File[] unZipDirectoryArray = new File(sourceFolder).listFiles();
            for (int i = 0; i < unZipDirectoryArray.length; i++){
                if (unZipDirectoryArray[i].isDirectory()){
                    projectDir = unZipDirectoryArray[i].getAbsolutePath();
                    System.out.println(projectDir);
                }
            }
            //进入项目目录执行 mvn 构建
            System.out.println("开始执行mvn构建");

            //projectDir = "D:\\project\\hello\\HelloTest-master-2c25a3cb8bd88d90838cf07eff20bc652fffbe40";
            String commond = "cmd /c d: && cd " + projectDir +" && mvn clean package -Dmaven.test.skip=true";
            //String commond = "cmd /c d: && cd d:\\project\\hello\\HelloTest-master-8d0c483bf0837bf0bc66914e9d746e1d9af6bad8 && start mvn clean package -Dmaven.test.skip=true";
                System.out.println(commond);
            Process process = Runtime.getRuntime().exec(commond);
            //读取标准输出内容 防止输出缓冲区阻塞程序执行
            String str;
            BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(process.getInputStream()));
            while ( (str = bufferedReader.readLine()) !=null) {
                System.out.println(str);
            }
            process.waitFor();
            System.out.println("package finish");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void unTarGz(File file,String outputDir) throws IOException{
        TarInputStream tarIn = null;
        try{
            tarIn = new TarInputStream(new GZIPInputStream(
                    new BufferedInputStream(new FileInputStream(file))),
                    1024 * 2);
            createDirectory(outputDir,null);//创建输出目录
            TarEntry entry = null;
            while( (entry = tarIn.getNextEntry()) != null ){
                if(entry.isDirectory()){//是目录
                    entry.getName();
                    createDirectory(outputDir,entry.getName());//创建空目录
                }else{//是文件
                    File tmpFile = new File(outputDir + "/" + entry.getName());
                    createDirectory(tmpFile.getParent() + "/",null);//创建输出目录
                    OutputStream out = null;
                    try{
                        out = new FileOutputStream(tmpFile);
                        int length = 0;

                        byte[] b = new byte[2048];

                        while((length = tarIn.read(b)) != -1){
                            out.write(b, 0, length);
                        }
                    }catch(IOException ex){
                        throw ex;
                    }finally{

                        if(out!=null)
                            out.close();
                    }
                }
            }
        }catch(IOException ex){
            throw new IOException("解压归档文件出现异常",ex);
        } finally{
            try{
                if(tarIn != null){
                    tarIn.close();
                }
            }catch(IOException ex){
                throw new IOException("关闭tarFile出现异常",ex);
            }
        }
    }
    public static void createDirectory(String outputDir,String subDir){
        File file = new File(outputDir);
        if(!(subDir == null || subDir.trim().equals(""))){//子目录不为空
            file = new File(outputDir + "/" + subDir);
        }
        if(!file.exists()){
            if(!file.getParentFile().exists())
                file.getParentFile().mkdirs();
            file.mkdirs();
        }
    }

}

生成脚本文件 会增加磁盘I/O 不推荐

© 著作权归作者所有

MrPei

MrPei

粉丝 7
博文 96
码字总数 45863
作品 0
朝阳
高级程序员
私信 提问
DevOps实践之一:基于Docker构建企业Jenkins CI平台

基于Docker构建企业Jenkins CI平台 一.什么是CI   持续集成(Continuous integration)是一种软件开发实践,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发...

学无止尽,不忘初心
03/22
0
0
jenkins+Gitlab+maven+tomcat实现自动化集成、打包、部署。

为什么需要持续集成呢? 1.因为在开发的过程中,用于阶段性地构建出产品。 这样可以更加清楚地审视产品的不足之处。 2.由于在某些情况下,例如有紧急bug的时候,研发的版本更新可能很频繁, ...

秦时明月路
2018/07/20
0
0
是什么样的骚操作让应用上线节省90%的时间

优秀的程序员 总会想着 如何把花30分钟才能解决的问题 在5分钟内就解决完 例如在应用上线这件事上 通常的做法是 1. 构建项目 在本地用maven打包 每次需要clean一次,再build一次 2. 部署包 ...

中间件小哥
2018/11/12
0
0
eclipse运行正常但是maven编译报错

mvn 3.3.9 eclipse neon jdk 1.8 项目在eclipse里面编译运行都没问题,但是单独用maven打包就报错了,eclipse关联的是外部的maven也就是我编译出错的那个maven maven编译错误如下 [ERROR] D:...

超级呆子
2016/09/21
1K
10
107.jenkins部署java项目-准备

26.9 部署java项目-创建私有仓库 26.10 部署java项目-下载zrlog源码 26.11 安装配置tomcat 26.12 部署java项目-安装maven 26.9 部署java项目-创建私有仓库 26.10 部署java项目-下载zrlog源码...

axin-linux
05/27
4
0

没有更多内容

加载失败,请刷新页面

加载更多

排序––快速排序(二)

根据排序––快速排序(一)的描述,现准备写一个快速排序的主体框架: 1、首先需要设置一个枢轴元素即setPivot(int i); 2、然后需要与枢轴元素进行比较即int comparePivot(int j); 3、最后...

FAT_mt
今天
4
0
mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
今天
9
0
golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架...

非正式解决方案
今天
6
0
前端——使用base64编码在页面嵌入图片

因为页面中插入一个图片都要写明图片的路径——相对路径或者绝对路径。而除了具体的网站图片的图片地址,如果是在自己电脑文件夹里的图片,当我们的HTML文件在别人电脑上打开的时候图片则由于...

被毒打的程序猿
今天
8
0
Flutter 系列之Dart语言概述

Dart语言与其他语言究竟有什么不同呢?在已有的编程语言经验的基础上,我们该如何快速上手呢?本篇文章从编程语言中最重要的组成部分,也就是基础语法与类型变量出发,一起来学习Dart吧 一、...

過愙
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部