当外部更改文件时,IntelliJ可以更新Tomcat上的资源吗?

时间:2014-10-03 18:34:44

标签: tomcat vim intellij-idea editor auto-update

我的公司选择使用IntelliJ进行开发和部署到本地Tomcat服务器。我一直在gVim上进行开发,并且不想改变。

当我们使用eclipse时,我可以在外部更改文件时使用eclipse重新发布资源。 (我相信设置是使用本机挂钩或轮询刷新)这很棒,因为我更喜欢使用命令行工具来集成它们。

我们正在使用IntelliJ管理服务器,我可以使用它,但我不想破坏我当前的工作流程。

我知道IntelliJ很好地保持同步,当我关注它时会更新文件,并在我离开框架时刷新它们。

有没有办法让智能更新资源在外部更改(Gvim,cli git ... ext)而不移动它?

3 个答案:

答案 0 :(得分:1)

可悲的是,我无法找到监控外部更改的方法并更新IntelliJ中的Tomcat服务器。

我已经使用grunt实现了一种解决方法。 (node.js任务运行器)

这种解决方法背后的理论很简单:

  • Tomcat发动爆炸战争
  • grunt关注我的前端文件
  • 当文件发生变化时,grunt会将我的前端文件移动到爆炸的战争中

这样做的一些好处是:

  • 适用于任何外部编辑器/工具/等(vim,sublime text,nano,cli git,以及您能想到的任何其他内容)
  • 您无需进入intelliJ即可更新资源。
  • 无需java来设置此解决方案。

向下是

  • 你有一个额外的进程在运行。
  • 你还有另一个工具可以处理。
  • 你需要在爆发的战争中部署前端的东西(在我看来并不是那么糟糕)

要了解有关grunt的更多信息并进行设置,您可以访问gruntjs.com

此解决方法使用两个插件

  • 咕噜-的contrib拷贝
  • 咕噜-的contrib手表

首先,您要设置一个将文件复制到爆炸战争中的任务。这将使用grunt-contrib-copy插件,并且可能会进行一些改进,但这并不算太糟糕。我看起来像这样:

copy:{
    webfilesToOutdir:{
        files: [
            {expand: true, src: ['WebContent/**'], 
             dest: '../out/artifacts/attensity-q/exploded/attensity-q.war',
             rename: function(dest, src){
                    var ret = dest+"/"+ src.replace('WebContent/', '');
                    return ret;
                }
            }
        ]
    }
}

接下来,您将需要一项任务来观察您的文件并在发生变化时运行副本。这将使用grunt-contrib-watch再次没有什么不好,你只需要调整路径。这是我的:

watch: {
    web: {
        files: ['WebContent/**', '!WebContent/less/**'],
        tasks: 'copy:webfilesToOutdir',
        interrupt: true
    }
}

我希望这会有所帮助。我已经使用这个解决方案已经有一段时间了,它已经完成了它的工作。祝你好运,温柔的男人。

答案 1 :(得分:1)

注意:提供的解决方案适用于Ubuntu(14.04)+ Sublime Text 2/3

我最终得到了一个非常棘手的技巧,但我对此感到非常高兴。 IntelliJ Idea 在两种情况下更新资源(如果在设置中启用):

  1. 当IDE窗口失去焦点时
  2. 按下运行部分中的按钮或使用快捷键 Ctrl + F10
  3. 所以我从第一个案例开始,为我的操作系统寻找一个实用程序(Ubuntu 14.04),它可以集中 IntelliJ Idea 窗口并取消它的焦点,以使其更新资源。我偶然发现xdotool,它允许通过它的标题获取窗口的id,并通过它的id聚焦窗口。我创建了一个简单的 .sh 脚本:

    current_id="$(xdotool getactivewindow)" # get id of current window
    idea_id="$(xdotool search --name 'IntelliJ IDEA')"
    xdotool windowfocus "${idea_id}" # switch to idea
    xdotool windowfocus "${current_id}" # switch to current window
    

    windowfocus只关注窗口,这意味着如果窗口在背景上或在另一个工作区上,您将无法切换到它,您将保持原样,但窗口将获得重点。但它不能与 IntelliJ Idea 一起使用,资源没有更新,似乎需要全神贯注。

    所以我试图用windowfocus替换windowactivate - 它会随时切换到窗口(即使它在另一个工作区上),因此它变得集中,活跃和可见。但是结合切换回原始过程,它会像两个窗口之间的可见切换一样产生(就像你在窗口之间 Alt + Tab ),这是非常明显的,但它实际上是它的工作 - 资源得到更新。

    还有第二个选项 - 使用快捷方式。 xdotool 可以选择通过它的id向窗口发送击键:

    xdotool key --window "{$idea_id}" --clearmodifiers CTRL+F10
    

    但它不起作用,即使与聚焦窗口相结合,也会留下按下的 Ctrl 键的后效。 xdotool 文档中有一个Sendevent Notes部分,告知 xdotool 生成的键事件设置了一个特殊标志,因此接收到的是一个应用程序事件可以分析它的标志存在并忽略该事件,这可能是 IntelliJ Idea 的情况。

    经过一些研究后,我发现了另一个密钥发送工具 - xvkdb - 它就像一个魅力,因为我猜它使用另一种方式发送/生成一个关键事件:

    xvkbd -window "*IntelliJ IDEA*" -text "\C\[F10]"
    

    当单独运行时,此命令将焦点放在 Intellij Idea 窗口上,我使用 xdotool 将焦点恢复到当前进程。以下是该脚本的最终版本:

    current_id="$(xdotool getactivewindow)"
    xvkbd -window "*IntelliJ IDEA*" -text "\C\[F10]"
    xdotool windowfocus "${current_id}"
    

    为了将它与我用作代码编辑器的Sublime Text 3集成,我安装了一个插件Sublime​On​Save​Build,可以在保存文件时运行自定义构建(终端命令或脚本)崇高文本。这是一个简单的构建设置:

    {
        "shell_cmd": "/path/to/script/idea_update_resources.sh"
    }
    

    所以现在我在另一个工作区打开了 Intellij Idea ,当我在Sublime Text中保存文件时,通过向 Intellij Idea 窗口发送快捷方式来更新资源。正如我所说,使用这种实现方式聚焦窗口的时间并不明显。因此,它比 Grunt Gulp 任务更快,我会立即说,因为 IntelliJ Idea 会自行更新,并且如果 IntelliJ Idea 在更新资源时执行一些额外操作,也可以安全使用。 感谢@BenJamin提出的问题,希望它会对某人有所帮助。

    <强>更新

    使用此设置一段时间后,它无法按预期工作:如果 IntelliJ Idea 在另一个工作区上,或者它的界面完全被另一个窗口覆盖,则使用 xvkdb 将很遗憾地失败并且不会执行资源更新。我换回使用windowactivate

答案 2 :(得分:0)

WebStorm-- IntelliJ的另一个IDE - 看起来很像你所描述的东西。

也许您的IntelliJ IDE也有它。

enter image description here