专栏首页奕仁专栏关于java远程调用tomcat脚本的问题

关于java远程调用tomcat脚本的问题

背景:这两天搞了一下java的跨系统远程调用,遇到了几个问题,其中最让我头疼的就是下面那个,然而最后也解决了,故写下来总结一下

Neither the JAVA_HOME nor the JRE_HOME environment variable is defined

我是用的第三方连接远程系统,即ganymed-ssh2

<dependency>
	<groupId>ch.ethz.ganymed</groupId>
	<artifactId>ganymed-ssh2</artifactId>
	<version>build210</version>
</dependency>

在我编写完代码之后,运行出现了好几个问题,比如利用java运行远程服务器的脚本出现not permission>学过编程的人肯定都知道这是没有权限,给它个权限就好了,即 chmod 777 /data/xxx(即路径). 说一下调用/tomcat/bin/startup.sh 出现Neither the JAVA_HOME nor the JRE_HOME environment variable is defined,为什么呢?大概是因为用java远程登录不能获取到环境变量吧!

然后贴上java连接的代码

import ch.ethz.ssh2.ChannelCondition;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
import lombok.extern.slf4j.Slf4j; 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;


@Slf4j
public class ServerUtils {

    private Connection conn;
    private String ip;
    private String username;
    private String password;
    private static final int TIME_OUT = 3;

    private static final Logger LOGGER = LoggerFactory.getLogger(ServerUtils.class);
    /***
     * 分割  获取PID
     */
    private static final String SPLIT = "     ";



    /**
     * 构造函数
     */
    public ServerUtils(ServerEnum serverEnum) {
        this.ip = serverEnum.getIp();
        this.username = serverEnum.getName();
        this.password = serverEnum.getPassword();
    }


    /**
     * 登录
     * @throws IOException
     */
    private boolean login() throws IOException {
        conn = new Connection(ip);
        conn.connect();
        return conn.authenticateWithPassword(username, password);
    } 

    /**
     * 启动
     */
    public boolean start(ServerEnum serverEnum, ProjectEnum projectEnum) {
        try {
		    //脚本地址 
            // /data/bash/tomcat.sh
            String path = CommandUtils.getStartBash(serverEnum, projectEnum);
            exec(path);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    } 

    /**
     * 执行脚本
     *
     * @param shell
     * @return
     * @throws Exception
     */
    public String exec(String shell) throws Exception {
        try {
            shell += " ";
            if (login()) {
                LOGGER.info(">>>>登录成功!!!登录服务器IP为>>>>>>{}",this.ip);
                Session session = conn.openSession();
                LOGGER.info(">>>>>>>>开始执行shell 命令>>>>>>{}", shell);
                session.execCommand(shell);
                String returnValue = processStdout(session.getStdout());
                LOGGER.info("执行结束,返回值是>>>>>>>>>>{}",returnValue);
                session.waitForCondition(ChannelCondition.EXIT_STATUS, TIME_OUT);
                session.getExitStatus();
                return CommandUtils.getFirstLine(returnValue);
            } else {
                LOGGER.error("登录远程机器失败,serverIP is {}" + ip);
                throw new RuntimeException("登录远程机器失败");
            }
        } finally {
            if (conn != null) {
                conn.close();
            }
        }

    }

    /**
     * 对服务器打印的值进行解析
     * @return
     * @throws Exception
     */
    private String processStdout(InputStream in) {
        InputStream stdout = new StreamGobbler(in);
        StringBuilder builder = new StringBuilder();
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(stdout, Charset.defaultCharset()));
            String line;
            while ((line = br.readLine()) != null) {
                builder.append(line);
                break;
            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return builder.toString();
    }

    public static void main(String[] args) throws Exception { 
        new ServerUtils(ServerEnum.test2).start(ServerEnum.test2, ProjectEnum.ent); 
    }
}

解决办法:

在服务器上编写一个脚本,手动设定它的jdk环境变量,创建一个脚本tomcat.sh,编写如下:

#! /bin/bash
TOMCAT_NAME=tomcat-crm
PROJECT_PATH=/pm/server/$TOMCAT_NAME
DATE=`date +%Y-%m-%d--%H-%M-%S`
###设置java变量
export JAVA_HOME=/data/server/jdk1.8.0_181
./startup.sh 

在调用java -jar 进行启动springboot项目的时候也发现了此类问题,尽管加上export JAVA_HOME=xxxx也没什么用, 在这里加入下面的命令完美解决springboot远程启动的问题:

**source /etc/profile;nohup java -jar /mnt/test.jar &  **

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 项目中HandlerMethodReturnValueHandler的应用

    相信很多同学在项目开发,会遇到这种问题,就是某些字段如果为null,返回给前台,然后前端会各种null判断? 或者后端同学在返回之前对null之进行判空,然后返...

    奕仁
  • 微信支付【代码篇】

    接上一篇,领导让我帮忙对接一下微信支付,接到文档之后我一脸懵逼,看了半天之后发现与银行对接大同小异,于是根据微信API要求进行了编码。

    奕仁
  • SpringMvc源码之解析参数HandlerMethodArgumentResolver

    HandlerMethodArgumentResolver是什么?它是springmvc提供的入参解析器,像平常应用的注解@RequestParam @Path...

    奕仁
  • [javaSE] java上传图片给PHP

    陶士涵
  • Java DefaultTableModule 创建表格

    用户2965768
  • 机器学习中不平衡数据集分类模型示例:乳腺钼靶微钙化摄影数据集

    一个典型的不平衡分类数据集是乳腺摄影数据集,这个数据集用于从放射扫描中检测乳腺癌(特别是在乳腺摄影中出现明亮的微钙化簇)。研究人员通过扫描图像,对目标进行分割,...

    deephub
  • 一个Java开发的在线视频下载工具,可以把视频分块下载到本地,再拼凑成完整版

    Jerry Wang
  • 第七阶段-网络编程:【第一章 网络编程】

    我们应该或多或少都有见过IP地址的格式 xxx.xxx.xxx.xxx大致应该是类似这样的,但是计算机不是只能识别二进制的数据,但是很显然,我们的IP地址确实不...

    BWH_Steven
  • 手写一个WEB应用服务

    之前有小伙伴向我请教一道笔试题:要求写出一个WEB应用服务,不得使用Servlet接口,用Socket实现,可以响应get请求,打印请求信息,并判断请求资源,若...

    南风
  • 手写一个WEB应用服务

    之前有小伙伴向我请教一道笔试题:要求写出一个WEB应用服务,不得使用Servlet接口,用Socket实现,可以响应get请求,打印请求信息,并判断请求资源,若...

    南风

扫码关注云+社区

领取腾讯云代金券