【问题标题】:Can IntelliJ update resources on Tomcat when a file is changed externally?外部更改文件时,IntelliJ 可以更新 Tomcat 上的资源吗?
【发布时间】:2014-10-03 18:34:44
【问题描述】:

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

当我们使用 eclipse 时,当文件被外部更改时,我能够让 eclipse 重新发布资源。 (我相信设置是使用本机挂钩或轮询刷新)这太棒了,因为我更喜欢使用命令行工具而不是集成工具。

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

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

有没有办法让 intelliJ 更新已在外部更改的资源(Gvim、cli git... ext)而不移动到它?

【问题讨论】:

  • 独立运行服务器。
  • 这有什么帮助?
  • @BenJamin,你找到解决方案了吗?
  • @MichaelRadionov 不是一个好人,当然也不是 intelliJ 的人。我的工作是设置一个繁重的任务来监视项目文件并手动将它们移动到 tomcat 服务的爆炸式战争中。它对我正在做的事情来说足够好。但是当我在项目之间切换时,我确实必须打开和关闭 grunt 任务。阅读您的要求,听起来这也可能对您有用,我将汇总我的问题的答案,我们可以看看您的想法。

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


【解决方案1】:

遗憾的是,我一直无法找到一种方法来监控外部更改并更新 IntelliJ 中的 Tomcat 服务器。

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

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

  • Tomcat 服务于爆炸性战争
  • grunt 监视我的前端文件
  • 当文件更改时,grunt 会将我的前端文件移动到爆炸战争中

这样做的一些好处是:

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

下面是

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

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

此解决方法使用两个插件

  • grunt-contrib-copy
  • grunt-contrib-watch

首先,您设置一个任务,将您的文件复制到您的爆炸战争中。这将使用 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
    }
}

我希望这会有所帮助。我已经使用这个解决方案一段时间了,它的工作做得很好。祝你好运,绅士们。

【讨论】:

  • 谢谢!我已经尝试过这个解决方案,但是使用 grunt-sync 插件,它只复制修改过的文件。它的工作速度很慢,一次运行大约 10 秒。我会尝试用简单的副本来测试它,但是我们有很多文件要更新。我认为减少观看的文件数量也是值得的,但我一定会再试一次。解决方案实际上非常好和简单,但我担心 Idea 在更新资源时会做一些额外的事情,而不仅仅是从一个文件夹复制到另一个文件夹。
  • 我想这可能取决于您的设置,但至少对我们而言,我认为idea 在更新资源时不会做任何花哨的事情。一次运行约 10 秒太长了,如果它在我从 vim 到 chrome 的 alt+tab 并点击刷新的时间内没有更新,我将无法忍受。我没有用 grunt-sync 尝试过,也许复制,尽管移动了很多,但速度更快,或者你的文件比我们多。 (这会让我感到惊讶,我们的项目也是一个相当大的项目)。无论哪种方式..祝你好运。我希望这在某种程度上有所帮助。
  • 经过几次测试后,我能够使用gulpgulp.src + gulp.dest vs grunt-copy)获得更好的结果。对于 ~4k 文件 (~40mb),Grunt 在 ~12 秒内完成他的工作,而对于 Gulp 则需要 ~4 秒。我仍在尝试,但这已经是一个巨大的提升。
  • 很高兴听到这个消息!哇,40mb 是一个巨大的数字,难怪你的比我的要长:)
【解决方案2】:

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

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

  1. 当 IDE 窗口失去焦点时
  2. 运行部分中按下按钮或使用快捷键Ctrl+F10

所以我从第一个案例开始为我的操作系统 (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,当您在 Sublime Text 中保存文件时,它可以运行自定义构建(终端命令或脚本) .这是一个简单的构建设置:

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

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

更新:

使用此设置一段时间后,它无法按预期工作:如果 IntelliJ Idea 在另一个工作区上,或者它的界面被另一个窗口完全覆盖,xvkdb 的解决方案em> 不幸的是会失败并且不会执行资源更新。我切换回使用windowactivate

【讨论】:

  • 不错的解决方案!我还尝试了自动寡妇激活,但发现它太麻烦了。听起来你用 xvkdb 赢了。我什至可以玩一下。无论哪种方式,感谢您花时间发布您的解决方案!
【解决方案3】:

WebStorm——IntelliJ 的另一个 IDE——有一些看起来很像你描述的东西。

也许您的 IntelliJ IDE 也有。

【讨论】:

  • 我已经读过一些关于它的内容,它似乎与我们正在寻找的相反——它允许从 IntelliJ Idea 中运行外部工具。我们需要的是从外部工具/编辑器运行 Idea 的内置工具。
  • 是的,不完全是。我确实将 vim 拉到了 intelliJ 中,看看感觉如何。事实证明,至少对我来说,这并不理想。谢谢你的建议。
猜你喜欢
  • 2011-02-12
  • 1970-01-01
  • 2018-02-12
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多