在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. MyBatis基础:MyBatis数据基本操作(2)

    1. MyBatis映射器 2. MyBatis数据基本操作 示例项目结构: <project xmlns="http://maven.apache.org/POM/4.0.0&quo ...

  2. html5 表單輸入類型

    輸入類型有:email,url,number,range,Date pickers(工作機制是什麼),search, 有相關類型的輸入域,會對域進行驗證. 不同的瀏覽器並不一定都支持所有的輸入類型.

  3. Javassist之使用字节码在运行时生成新的类 01

    介绍 Javassist是一个开源的分析.编辑和创建Java字节码的类库.是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的.它已加入了开放源代码JBoss 应用 ...

  4. Python——列表操作

    一.列表中所有元素出现的次数,并输出为字典模式 def count_list(list): b_list = {} for i in set(list): b_list[i] = list.count ...

  5. How to create DMG on macOS

    hdiutil create -srcfolder /users/test1/ -volname test1 /users/test/test1.dmg

  6. 跳转语句之continue

    js里面有两个跳转语句,一个是continue,一个是break.由于这两个跳转语句都是用于循环当中,因此他们也就只能用于while.for.do…while语句中,当然了,break多加一个swit ...

  7. 配置Web.config 元素CustomErrors

    一.customErrors 元素 属性 说明 defaultRedirect 指定出错时将浏览器定向到的默认 URL.如果未指定该属性,则显示一般性错误. 可选的属性. URL 可以是绝对的(如 w ...

  8. Windows Server2008、IIS7启用CA认证及证书制作完整过程

    1         添加活动目录证书服务 1.1          打开服务器管理器,右键点击角色,选择“添加角色”,在“添加角色向导”窗口左侧面板选择“服务器角色”,然后勾选“Active Dire ...

  9. servlet篇 之 servlet概念及其功能实现

    Servlet概念: 在JavaWeb中,把那些可以使用浏览器通过url的形式来访问的java类,叫做servlet. servlet就是java类中的一种,只不过这种java类有一个特殊的功能,就是 ...

  10. windows新增/修改/删除系统环境变量bat示例,一键配置JAVA_HOME

    setx JAVA_HOME "C:\Program Files\java\jdk1.6.0_27" /m setx classpath = ".;%JAVA_HOME% ...