在jenkins的实践中遇到了一个问题:

  我的项目依赖其他第三方应用的地方比较多,而且会占用多个端口,如何处理端口和启动/关闭第三方应用成了难题。

  初级解决方案:在服务端上面写一堆bat文件,,,,_(:з)∠)_ 而且我已经写好了,准备手动启动bat,然后再跑jenkins

  升级解决方案:和张辉聊了一下,本意是说可不可以用jenkins去启动这一堆,不用我手动再启动bat

  最终解决方案:张辉推荐,在项目代码中直接启动/关闭第三方应用

怎么实现是个大问题。。。。

目的:初始化时启动,结束时关闭:klov,mongoD,appium;

  klov和mongoD用bat就可以开启服务,比较纠结的是appium,我用的appium-desktop,手动的话还需要点击开启。这里的思路是下载命令行启动的版本。

步骤:

    1.安装appium命令行版本:

npm --registry http://registry.npm.taobao.org install appium -g

    参考 https://www.cnblogs.com/mapu/p/8666239.html

      https://www.cnblogs.com/iTlijun/p/8193588.html

      如果安装时提示2.0,4.0msbuild版本不对的问题,就去微软官网下载visulStudio2017社区的版本,安装其中的组件-windows8.1 和windows10.

    2.cmd中输入 appium启动服务

appium

    3.编写启动三个应用的bat文件 all.bat

@echo off
@echo start mongod
start /d "C:\Program Files\MongoDB\Server\3.4\bin" mongod.exe
::@echo start jenkins
::d:
::cd D:\jenkins
::java -jar jenkins.war
@echo start klov
cd D:\testng\klov-0.1.1
java -jar klov-0.1.1.jar
@echo start appium
appium
exit

    4.用java代码来调用这个bat文件

package com.test;

import java.io.IOException;
import java.io.InputStream;
import java.sql.PseudoColumnUsage; public class StartBat {
public static void main(String[] args) {
String cmd="cmd /c start C:\\Users\\user\\Desktop\\all.bat";
run_cmd(cmd);
}
public static void run_cmd(String cmd){
Runtime runtime = Runtime.getRuntime();
Process process = null;
try{
process=runtime.exec(cmd);
//输出cmd的内容
InputStream inputStream = process.getInputStream();
int c ;
while((c=inputStream.read())!=-1){
System.out.println(c);
}
inputStream.close();
process.waitFor();
}catch(IOException e){
e.printStackTrace();
}catch (InterruptedException e) {
e.printStackTrace();
}
int i = process.exitValue();
if(i==0){
System.out.println("执行完成");
}else{
System.out.println("执行失败");
} process.destroy();
process=null;
new StartBat().killProcess();
}
public void killProcess(){
Runtime rt=Runtime.getRuntime();
Process process =null;
try {
rt.exec("cmd.exe /C start wmic process where name = 'cmc.exe' call terminate");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }

     5.基本想要的功能已经实现,然后在程序体初始化的时候,开启服务,test结束的时候,销毁服务或者关闭服务,就可以了。

    

java 学习:在java中启动其他应用,由jenkins想到的的更多相关文章

  1. Java学习-045-目录中文件拷贝

    挺晚的了,直接上码.敬请各位小主参阅,若有不足之处,敬请指正,非常感谢! 目录文件拷贝源码: /** * <strong>目录拷贝</strong><br> * & ...

  2. Java学习之InputStream中read()与read(byte[] b)

    Java学习之InputStream中read()与read(byte[] b) 这两个方法在抽象类InputStream中都是作为抽象方法存在的, JDK API中是这样描述两者的: read() ...

  3. [java学习笔记]java语言核心----面向对象之this关键字

    一.this关键字 体现:当成员变量和函数的局部变量重名时,可以使用this关键字来区别:在构造函数中调用其它构造函数 原理:         代表的是当前对象.         this就是所在函数 ...

  4. [java学习笔记]java语言核心----面向对象之构造函数

    1.构造函数概念 特点: 函数名与类名相同 不用定义返回值类型 没有具体的返回值 作用:                给对象进行初始化 注意: 默认构造函数 多个构造函数是以重载出现的 一个类中如果 ...

  5. [ Java学习基础 ] Java构造函数

    构造方法是类中特殊方法,用来初始化类的实例变量,它在创建对象(new运算符)之后自动调用. Java构造方法的特点如下: 构造方法名必须与类名相同. 构造方法没有任何返回值,包括void. 构造方法只 ...

  6. [ Java学习基础 ] Java的继承与多态

    看到自己写的东西(4.22的随笔[ Java学习基础 ] Java构造函数)第一次达到阅读100+的成就还是挺欣慰的,感谢大家的支持!希望以后能继续和大家共同学习,共同努力,一起进步!共勉! ---- ...

  7. [ Java学习基础 ] Java的抽象类与接口

    一.抽象类 1. 抽象类 Java语言提供了两种类:一种是具体类:另一种是抽象子类. 2. 抽象类概念: 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的 ...

  8. java学习笔记-继承中super关键字

    背景: 在java继承的概念中我们得知,被声明为私有的类成员对所属的类来说仍然是私有的.类之外的任何代码都不能访问,包括子类. super关键字的两种用法: 1.用于调用超类的构造函数: 2.用于访问 ...

  9. Java学习笔记-Java中的常用类

    Java中有很多类是很常用的,此处列举System,Runtime,Date,Calendar,Math System System:类中的方法和属性都是静态的 字段摘要 static PrintSt ...

  10. Java学习之Java中常用对象

    java的几种对象(PO,VO,DAO,BO,POJO)解释     一.PO:persistant object 持久对象,可以看成是与数据库中的表相映射的java对象.最简单的PO就是对应数据库中 ...

随机推荐

  1. python设计模式第九天【策略模式】

    1. 定义 对一系列算法进行封装,为所有算法定义一个抽象的算法接口,可以平滑的进行算法切换 2. 策略模式的UML图 3.代码实现 #!/usr/bin/env python #! _*_ codin ...

  2. 文件上传.ashx

    using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Runtime ...

  3. 打包一个UWP APP

    Before packaging your app Test your app. Before you package your app for store submission, make sure ...

  4. hdu-3068(最长回文子串-manacher)

    题意:求一个字符串#include<iostream>#include<algorithm>#include<cstring>using namespace std ...

  5. ffmpeg 转码命令与ffplay

    ffmpeg.exe用于视频的转码. ▫ 最简单的命令 ffmpeg -i input.avi -b:v 640k output.ts 该命令将当前文件夹下的input.avi文件转换为output. ...

  6. IntelliJ IDEA通过Tomcat启动项目过程分析

    Tomcat部署项目的多种方式 Tomcat安装目录:${TOMCAT_HOME} 1.常规的webapps下直接部署到${TOMCAT_HOME}/webapps下 2.利用控制台进行部署 3.外部 ...

  7. LOJ6433 [PKUSC2018] 最大前缀和 【状压DP】

    题目分析: 容易想到若集合$S$为前缀时,$S$外的所有元素的排列的前缀是小于$0$的,DP可以做到,令排列前缀个数小于0的是g[S]. 令f[S]表示$S$是前缀,转移可以通过在前面插入元素完成. ...

  8. 洛谷P2512 糖果传递

    环形均分纸牌 普通的均分纸牌前缀和的总和就是答案. 但是这里是环形的,要断开的位置需要最佳,我们把每个数减去sum/n,这样总的前缀和就为0了,若在第k个数之后把环断开,环形前缀和可以统一写成s[i] ...

  9. 【XSY2703】置换 数学 置换 DP

    题目描述 对于置换\(p\),定义\(f(p)\)为最小的正整数\(k\),使得\(p^k\)为恒等置换. 你需要求对于所有的\(n\)元素置换\(p\),\(f^2(p)\)的平均值. \(n\le ...

  10. django 配置邮件发送 send_email

    导入 send_email 所用方法导入 from django.core.mail import send_mail 因为使用的需要指明 发送人 所以要把 setting.py 中的 EMAIL_F ...