java操作Maven
记录瞬间
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的更多相关文章
- java操作redis之jedis篇
首先来简单介绍一下jedis,其实一句话就可以概括的,就是java操作redis的一种api.我们知道redis提供了基本上所有常用编程语言的clients,大家可以到http://redis.io/ ...
- Elasticsearch笔记五之java操作es
Java操作es集群步骤1:配置集群对象信息:2:创建客户端:3:查看集群信息 1:集群名称 默认集群名为elasticsearch,如果集群名称和指定的不一致则在使用节点资源时会报错. 2:嗅探功能 ...
- java 操作elasticsearch之搭建测试项目环境
在创建项目之前请确认maven是否安装好,在此我是以环境都搭建好的情况下进行示范,现在以eclipse开发工具为例,具体操作如下: 1.创建maven项目 File - new -other 2.在p ...
- Java操作队列
Java操作队列 常见的几种模式: 1 简单队列simple 模型:(p + 队列 + c) P:生产者producer,将消息发送到队列 红色:消息队列 C:消费者consumer,从队列消费消 ...
- Java操作memcache
[本文出自天外归云的博客园] 准备工作 Java操作memcache需要spymemcache类库的支持,在Eclipse中修改maven项目的pom.xml文件—— 添加仓库: <reposi ...
- Java操作Sqoop对象
Windows下使用Eclipse工具操作Sqoop1.4.6对象 Sqoop是用来在关系型数据库与Hadoop之间进行数据的导入导出,Windows下使用Eclipse工具操作时,需要先搭建好Had ...
- JEECG(二) JEECG框架下调用webservice java springmvc maven 调用 webservice
JEECG系列教程二 如何在JEECG框架下使用webservice 本文所使用的webservice是c#开发的 其实无论是什么语言开发的webservice用法都一样 java springmvc ...
- 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 ...
- java操作redis学习(一):安装及连接
文章参考自:http://www.cnblogs.com/edisonfeng/p/3571870.html,在此基础上进行了修改. 一.下载安装Redis redis官网显示暂时不支持Windows ...
随机推荐
- PBRT笔记(3)——KD树
茎节点与叶子节点 茎节点与叶子节点皆适用KdAccelNode来表示 注意:这里使用了匿名union union有个特性:内部类型共用一段内存,且大小为内部最大类型的大小. struct KdAcce ...
- 对《将Unreal4打包后的工程嵌入到Qt或者桌面中》一文的补充
在上一文中本人尝试将Ue4嵌入到Qt中,但依然有一些问题没有去尝试解决.今天因为帮助知乎专栏作者@大钊的关系,顺便进行补完. 2018.7.18更新: 正好在参加杭州UnrealCircle的时候见到 ...
- Spark环境搭建(一)-----------HDFS分布式文件系统搭建
下载的压缩文件放在~/software/ 解压安装在~/app/ 一:分布式文件系统搭建HDFS 1,下载Hadoop HDFS环境搭建 使用版本:hadoop-2.6.0-cdh5.7. ...
- VS的Mvc项目右键没有控制器右键菜单(转)
今天遇到了一个比较少见的问题,我用vs2012打开一个从Svn上拉下来的mvc5项目,在Controller文件夹上右键却发现没有新建控制器的选项,在View文件夹上右键也没有新建视图的选项. 我的第 ...
- NOIP-金币
题目描述 国王将金币作为工资,发放给忠诚的骑士.第一天,骑士收到一枚金币:之后两天(第二天和第三天),每天收到两枚金币:之后三天(第四.五.六天),每天收到三枚金币:之后四天(第七.八.九.十天),每 ...
- Json.NET Performance Tips
原文: http://www.newtonsoft.com/json/help/html/Performance.htm To keep an application consistently fas ...
- vue菜鸟从业记:没准备好的面试,那叫尬聊
最近我的朋友王小闰参加了一场面试,在他填写简历表的时候,排在他前面的应聘者正在旁边邻桌接受来自面试官的检验. 王小闰边写边想,这不就是一会儿要面试自己的前端leader么,现在面试官提问的一些面试题会 ...
- 解析CommandMessage
Json 解析: void CommandMessage::ParseCmdBody() { try { Json::Reader reader; Json::Value root; if (!rea ...
- js图片预加载与延迟加载
图片预加载的机制原理:就是提前加载出图片来,给前端的服务器有一定的压力. 图片延迟加载的原理:为了缓解前端服务器的压力,延缓加载图片,符合条件的时候再加载图片,当然不符合的条件就不加载图片. 预加载 ...
- js基础 -函数
函数 定义 var a =function (){...}; 匿名函数方式定义function a(){} 直接定义 函数的参数arguments 可以接收任意个参数,是个像数组的内容,可for in ...