java程序调用CMD命令启动tomcat替换环境变量
出现问题:
此时不应有 Files\Java\jdk1.8.0_92\bin\java.exe""(本地未出现问题,服务器环境出现)

出现原因:
1:环境变量JAVA_HOME配置路径中的空格问题
2:系统环境变量路径首尾出现双引号 " 为多余
解决方法:
1:原路径C:\Program Files\Java\jdk1.8.0_92,需替换为C:\Progra~1\Java\jdk1.8.0_92 ;
2:将相关环境变量路径的首尾双引号 “ 去掉 ;
如:
|
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public static Map<String, String> execute(String directory,String[] cmd){ Map<String, String> result = new HashMap<>(); Process p = null; try { ProcessBuilder builder = new ProcessBuilder(cmd); File file = new File(directory) ; builder.directory(file); Map<String, String> env = builder.environment(); env.put("CATALINA_HOME", file.getParent()); env.put("CATALINA_BASE", file.getParent()); logger.info("=: -----------------------"); for(String str : env.keySet()){ if(env.get(str) != null){ env.put(str, env.get(str).replaceAll("Program Files", "PROGRA~1")); } logger.info(str+"=: "+env.get(str)); } logger.info("=: -----------------------"); String javaHome = System.getenv("JAVA_HOME"); if(StringUtils.isNotEmpty(javaHome)) { javaHome = javaHome.replace("%20", " ").replaceAll("Program Files", "PROGRA~1"); } env.put("JAVA_HOME", javaHome); //环境可能是Path 或 PATH String _Path = env.get("Path"); if(StringUtils.isNotEmpty(_Path)){ env.put("Path", _Path.replaceAll("\"", "")); } String _PATH = env.get("PATH"); if(StringUtils.isNotEmpty(_PATH)){ env.put("PATH", _PATH.replaceAll("\"", "")); } String _EXECJAVA = env.get("_EXECJAVA"); if(StringUtils.isNotEmpty(_EXECJAVA)){ env.put("_EXECJAVA", _EXECJAVA.replaceAll("\"", "")); } String _RUNJAVA = env.get("_RUNJAVA"); if(StringUtils.isNotEmpty(_RUNJAVA)){ env.put("_RUNJAVA", _RUNJAVA.replaceAll("\"", "")); } String _RUNJDB = env.get("_RUNJDB"); if(StringUtils.isNotEmpty(_RUNJDB)){ env.put("_RUNJDB", _RUNJDB.replaceAll("\"", "")); } for(String str : env.keySet()){ logger.info(str+"=: "+env.get(str)); } logger.info("正在执行命令...." + builder.directory()); p = builder.start(); logger.info("正在执行命令...."); InputStream errorStream = p.getErrorStream(); ExecutorService exec = Executors.newCachedThreadPool(); Future<String> errorSubmit = exec.submit(new WorkCallable(p, errorStream,"ERROR")); InputStream correctStream = p.getInputStream(); Future<String> correctSubmit = exec.submit(new WorkCallable(p, correctStream,"STDOUT")); logger.info("正在执行命令2...."); String errorMsg = errorSubmit.get(); String successMsg = correctSubmit.get(); logger.info(errorMsg); logger.info(successMsg); if(StringUtils.isEmpty(errorMsg)) { result.put("status", "success"); result.put("msg", successMsg); } else { result.put("status", "error"); result.put("msg", errorMsg); } p.waitFor(); exec.shutdown(); } catch (Exception e) { result.put("status", "error"); result.put("msg", e.getMessage()); logger.error("执行命令异常,请检查参数",e.getMessage()); } return result; } |
java程序调用CMD命令启动tomcat替换环境变量的更多相关文章
- Java程序执行cmd命令
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.i ...
- JAVA中调用CMD命令,并输出运行结果
package com.wzw.util; import java.io.BufferedReader; import java.io.InputStreamReader; public class ...
- C#程序调用cmd执行命令
对于C#通过程序来调用cmd命令的操作,网上有很多类似的文章,但很多都不行,竟是漫天的拷贝.我自己测试整理了一下. 代码: string str = Console.ReadLine(); Syste ...
- C#程序调用cmd执行命令(转)
C#通过程序来调用cmd命令的操作 string str = Console.ReadLine(); System.Diagnostics.Process p = new System.Diagnos ...
- c# 程序调用cmd执行命令如SVN.exe
c# 程序调用cmd执行命令如SVN.exe string str = Console.ReadLine(); System.Diagnostics.Process p = new System.Di ...
- C#程序调用CMD执行命令,将参数传递给cmd.exe
proc.StartInfo.Arguments = "/c ping 10.2.2.125"; C#程序调用CMD执行命令 将参数传递给cmd.exe的(Passing an a ...
- 通过java程序调用ant build.xml配置文件中指定的target
一.概述 通过ant实现项目的自动化部署,jar包生成,替换,tomcat关停.启动,查看项目日志: 通过java程序调用已编辑好的ant脚本build.xml配置文件中指定的target: 文中文件 ...
- Java程序调用带参数的shell脚本返回值
Java程序调用带参数的shell脚本返回值 首先来看看linux中shell变量(\(#,\)@,$0,$1,\(2)的含义解释 变量说明: - \)$ Shell本身的PID(ProcessI ...
- 如何在cmd窗口启动Tomcat
平时,一般使用tomcat/bin/startup.bat目录在windows环境启动Tomcat,或者使用IDE配置后启动. 下面来简单介绍下如果在cmd窗口直接输入命令启动Tomcat: 1.将t ...
随机推荐
- python爬虫入门(六) Scrapy框架之原理介绍
Scrapy框架 Scrapy简介 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬 ...
- Python_字符串简单加密解密
def crypt(source,key): from itertools import cycle result='' temp=cycle(key) for ch in source: resul ...
- Egg Dropping Puzzle问题的分析
首先,基本问题是这样:You are given two eggs, and access to a 100-storey building. The aim is to find out the h ...
- 什么是分布式锁及正确使用redis实现分布式锁
分布式锁 分布式锁其实可以理解为:控制分布式系统有序的去对共享资源进行操作,通过互斥来保持一致性. 举个不太恰当的例子:假设共享的资源就是一个房子,里面有各种书,分布式系统就是要进屋看书的人,分布式锁 ...
- Vue.js——60分钟组件快速入门
一.组件简介 组件系统是Vue.js其中一个重要的概念,它提供了一种抽象,让我们可以使用独立可复用的小组件来构建大型应用,任意类型的应用界面都可以抽象为一个组件树: 那么什么是组件呢?组件可以扩展HT ...
- EXCEL解析之终极方法WorkbookFactory
Selenium做自动化测试当然不能避免和Excel打交道. 由于Excel版本的关系,文件扩展名分xls和xlsx, 以往的经验都是使用HSSFWorkbook和XSSFWorkbook来分别处理. ...
- windows远程桌面到linux
centos: http://lovesoo.org/xmanager-to-connect-to-the-remote-desktop-centos.html redhat: http://ww ...
- C语言gets雨scanf函数的用法
/*1.不同点: scanf不能接受空格.制表符Tab.回车等: 而gets能够接受空格.制表符Tab和回车等: 2.相同点: 字符串接受结束后自动加'\0'. 使用scanf("%s&q ...
- SQL Server 2000安装教程图解
SQL Server 2000安装教程图解... ============= 下面网盘链接中的SQL2000数据库在Win7和Win10系统上安装都是可以正常使用的,只不过是Win10上安装的话,需要 ...
- BZOJ_3585_mex && BZOJ_3339_Rmq Problem_莫队+分块
BZOJ_3585_mex && BZOJ_3339_Rmq Problem_莫队+分块 Description 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一 ...