【问题标题】:compileAssets failing on upgrading Grails applicationcompileAssets 升级 Grails 应用程序失败
【发布时间】:2020-05-21 12:17:43
【问题描述】:

我有一个运行 3.3 版的 Grails 应用程序。我最近升级到版本 4.0.3。我通常升级的方式,我理解可能不是最好的方式,是将我的环境升级到新的 Grails 版本,然后创建一个全新的 Grails 项目(我正在使用 IntelliJ),然后慢慢将我的文件从旧项目到新项目,修复我发现它们不起作用的东西。 我把所有东西都搬过来了,在 IntelliJ 中运行 run-app 时,该应用程序运行良好。 但是,如果我去终端运行“grails war”,我会遇到编译资产的各种问题。我通常不太关注资产的处理方式(这只是个人应用程序)。 我在我的 build.gradle 文件中看到它正在使用资产管道插件版本 3.0.10 (com.bertramlabs.plugins:asset-pipeline-gradle:3.0.10)。如果我将这些引用更改回我的 Grails 3 应用程序 (2.14.2) 中使用的assetPipeline 版本,那么错误就会消失。有谁知道这些版本是否存在可能导致我的问题的差异?

这是错误堆栈的一大块:

...
Processing File 138 of 140 - redmond/images/ui-icons_cd0a0a_256x240.png
Processing File 139 of 140 - redmond/images/ui-icons_d8e7f3_256x240.png
Processing File 140 of 140 - redmond/images/ui-icons_f9bd01_256x240.png
> Task :Wolf:assetCompile FAILED

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.1/userguide/command_line_interface.html#sec:command_line_warnings
1 actionable task: 1 executed
<-------------> 0% WAITING
> Deleting unused version-specific caches in E:\java_dev\projects\Wolf4\.gradle
effects.unminified.js:720: ERROR - Object literal contains illegal duplicate key "scaleMode", disallowed in strict mode
    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
    ^^^^^^^^^

Closure uglify JS Exception
asset.pipeline.processors.MinifyException: [Lcom.google.javascript.jscomp.JSError;@3ad6a23
        at asset.pipeline.processors.ClosureCompilerProcessor.process(ClosureCompilerProcessor.groovy:80)
        at asset.pipeline.processors.ClosureCompilerProcessor$process$0.call(Unknown Source)
        at asset.pipeline.AssetCompiler$_compile_closure4.doCall(AssetCompiler.groovy:173)
        at sun.reflect.GeneratedMethodAccessor67.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:101)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
        at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:263)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1041)
        at groovy.lang.Closure.call(Closure.java:405)
        at groovy.lang.Closure.call(Closure.java:399)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
rico.unminified.js:163: ERROR - Object literal contains illegal duplicate key "hoverTextColor", disallowed in strict mode
         hoverTextColor      : '#ffffff',
         ^^^^^^^^^^^^^^

Closure uglify JS Exception
asset.pipeline.processors.MinifyException: [Lcom.google.javascript.jscomp.JSError;@7bb4d5d3
        at asset.pipeline.processors.ClosureCompilerProcessor.process(ClosureCompilerProcessor.groovy:80)
        at asset.pipeline.processors.ClosureCompilerProcessor$process$0.call(Unknown Source)
        at asset.pipeline.AssetCompiler$_compile_closure4.doCall(AssetCompiler.groovy:173)
        at sun.reflect.GeneratedMethodAccessor67.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:101)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
        at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:263)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1041)
        at groovy.lang.Closure.call(Closure.java:405)
        at groovy.lang.Closure.call(Closure.java:399)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
unittest.unminified.js:457: ERROR - Object literal contains illegal duplicate key "benchmark", disallowed in strict mode
  benchmark: function(operation, iterations) {
  ^^^^^^^^^

Closure uglify JS Exception
asset.pipeline.processors.MinifyException: [Lcom.google.javascript.jscomp.JSError;@3e732fc9
        at asset.pipeline.processors.ClosureCompilerProcessor.process(ClosureCompilerProcessor.groovy:80)
        at asset.pipeline.processors.ClosureCompilerProcessor$process$0.call(Unknown Source)
        at asset.pipeline.AssetCompiler$_compile_closure4.doCall(AssetCompiler.groovy:173)
        at sun.reflect.GeneratedMethodAccessor67.invoke(Unknown Source)

【问题讨论】:

    标签: gradle grails asset-pipeline


    【解决方案1】:

    我已恢复到以前版本的assetPipeline 插件,这使我可以毫无错误地进行编译。

    但是对于遇到此问题的其他任何人,我注意到在升级 Grails 后,我的应用程序的 war 版本一旦部署到 Tomcat 就会出现问题。

    第一期——

    war {
       archiveName "Wolf.war"
    }
    

    不再根据需要命名我的战争文件。我在另一个question 中问过这个问题 而第一个答案是用bootWar代替war,比如:

    bootWar {
       archiveName "Wolf.war"
    }
    

    这确实正确命名了战争文件。然而,现在当 war 文件被放入 tomcat 并且 tomcat 爆炸它时,它在 webapp 中包含了一个 org.springframework.boot.loader 文件夹,这是我以前没有的。这似乎不对。 此外,我不再拥有 assets 目录,因此部署的应用程序中缺少我所有的自定义 js、css 和图像。 经过多次谷歌搜索,我发现了一些建议这样做:

    war {
        enabled = true
        archiveName "Wolf.war"
    }
    

    这解决了我所有的问题。我的war文件命名正确,war文件包含资产,war文件不包含引导文件夹。而且,部署的应用程序可以正常工作。 所以,我不知道这是否是我应该这样做的“正确”方式,但它确实有效。

    【讨论】:

      【解决方案2】:

      这里的错误非常清楚。 Uglification 过程是在您的 js 中的 Map 对象中检测重复的键定义,并告诉您修复它。这是一项整体改进,可帮助您查找代码错误。一些浏览器会忽略这一点,而一些较旧的浏览器不会,所以它只是想帮助你。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-14
        • 2021-06-10
        • 1970-01-01
        • 2021-08-08
        • 2015-11-26
        • 1970-01-01
        • 2018-12-17
        • 2014-05-07
        相关资源
        最近更新 更多