记录瞬间

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; /**
* @author
* @version MavenUtil,
*/
public class MavenUtil {
private static final Logger LOGGER = LoggerFactory.getLogger(MavenUtil.class);
private final String WEB_INF_PATH = "./";//MavenUtil.class.getClassLoader().getResource("../").getPath();
private final String COMPILE_PATH = WEB_INF_PATH + "sourceCode/";
private final String EMBEDDED_MAVEN_PATH = WEB_INF_PATH + "maven/";
private final List<String> fileList = new ArrayList<String>(); public void maven(String path) {
List<String> getPoms = findPomFile(path);
boolean flag = isJacoco(getPoms);
List<String> fileList = getModuleList(getPoms);
for (String pom: fileList) {
ProcessBuilder pb = new ProcessBuilder();
//构建命令
if (System.getProperty("os.name").contains("Windows")) {
if (flag) {
pb.command("cmd", "/c", "mvn", "clean", "test", "compile", "-f", pom);
} else {
pb.command("cmd", "/c", "mvn", "-DskipTests=true", "clean", "compile", "-f",
pom);
} } else if (System.getProperty("os.name").contains("Linux")) {
if (flag) {
pb.command("mvn", "clean", "test", "compile", "-f", pom);
} else {
pb.command("mvn", "-DskipTests=true", "clean", "compile", "-f", pom);
}
} else {
LOGGER.info("Unknown System..." + System.getProperty("os.name"));
}
try {
//执行命令
Process process = pb.start();
InputStream inputStream = process.getInputStream();
byte[] buffer = new byte[1024];
int readSize;
while ((readSize = inputStream.read(buffer)) > 0) {
System.out.write(buffer, 0, readSize);
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
} /**
* 查找所有pom文件
* @param path
* @return
*/
private List<String> findPomFile(String path){
File file = new File(path); if (file.exists()) {
File[] files = file.listFiles();
if (null == files || files.length == 0) {
System.out.println("文件夹是空的!");
return fileList;
} else {
for (File file2 : files) {
if (file2.isDirectory() && ! file2.getName().contains(".git")
&& ! file2.getName().contains("src")) {
// 此处是文件夹
findPomFile(file2.getAbsolutePath());
} else {
if (file2.getName().contains("pom.xml")) {
fileList.add(file2.getAbsolutePath());
System.out.println("文件:" + file2.getAbsolutePath());
}
}
}
}
} else {
System.out.println("文件不存在!");
}
return fileList;
} /**
* 判断是否存在多模块,如果存在将会去除存在模块的pom文件
* @param fromPoms
* @return
*/
private List<String> getModuleList(List<String> fromPoms) {
int count = fromPoms.size();
for (String getPom: fromPoms) {
final SAXReader reader = new SAXReader();
Document document = null;
try {
document = reader.read(getPom);
final List modules = document.getRootElement().element("modules").elements();
if (modules != null) {
for (final Object module : modules) {
final String moduleName = ((Element) module).getText();
Iterator<String> iterator = fromPoms.iterator();
while (iterator.hasNext()) {
String pom = iterator.next();
if (pom.contains(moduleName)) {
iterator.remove();
count--;
}
}
}
}
if (count <= 1){
break;
}
} catch (final DocumentException e) {
e.printStackTrace();
} catch (NullPointerException e) {
System.out.print(getPom);
}
}
return fromPoms;
} /**
* 读取文件,判断读取的行中是否存在jacoco字符串
* @param poms
* @return
*/
private boolean isJacoco(List<String> poms){
boolean flag = false;
BufferedReader reader = null;
try {
for (String getPom: poms){
File pomFile = new File(getPom);
reader = new BufferedReader(new FileReader(pomFile));
String tempString = null;
while ((tempString = reader.readLine()) != null) {
if (tempString.contains("org.jacoco")) {
flag = true;
break;
}
}
reader.close();
if (flag) { break; }
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
}
}
}
return flag;
}
/**
* 修改权限(这里粗犷的修改为777,如有精细化的权限控制,自己调整一下)
* 因为一些原因,虽然线上默认的执行用户是root,并且权限为rwx,依然会报权限不足的错误
* 如果有大神指导原因请指点一二
* @throws Exception
*/
public void afterPropertiesSet() throws Exception {
//修改maven目录权限
Process chmodMaven = new ProcessBuilder("chmod", "-R", "777", EMBEDDED_MAVEN_PATH).start();
//等待完成
chmodMaven.waitFor();
LOGGER.info("修改权限完成:{}", EMBEDDED_MAVEN_PATH); //修改编译目录权限
Process chmodCompile = new ProcessBuilder("chmod", "-R", "777", COMPILE_PATH).start();
chmodCompile.waitFor();
LOGGER.info("修改权限完成:{}", COMPILE_PATH);
}
    /**
* 递归查找文件
* @param baseDirName 查找的文件夹路径
* @param targetFileName 需要查找的文件名
* @param fileList 查找到的文件集合
*/
public static void findFiles(String baseDirName, String targetFileName, List<File> fileList) { File baseDir = new File(baseDirName); // 创建一个File对象
if (!baseDir.exists() || !baseDir.isDirectory()) { // 判断目录是否存在
System.out.println("文件查找失败:" + baseDirName + "不是一个目录!");
}
String tempName = null; File tempFile;
File[] files = baseDir.listFiles();
if ( files.length == 0 ) {//该文件夹下没有文件,为空文件夹
System.out.println("为空文件夹");
}
for (int i = 0; i < files.length; i++) {
tempFile = files[i];
if ( tempFile.isDirectory() ) {
findFiles(tempFile.getAbsolutePath(), targetFileName, fileList);
} else if ( tempFile.isFile() ) {
tempName = tempFile.getName();
if ( tempName.equals(targetFileName) ) {
System.out.println(tempFile.getAbsoluteFile().toString());
fileList.add(tempFile.getAbsoluteFile());
}
}
}
}
}

主要实现了,对maven项目的编译操作。区分了Windows和Linux两个下同的不同操作。

可以考虑不去读取pom文件,而是直接到target目录下遍历带exec的文件,

这样操作可以直接定位到指定的模块,使得覆盖率信息圈定在摸一个具体模块下。

===============================

java操作Maven的更多相关文章

  1. java操作redis之jedis篇

    首先来简单介绍一下jedis,其实一句话就可以概括的,就是java操作redis的一种api.我们知道redis提供了基本上所有常用编程语言的clients,大家可以到http://redis.io/ ...

  2. Elasticsearch笔记五之java操作es

    Java操作es集群步骤1:配置集群对象信息:2:创建客户端:3:查看集群信息 1:集群名称 默认集群名为elasticsearch,如果集群名称和指定的不一致则在使用节点资源时会报错. 2:嗅探功能 ...

  3. java 操作elasticsearch之搭建测试项目环境

    在创建项目之前请确认maven是否安装好,在此我是以环境都搭建好的情况下进行示范,现在以eclipse开发工具为例,具体操作如下: 1.创建maven项目 File - new -other 2.在p ...

  4. Java操作队列

    Java操作队列 常见的几种模式:   1 简单队列simple 模型:(p + 队列 + c) P:生产者producer,将消息发送到队列 红色:消息队列 C:消费者consumer,从队列消费消 ...

  5. Java操作memcache

    [本文出自天外归云的博客园] 准备工作 Java操作memcache需要spymemcache类库的支持,在Eclipse中修改maven项目的pom.xml文件—— 添加仓库: <reposi ...

  6. Java操作Sqoop对象

    Windows下使用Eclipse工具操作Sqoop1.4.6对象 Sqoop是用来在关系型数据库与Hadoop之间进行数据的导入导出,Windows下使用Eclipse工具操作时,需要先搭建好Had ...

  7. JEECG(二) JEECG框架下调用webservice java springmvc maven 调用 webservice

    JEECG系列教程二 如何在JEECG框架下使用webservice 本文所使用的webservice是c#开发的 其实无论是什么语言开发的webservice用法都一样 java springmvc ...

  8. spark集群配置以及java操作spark小demo

    spark 安装 配置 使用java来操作spark spark 安装 tar -zxvf spark-2.4.0-bin-hadoop2.7.tgz rm spark-2.4.0-bin-hadoo ...

  9. java操作redis学习(一):安装及连接

    文章参考自:http://www.cnblogs.com/edisonfeng/p/3571870.html,在此基础上进行了修改. 一.下载安装Redis redis官网显示暂时不支持Windows ...

随机推荐

  1. java实现哈夫曼编码

    java实现哈夫曼编码 哈夫曼树   既然是学习哈夫曼编码,我们首先需要知道什么是哈夫曼树:给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫 ...

  2. webpack配置css相关loader注意先后顺序

    一.问题描述 在webpack3中,引入animate.css失败. 二.问题分析 1.难道是入口main.js引用方式不对? import animate from 'animate.css' 2. ...

  3. 4 Values whose Sum is 0 [POJ2785] [折半搜索]

    题意 给你长度为n四个数列,每个数列选一个数使总和为4,有多少种选法(不同选法仅当起码有一个元素的下标不同) 输入 第一行,n 下面n行,每行四个数,代表ai,bi,ci,di 输出 选法数量 样例输 ...

  4. return的作用

    (1)终止函数的执行. (2)返回到调用的地方. (3)返回值.

  5. srand rand

    #include <stdlib.h> srand( (time(0)); rand()%100;

  6. JS功能函数

    1.整数每三位增加一个, function toThousands(num) {      return (num || 0).toString().replace(/(\d)(?=(?:\d{3}) ...

  7. GMA Round 1 数列与方程

    传送门 数列与方程 首项为1,各项均大于0的数列{$a_n$}的前n项和$S_n$满足对于任意正整数n:$S_{n+1}^2-2*S_{n+1}*S_{n}-\sqrt{2}*S_n-1=0$,求$a ...

  8. ACM常用STL

    转载于https://blog.csdn.net/riba2534/article/details/61929000 1.  stack stack<int>st;//栈st,用于存放in ...

  9. webpack打包 基础

    001.什么是webpack? 作用有哪些? WebPack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,Ty ...

  10. 获取APP应用的包名信息

    语言: python 3.7 需求:获取APP的包名和程序入口信息,以便在 Appium 脚本中配置 appPackage 和 appActivity 参数. 场景一 资源:已有APP应用的apk安装 ...