1. 创建一个普通的 springboot 项目
创建过程不再赘述,可以自行百度
2. 加入pom.xml 依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
<!--添加servlet的依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--不同项目之前调用 httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.3</version>
<scope>compile</scope>
</dependency>
<!-- ssh -->
<dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>262</version>
</dependency>
</dependencies>
-
写页面
加入页面所需的 js css 等,采用elementui 编写页面,代码如下
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<!-- 引入阿里图标-->
<link rel="stylesheet" type="text/css" href="./iconfonts/iconfont.css">
<!-- 引入样式 -->
<link rel="stylesheet" type="text/css" href="./element/element-Index.css">
<!-- 引入组件库 -->
<script src="./element/vue.js"></script>
<script src="./element/index.js"></script>
<script src="./js/qs.min.js"></script>
<script src="./js/axios.min.js"></script>
<script src="./js/httpclient.js"></script>
<style>
.leftMenu{
background-color: #E4E7ED;
width:600px;
float:left;
padding: 40px 20px;
}
.showTable{
background-color: #E4E7ED;
float:right;
padding: 40px 20px;
}
</style>
</head>
<body style="margin: 0;padding: 0;">
<div id="app">
<el-row style="margin: 50px 20px" :gutter="20">
<el-col :span="10">
<el-card>
<div style="margin:0px 10px 20px 0px;font-size: 18px">服务器配置</div>
<el-form :model="sshForm" ref="sshForm" :rules="rules" label-width="100px">
<el-form-item prop="ip" label="IP">
<el-input v-model="sshForm.ip" size="mini" placeholder="请输入IP" style="width:80%;"></el-input>
</el-form-item>
<el-form-item prop="user" label="账号">
<el-input v-model="sshForm.user" size="mini" placeholder="请输入账号" style="width:80%;"></el-input>
</el-form-item>
<el-form-item prop="pwd" label="密码">
<el-input v-model="sshForm.pwd" size="mini" placeholder="请输入密码" style="width:80%;"></el-input>
</el-form-item>
<el-form-item prop="folder" label="文件夹路径">
<el-input v-model="sshForm.folder" size="mini" placeholder="请输入文件夹路径" style="width:80%;"></el-input>
</el-form-item>
</el-form>
<div style="text-align:right;margin-right:15%;">
<el-button type="primary" @click="queryJar" size="mini" v-loading='loading'>确定</el-button>
</div>
</el-card>
</el-col>
<el-col :span="14">
<el-card v-if="showL === 'default'" >
<el-table size="mini" :data="sshTable" >
<el-table-column prop="fileName" label="jar包"></el-table-column>
<el-table-column prop="isRunning" label="状态">
<template slot-scope="scope">
<div v-if="scope.row.isRunning == true" > <div size="mini" style="width: 100px;background: #f0f9eb ;text-align: center">运行中</div></div>
<div v-if="scope.row.isRunning == false" > <div size="mini" style="width: 100px;background:oldlace ;text-align: center" >已结束</div></div>
</template>
</el-table-column>
<el-table-column label="操作" width="200">
<template slot-scope="scope">
<el-button v-if="scope.row.isRunning == false" size="mini" type="success" @click="startJar(scope.row)" v-loading="scope.row.isClick" >启动</el-button>
<el-button v-if="scope.row.isRunning == true" size="mini" type="danger" @click="stopJar(scope.row)" v-loading="scope.row.isClick" >停止</el-button>
<el-button size="mini" @click="catLog(scope.row)" >日志</el-button>
</template>
</el-table-column>
</el-table>
</el-card>
<el-card v-if="showL === 'log'" style="overflow: auto; background:#000000; color:#FFFFFF;height:500px" >
<div style="position: fixed;right: 100px;">
<el-button size="mini" @click="catLog('refersh')" >刷新</el-button>
<el-button type="success" size="mini" @click="returnBtn" >返回</el-button>
</div>
<pre>{{showLog}}</pre>
</el-card>
</el-col>
</el-card>
</div>
</body>
<script>
new Vue({
el: '#app',
data() {
return {
sshHeight: ((document.documentElement.clientHeight || document.body.clientHeight) -80),
sshWidth: ((document.documentElement.clientWidth || document.body.clientWidth) -680),
loading: false,
sshTable: [
],
row:'',
showL:'default',
showLog:'',
sshForm: {
ip: '',
user: '',
pwd: '',
folder: '',
fileName: '',
isRunning: false,
isClick: false
},
rules: {
ip: [
{ required: true, message: '请输入IP', trigger: 'blur' }
],
user: [
{ required: true, message: '请输入账号', trigger: 'blur' }
],
pwd: [
{ required: true, message: '请输入密码', trigger: 'blur' }
],
folder: [
{ required: true, message: '请输入文件夹路径', trigger: 'blur' }
],
},
}
},
mounted() {
if(localStorage.getItem('folder') != null){
this.sshForm.folder = localStorage.getItem('folder');
}
if(localStorage.getItem('user') != null){
this.sshForm.user = localStorage.getItem('user');
}
if(localStorage.getItem('ip') != null){
this.sshForm.ip = localStorage.getItem('ip');
}
if(localStorage.getItem('pwd') != null){
this.sshForm.pwd = localStorage.getItem('pwd');
}
},
methods: {
queryJar(){
let that = this;
this.showL= 'default';
that.$refs['sshForm'].validate((valid) => {
if (valid) {
that.loading = true;
post("getFile",{'ip':that.sshForm.ip,'user':that.sshForm.user,'pwd':that.sshForm.pwd,'folder':that.sshForm.folder}).then(function (response){
if(response.data.isLogin){
that.loading = false;
console.log("=====",response.data.list);
that.sshTable = response.data.list;
if(localStorage.getItem('folder') != null){
localStorage.removeItem("folder");
}
if(localStorage.getItem('user') != null){
localStorage.removeItem("user");
}
if(localStorage.getItem('ip') != null){
localStorage.removeItem("ip");
}
if(localStorage.getItem('pwd') != null){
localStorage.removeItem("pwd");
}
localStorage.setItem('ip',that.sshForm.ip);
localStorage.setItem('pwd',that.sshForm.pwd);
localStorage.setItem('user',that.sshForm.user);
localStorage.setItem('folder',that.sshForm.folder);
that.$notify({
message: '查询成功',
type: 'success'
});
}else{
that.loading = false;
that.$notify({
message: response.data.msg,
type: 'error'
});
that.sshTable = [];
}
}).catch(function (error) {
console.log(error);
});
}
});
},
catLog(row){
if(row == 'refersh'){
row = this.row;
}else{
this.row = row;
}
let that = this;
post("catLog",{'ip':that.sshForm.ip,'user':that.sshForm.user,'pwd':that.sshForm.pwd,'folder':that.sshForm.folder,'fileName':row.fileName}).then(function (response){
if(response.data.code == '200' ){
that.showLog = response.data.list;
that.showL = 'log'
}
}).catch(function (error) {
console.log(error);
});
},
returnBtn(){
this.showL = 'default'
},
startJar(row){
let that = this;
row.isClick = true;
let code = false;
post("runJar",{'ip':that.sshForm.ip,'user':that.sshForm.user,'pwd':that.sshForm.pwd,'folder':that.sshForm.folder,'fileName':row.fileName}).then(function (response){
console.log(that.sshForm);
setTimeout(function () {
post("getFile",{'ip':that.sshForm.ip,'user':that.sshForm.user,'pwd':that.sshForm.pwd,'folder':that.sshForm.folder}).then(function (response){
if(response.data.code == '200'){
that.sshTable = response.data.list;
for(let j=0;j<response.data.list.length;j++){
if(row.fileName == response.data.list[j].fileName){
if(row.isRunning != response.data.list[j].isRunning){
console.log(123);
code = true;
that.$notify({
message: '启动成功',
type: 'success'
});
break;
}
}
}
if(code == false){
that.$notify({
message: '启动失败',
type: 'error'
});
}
}else{
that.$notify({
message: response.data.msg,
type: 'error'
});
}
}).catch(function (error) {
console.log(error);
});
}, 30000);
}).catch(function (error) {
console.log(error);
});
},
stopJar(row){
let that = this;
row.isClick = true;
let code = false;
post("stopJar",{'ip':that.sshForm.ip,'user':that.sshForm.user,'pwd':that.sshForm.pwd,'folder':that.sshForm.folder,'pId':row.pId,'fileName':row.fileName}).then(function (response){
setTimeout(function () {
post("getFile",{'ip':that.sshForm.ip,'user':that.sshForm.user,'pwd':that.sshForm.pwd,'folder':that.sshForm.folder}).then(function (response){
if(response.data.code == '200'){
that.sshTable = response.data.list;
for(let j=0;j<response.data.list.length;j++){
if(row.fileName == response.data.list[j].fileName){
if(row.isRunning != response.data.list[j].isRunning){
code = true;
row.isClick = false;
that.$notify({
message: '停止成功',
type: 'success'
});
break;
}
}
}
if(code == false){
that.$notify({
message: '启动失败',
type: 'error'
});
}
}else{
that.$notify({
message: response.data.msg,
type: 'error'
});
}
}).catch(function (error) {
console.log(error);
});
}, 3000);
}).catch(function (error) {
console.log(error);
});
}
},
});
</script>
</html>
页面成功效果
-
后端代码详解(service层)
4.1 测试服务器链接是否成功,通过ssh工具
/**
* 检查链接是否成功
* @param server
* @return
*/
public Connection isLogin(Server server) {
Connection conn = SshUtil.login(server.getIp(), server.getUser(), server.getPwd());
return conn;
}
4.2 获取目录下指定文件jar包
/**
* 返回文件夹下所有文件
* @param server
* @return
*/
public List<String> getFile(Server server) {
List <String> listNew = new ArrayList<>();
String cmd = "cd " + server.getFolder() + "&&ls";
List <String> list = SshUtil.execute(this.isLogin(server), cmd);
for(int i=0; i<list.size(); i++) {
if(list.get(i).contains(".jar")) {
String[] split = list.get(i).split(" ");
listNew.add(split[split.length - 1]);
}
}
return listNew;
}
4.3 启动jar 包
List <String> list = new ArrayList<>();
String cmd = "nohup java -jar " + server.getFolder() + "/" +
server.getFileName() + ">" + server.getFolder() + "/" + server.getFileName().substring(0, server.getFileName().length() - 4) +".out" +"&";
list = SshUtil.executeJava(this.isLogin(server), cmd);
return true;
4.4 停止jar 包
/**
* kill jar
* @return
*/
public Boolean stopJar(Server server) {
List <String> list = new ArrayList<>();
String cmd = "kill -9 " + server.getpId();
list = SshUtil.execute(this.isLogin(server), cmd);
//删除日志
//cmd = "rm -rf " + server.getFolder() + "/" + server.getFileName().substring(0, server.getFileName().length() - 4) +".out";
//SshUtil.execute(this.isLogin(server), cmd);
return true;
}
4.5 显示jar包运行还是停止状态
/**
* 获取运行的java进程
* @param server
* @return
*/
public List<Server> getProcess(Server server) {
List <Server> listNew = new ArrayList<>();
String cmd = "jps -l";
List<String> list = SshUtil.executeJava(this.isLogin(server), cmd);
for(int i=0; i<list.size(); i++) {
if(list.get(i).contains(".jar") && !(list.get(i).contains("已杀死"))) {
Server server1 = new Server();
String[] split = list.get(i).split(" ");
server1.setFileName(split[split.length - 1]);
server1.setpId(split[0]);
listNew.add(server1);
}
}
return listNew;
}
至此,整个程序就完成啦。