有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么公用文件夹下的更改会触发自动重新加载?

我目前正在使用Play Framework 2.3.0和AngularJS开发一个web应用程序。我使用Play Framework的/public文件夹为我的AngularJS应用程序提供服务

我在开发过程中所做的每一个更改都会触发一次按播放的完全重新加载,这有点烦人,因为我在Global.beforeStart方法中有一个耗时的计算

为什么它会触发自动重新加载,正如the Play 2.3.0 documentation所说:

Resources stored in the public directory are static assets that are served directly by the Web server.

你知道如何禁用public文件夹的自动重新加载功能吗

编辑:另一个想法:有没有一种方法可以从没有使用Assets控制器监控的外部文件夹中提供资源


共 (3) 个答案

  1. # 1 楼答案

    也许您正在(或曾经)使用BuildInfoPlugin?(或者其他发现这个问题的人,使用它)

    每当我在public/中碰到任何东西时,Play Framework总是为我重新启动。最后,我注意到这是因为我正在使用SBT BuildInfoPlugin,https://github.com/sbt/sbt-buildinfo,并将其配置为在生成的构建信息中包含构建时间戳,以及git status。在我删除了构建信息的这些部分之后,Play不再在public/中进行更改后重新编译或重新加载

    这与SBT 0.13.15和SBT 1.1.1以及Play Framework 2.6.9和2.6.12有关

    这就是我删除的内容:
    buildInfoOptions += BuildInfoOption.BuildTime
    和:
    BuildInfoKey.action("gitStatus") { "git status".!!.trim })

    (我不需要为Play配置watchSourcesplayMonitoredFiles来停止重新加载和重新加载。)

  2. # 2 楼答案

    我在构建中添加了以下内容。sbt:

        watchSources := (watchSources.value
           - baseDirectory.value / "public"     ** "*").get
    

    它将从正在监视的文件夹列表中删除“/public”。注意,这可能会破坏东西,但在问题解决之前,这是一个很好的解决方法

  3. # 3 楼答案

    重新加载不是由文件更改触发的,而是由类路径更改触发的。当然,源文件更改可能会触发类路径更改,但也可能不会

    Play的运行模式监视所有源文件的更改,这包括对公共目录和资产的更改,因为可能需要对这些文件进行处理。每当发生更改时,它都会要求sbt重新编译—这意味着重新编译所有内容,包括静态资产和scala/java文件

    当sbt重新编译时,它使用增量编译——这意味着,它存储上次编译的结果,并查看它以确定自上次编译以来是否有任何新的工作需要完成。如果没有,则跳过编译

    将资源从资源目录复制到类路径也是如此

    所以,在Play要求sbt重新编译之后,它会检查——类路径是否有任何更改?如果有,它会重新加载。但是,如果您所更改的只是一个javascript文件,那么就不应该有

    然而,您并不是唯一一个更改文件的人——如果您已经配置了SBT来为您生成一些文件,可能是Java/Scala源文件,或者可能只是conf目录中的一些资源,并且您编写的任务每次都会这样做,无论是否需要这样做——那么这可能是类路径更改

    所以,要解决您的问题,请检查您编写的任何任务,或者您正在使用的任何插件,以查看它们是否正在生成源或资源。如果他们是这样的,并且他们对此并不聪明,也就是说,他们在不需要的时候重新生成相同的文件,那么这可能会导致在任何源文件更改时重新加载播放,因为这意味着每次sbt重新编译时,都会重新生成文件,从而更改类路径