主机环境:准备两台独立的主机,这里假设本机(Local Server) host name为 local,另外一台为Remote Server 为host name 为remote ip address为192.168.3.77
Apache Tomcat: 在remote server下载安装Tomcat,本次用到的是9.x版本 下载链接,安装JDK后尝试启动 相关命令:catalina.bat run
远程文件传输软件: Idea 支持 ftp,ftps和sftp,这里我选择常见的sftp,如果remote server为类Linux操作系统 可以省略本步骤,而我用的是windows操作系统所以安装是最新的Apache sshd-sftp库,Maven地址是
<!-- https://mvnrepository.com/artifact/org.apache.sshd/sshd-sftp -->
<dependency>
<groupId>org.apache.sshd</groupId>
<artifactId>sshd-sftp</artifactId>
<version>2.13.2</version>
</dependency>
Gradle
implementation 'org.apache.sshd:sshd-sftp:2.13.2'
代码很简单
package org.vk.sftp;
import org.apache.sshd.common.file.virtualfs.VirtualFileSystemFactory;
import org.apache.sshd.server.SshServer;
import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider;
import org.apache.sshd.server.shell.ProcessShellCommandFactory;
import org.apache.sshd.server.shell.ProcessShellFactory;
import org.apache.sshd.sftp.server.SftpSubsystemFactory;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String[] args) throws Exception {
SshServer sshd = SshServer.setUpDefaultServer();
sshd.setPort(2222);// 设置sftp绑定端口
Path userHome = Path.of(System.getProperty("user.home","C:\\Users\\Administrator"));
SimpleGeneratorHostKeyProvider hostKeyProvider = new SimpleGeneratorHostKeyProvider(userHome.resolve("stfp_key"));// 设置密钥文件,不存在会自动创建
// hostKeyProvider.setAlgorithm("DSA");
// hostKeyProvider.setKeySize(1024);
sshd.setKeyPairProvider(hostKeyProvider);
sshd.setSubsystemFactories(List.of(new SftpSubsystemFactory()));
sshd.setPasswordAuthenticator((username, password, session) -> "victorkevin".equals(username) && "123456".equals(password));// 用户名密码校验
Path stfpTemp = userHome.resolve("stfp_temp");
if(Files.notExists(stfpTemp)){
Files.createDirectory(stfpTemp);
}
sshd.setFileSystemFactory(new VirtualFileSystemFactory(stfpTemp.toAbsolutePath()));// 设置sftp默认的访问目录
sshd.setCommandFactory(new ProcessShellCommandFactory());
sshd.setShellFactory(new ProcessShellFactory());
Runtime.getRuntime().addShutdownHook(new Thread(()->sshd.close(true)));
try {
sshd.start();//启动ssh服务
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("-----run finish------");
TimeUnit.DAYS.sleep(Integer.MAX_VALUE);
}
}
上面代码需要标记好路径,用户名和密码,后面设置Idea时需要,敲完代码后需要打包,可以打成java 和fat-jar ,本人用到是Gradle,如用Maven请自行修改,Gradle工程配置如下:
plugins {
id 'application'
}
group = 'org.vk.sftp'
version = '1.0'
repositories {
mavenLocal()
maven { url 'https://maven.aliyun.com/repository/public/' }
mavenCentral()
}
compileJava{
sourceCompatibility=21
targetCompatibility=21
}
application {
mainClass='org.vk.sftp.Main'
}
dependencies {
implementation 'org.apache.sshd:sshd-sftp:2.13.2'
testImplementation platform('org.junit:junit-bom:5.10.0')
testImplementation 'org.junit.jupiter:junit-jupiter'
}
jar{
manifest {
attributes 'Implementation-Title':'vksftp-Samples',
'Implementation-Version':project.version,
'Class-Path':configurations.runtimeClasspath.collect { it.getName() }.join(' '),
'Main-Class':application.mainClass
}
}
tasks.register('uberJar', Jar) {
duplicatesStrategy=DuplicatesStrategy.WARN
archiveClassifier = 'uber'
from sourceSets.main.output
dependsOn configurations.runtimeClasspath
manifest {
attributes 'Implementation-Title':'vksftp-Samples',
'Implementation-Version':project.version,
'Class-Path':configurations.runtimeClasspath.collect { it.getName() }.join(' '),
'Main-Class':application.mainClass
}
from {
configurations.runtimeClasspath.findAll { it.name.endsWith('jar') }.collect { zipTree(it) }
}
}
test {
useJUnitPlatform()
}
打包成功后运行java -jar -Xmx1024m -Dfile.encoding=utf-8 vksftp-1.0-uber.jar
接下来需要开始配置Idea和Remote Server 中的Tomcat
Tomcat 的Home 目录下编辑 bin/catalina.bat添加如下配置
set CATALINA_OPTS=%CATALINA_OPTS% -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.rmi.port=10992 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
配置的作用是开启Tomcat的JMX管理功能在端口1099上,该端口号需要和Idea上的配置一致,并关闭身份认证,切忌匆在生产环境开放,开启Idea远程管理Tomcat运行的应用
set "JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,address=0.0.0.0:51769,suspend=n,server=y -Dfile.encoding=utf-8 -Dsun.stdout.encoding=utf-8 -Dsun.stderr.encoding=utf-8 -Xmx1524m"
开启当前JVM的调试功能,监听在本机任意地址0.0.0.0上的51769端口该端口号需要和Idea上的配置一致,suspend 设置为n,server为 y,开启后Idea远程调试和hotswap代码。
Tomcat配置完毕就启动,正常无报错信息,用netstat -oan检查相关端口状态是否正常
Idea配置
创建一个普通的jakarta EE 9 的web 项目,并添加测试用的Servlet代码,简单的打印OK 字符串,Servelt的 URL 路径为 "/aaa"
package com.vk;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = {"/aaa"})
public class TestServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().println("OK it");
}
}
首先配置Idea sftp的Deloyment配置,这里是上述stfp配置中的信息照填则可
添加Run/Debug Configrations,下拉选择Apache Tomcat 中的Remote Tomcat,配置前本地也要先安装Tomcat并选择对应的版本,JMX port就是上面步骤对应的开放的端口,Path from root是指sftp 的默认根目录到那个路径上,这里是不输入只要根目录则可,Mapped As 路径是远程服务器上的实际路径就是Path from root对应的绝对路径,如果不明白可以后面启动报错后再配置,路径对Tomcat才能正常启动
查看Startup/Connection的Tag 选择Debug模式,下面有个端口号和传输类型与上面的
"
开启当前JVM的调试功能,监听在本机任意地址0.0.0.0上的51769端口该端口号需要和Idea上的配置一致,suspend 设置为n,server为 y,开启后Idea远程调试和hotswap代码
" 相对应
最后部署Web artifact ,别忘记修改Application Context 路径
所有配置都准备就绪,启动运行idea的Tomcat前要先启动Remote Server上的sftp软件和Tomcat
如果未启动先提示以下错误
启动正常:
打开浏览器访问 http://192.168.3.77:8080/fweb7/aaa
然后在测试Class hot swap ,在Idea上编辑修改输出的信息,然后按Ctrl+shift+F9 Recompile类
确定Reload之后刷新浏览器
至此Idea IntellJ的远程Tomcat Remote Deployment和Class hot swap正常,最后谈谈有什么用,因为自已的电脑承担的工作比较多(开发,数据库,运行调试和查资料)所以Debug起来有点资源吃紧,然后公司为我分配多一台闲置的机器,通过上述的Idea的功能可以把Tomcat和调试部份资源消耗转移出去使得开发的工作更有效率和便捷