首页 > 技术文章 > java 学习:在java中启动其他应用,由jenkins想到的

zhizhiyin 2018-06-05 18:05 原文

在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结束的时候,销毁服务或者关闭服务,就可以了。

 

    

 

推荐阅读