Idea Intellj Tomcat 远程部署(Remote Server)和热替换(Hot Swap)

主机环境:准备两台独立的主机,这里假设本机(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和调试部份资源消耗转移出去使得开发的工作更有效率和便捷

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

victorkevin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值