出现问题:

  此时不应有 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替换环境变量的更多相关文章

  1. Java程序执行cmd命令

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.i ...

  2. JAVA中调用CMD命令,并输出运行结果

    package com.wzw.util; import java.io.BufferedReader; import java.io.InputStreamReader; public class ...

  3. C#程序调用cmd执行命令

    对于C#通过程序来调用cmd命令的操作,网上有很多类似的文章,但很多都不行,竟是漫天的拷贝.我自己测试整理了一下. 代码: string str = Console.ReadLine(); Syste ...

  4. C#程序调用cmd执行命令(转)

    C#通过程序来调用cmd命令的操作 string str = Console.ReadLine(); System.Diagnostics.Process p = new System.Diagnos ...

  5. c# 程序调用cmd执行命令如SVN.exe

    c# 程序调用cmd执行命令如SVN.exe string str = Console.ReadLine(); System.Diagnostics.Process p = new System.Di ...

  6. C#程序调用CMD执行命令,将参数传递给cmd.exe

    proc.StartInfo.Arguments = "/c ping 10.2.2.125"; C#程序调用CMD执行命令 将参数传递给cmd.exe的(Passing an a ...

  7. 通过java程序调用ant build.xml配置文件中指定的target

    一.概述 通过ant实现项目的自动化部署,jar包生成,替换,tomcat关停.启动,查看项目日志: 通过java程序调用已编辑好的ant脚本build.xml配置文件中指定的target: 文中文件 ...

  8. Java程序调用带参数的shell脚本返回值

    Java程序调用带参数的shell脚本返回值 首先来看看linux中shell变量(\(#,\)@,$0,$1,\(2)的含义解释 变量说明: -  \)$  Shell本身的PID(ProcessI ...

  9. 如何在cmd窗口启动Tomcat

    平时,一般使用tomcat/bin/startup.bat目录在windows环境启动Tomcat,或者使用IDE配置后启动. 下面来简单介绍下如果在cmd窗口直接输入命令启动Tomcat: 1.将t ...

随机推荐

  1. QT中的相对位置,绝对位置之间的转换(maptoglobal,mapfromglobal)

    1. 相对位置:每个Qwidget都能通过pos()获取到相对自己父类窗口的位置, 2. 绝对位置:pWidget->mapToGlobal(QPoint(0,0)) ;将当前控件的相对位置转换 ...

  2. 字符流Reader和Writer

    1.Rader是字符输入流的父类. 2.Writer是字符输出流的父类. 3.字符流是以字符(char)为单位读取数据的,一次处理一个unicod. 4.字符类的底层仍然是基本的字节流. 5.Read ...

  3. PAT1130:Infix Expression

    1130. Infix Expression (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Give ...

  4. new/delete和malloc/free的比较

    从C++角度上说,使用new分配堆空间可以调用类的构造函数,而malloc()函数仅仅是一个函数调用,它不会调用构造函数,它所接受的参数是一个unsigned long类型.同样,delete在释放堆 ...

  5. Hibernate中的常用API

    1.Configuration 1.1 加载核心配置文件, 加载hibernate.properties时:Configuration configuration = new Configuratio ...

  6. Springboot+Atomikos+Jpa+Mysql实现JTA分布式事务

    1 前言 之前整理了一个spring+jotm实现的分布式事务实现,但是听说spring3.X后不再支持jotm了,jotm也有好几年没更新了,所以今天整理springboot+Atomikos+jp ...

  7. 【线程系列五】什么时候释放锁—wait()、notify()

    由于等待一个锁定线程只有在获得这把锁之后,才能恢复运行,所以让持有锁的线程在不需要锁的时候及时释放锁是很重要的.在以下情况下,持有锁的线程会释放锁:    1. 执行完同步代码块.    2. 在执行 ...

  8. opencv利用hough概率变换拟合得到直线后,利用DDA算法得到直线上的像素点坐标

    图片霍夫变换拟合得到直线后,怎样获得直线上的像素点坐标? 这是我今天在图像处理学习中遇到的问题,霍夫变换采用的概率霍夫变换,所以拟合得到的直线信息其实是直线的两个端点的坐标,这样一个比较直接的思路就是 ...

  9. 【手记】解决启动SQL Server Management Studio 17时报Cannot find one of more components...的问题

    刚装好SSMS 17.1准备体验,弹出: 一番搜索,普遍办法都是安装VS2015独立shell.删除某个注册表项什么的,没用,首先这个shell我是装了的,然后也没有那个注册表项.我自己尝试过重装sh ...

  10. 基于opencv3.0下的运动车辆识别

    在opencv的初等应用上,对运动物体的识别主要有帧差或背景差两种方式. 帧差法主要的原理是当前帧与前一帧作差取绝对值: 背景差主要的原理是当前帧与背景帧作差取绝对值: 在识别运动车辆上主要需要以下9 ...