记录瞬间

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. 6101 最优贸易 (双向spfa)

    描述C国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向通行的 ...

  2. 下面为初学者分享一下SQL 数据库学习资料

    一.基础 1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份 ...

  3. python 列表常用方法

    1.在列表末尾添加新的对象 li=[11,22,33,'aa','bb','cc'] li.append('dd') print(li) 2.清空列表 li=[11,22,33,'aa','bb',' ...

  4. NEO智能合约开发(一)不可能完成的任务

    悬赏任务 兹有如下合约 public static object Main(string method, object[] args) { if (Runtime.Trigger == Trigger ...

  5. python底层原理

    有同学问到了一个问题,python中存储变量是通过内存地址来存储,那么python又是如何去判断内存中的地址是什么数据类型的呢.经过查找,找到这篇文章: 原博客地址:http://www.cnblog ...

  6. 我的 FPGA 学习历程(05)—— 使用 Modelsim 仿真工具

    在第 3 篇中讲到了如何使用图形进行仿真激励输入,图形输入法尽管简单易学,但如若要求复杂的仿真输入激励.较长的仿真时间或是要求打印输出信息乃至输出文件日志则显得不够用了. 本篇以上一篇的 3-8 译码 ...

  7. Python数据分析基础PDF

    Python数据分析基础(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1ImzS7Sy8TLlTshxcB8RhdA 提取码:6xeu 复制这段内容后打开百度网盘手 ...

  8. Servlet.service() for servlet [jsp] in context with path [/Healthy_manager] threw exception [Unable to compile class for JSP] with root cause java.lang.IllegalArgumentException: Page directive: inval

    严重: Servlet.service() for servlet [jsp] in context with path [/Healthy_manager] threw exception [Una ...

  9. 洛谷P3835 【模板】可持久化平衡树

    题目背景 本题为题目 普通平衡树 的可持久化加强版. 数据已经经过强化 感谢@Kelin 提供的一组hack数据 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作( ...

  10. ad 线束和网络

    ad 线束和通道复用会遇到网络无法更新的pcb的异常, 就算,我们把网络作用范围调整到页,电源全局仍然会失败,通过查找原因 尽量网络标签不同.稍微更改就可以 比如  sda1,sda1s不要一样