【问题标题】:Reload Classes via ssh on intellij-run jrebel tomcat server在 intellij-run jrebel tomcat 服务器上通过 ssh 重新加载类
【发布时间】:2014-04-24 03:03:51
【问题描述】:

我有一个通过 IntelliJ 在我的 Work (*NIX) 机器上运行的 JRebel+Tomcat 服务器,当我在家 (*NIX) 机器上通过远程连接时,我偶尔希望 JRebel 更新类/资源SSH。

例如

home $ ssh work
work $ cd workspace/foo/bar/baz
work $ hey-jrebel-go-update-classes

我今天通过 VNC 进入我的工作机器来处理这个问题,然后在 IntelliJ 中对我正在运行的 Tomcat 实例执行“更新类和资源”,然后注销。

这很愚蠢,因为我已经通过 SSH 连接了。有没有办法通过命令行启动这个过程?

【问题讨论】:

    标签: java tomcat ssh intellij-idea jrebel


    【解决方案1】:

    JRebel 具有远程处理功能,可用于通过 HTTP 将更改同步到远程计算机。为此,您应该在远程 Tomcat 上启用 JRebel(通过 -javaagent:jrebel.jar)并启用 JRebel 远程插件,该插件创建一个用于与 IDE 插件协商的 HTTP 端点。 -Drebel.remoting_plugin=true 可以。

    有关更多信息,您可以查看setting up Remoting with IntelliJ IDEA and Tomcat 的教程。

    否则,在不启用远程处理的情况下,您可以使用 rebel.xml 配置文件部署应用程序,该配置文件将指向展开的应用程序所在的位置,而 JRebel 将使 Tomcat 从该特定位置加载资源,因此您可以通过 SSH 从 IntelliJ 同步到该远程位置。然后 JRebel 将照常工作 - 监视指定位置的更改并在应用程序中使用它们时立即重新加载类/资源。

    【讨论】:

    • 我修改了答案以使其更清晰。 IntelliJ/Tomcat/JRebel 在我的 Work 机器上一起运行,我在家,通过 SSH 进入。当前设置确实使用了 rebel.xml,但类更改不会自动传播。也许这是我没有看到的 rebel.xml 配置设置。
    • 在这种情况下,最好在 Work 机器上启用 JRebel 日志记录,并检查 JRebel 是否真的在监视任何东西。您可以将日志文件发送给 JRebel 支持,他们会帮助您解决此问题。
    • 看起来 JRebel 目前正在做正确的事情。意思是,在 IntelliJ 中,我明确告诉它更新 Tomcat (ctrl/cmd-f10)——它不只是在我每次保存文件时部署。因此,在这种情况下,由于我在 bash 终端会话中,而不是在 MacOS GUI 中,我不知道如何告诉 JRebel “好的,/now/ go update”。
    • 没有这样的功能,告诉 JRebel 更新资源。 JRebel 根据 Java 语义懒惰地应用更改。这意味着,一旦在应用程序中使用该类,JRebel 将检查该类在其加载位置的时间戳。在远程处理的情况下,您告诉“请同步”,IDE 插件只会将文件复制到远程主机的正确目录中,仅此而已。其余的由代理来确定资源是否已更新。
    • 我终于弄清楚我做错了什么——JRebel 根本不支持我们连接 ORM 的方式,所以我不得不实际重新启动服务器而不是“更新”类”。
    【解决方案2】:

    我并没有完全遵循您尝试做的事情。但是,如果我遵循,您基本上想通过 SSH 向远程服务器发出命令,理想情况下,从 IntelliJ IDEA 中启动它。你可以:

    1. 使用终端窗口(工具 > 打开终端),启动 ssh 连接,然后手动发出命令。
    2. 创建一个 External Tool 定义,该定义使用plink(或等效项)对远程服务器执行 ssh 命令。您可以在 Settings > [IDE Settings] > External Tools 中创建外部工具定义。有关示例,请参见下面的屏幕截图。定义(或其组,如果使用组向定义添加结构)将出现在工具菜单上。您还可以通过 Settings > [IDE Settings] > Keymap > External Tools 将快捷方式映射到它。对于多个命令序列,您可以
      • 编写执行此操作的本地脚本并使用外部工具定义来启动脚本
      • 编写一个远程脚本并使用外部工具定义中的plink 来运行它
      • 将要运行的命令放在本地文件中并使用plink -m {file} 来运行它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多