在Grails 3.1.7中构建一场纤细的战争

在Grails 3.1.7中构建一场纤细的战争,grails,gradle,war,Grails,Gradle,War,我想组装一个没有任何jar文件的war文件(我已经将它们复制到我的/opt/tomcat8/lib目录中了) 我读过关于-nojars,但它不适用于Grails3.1.7 然后,我尝试自定义我的build.gradle: war{ rootSpec.exclude "**/*.jar" } bootRepackage.enabled = false 而由此引发的战争实际上变得非常小,只有1MB。尽管当我将其部署到tomcat中并调用http://host:8080/,我要 javax.s

我想组装一个没有任何jar文件的war文件(我已经将它们复制到我的
/opt/tomcat8/lib
目录中了)

我读过关于
-nojars
,但它不适用于Grails3.1.7

然后,我尝试自定义我的
build.gradle

war{
  rootSpec.exclude "**/*.jar"
}
bootRepackage.enabled = false
而由此引发的战争实际上变得非常小,只有1MB。尽管当我将其部署到tomcat中并调用
http://host:8080/
,我要

javax.servlet.ServletException:无法在名为“grailsDispatcherServlet”的servlet中解析名为“/error”的视图 org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1229) org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1029) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:973) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:895) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967)

建立苗条战争的正确方法是什么

旁注:


该应用程序只包含几个域类和框架控制器。在
构建中的
grails create app

之后没有修改任何视图。gradle
您必须将所有
编译
依赖项的范围更改为
提供的
。出于某种原因,
运行时
依赖项必须保持,Grails才能工作(我还没有对此的解释)

例如
compile“org.grails:grails-core”
将更改为
提供的“org.grails:grails-core”

这将停止gradle将libs打包到
WEB-INF/lib
,但它现在将创建包含所有依赖项的新文件夹
WEB-INF/lib。这些LIB对于“外部”应用程序服务器不应可见,但对于存档(在本例中为war)执行是必需的。这是通过
bootRepackage
任务完成的

通过将此命令添加到您的
build.gradle
,您可以禁用
bootRepackage
任务:

war{
  rootSpec.exclude "**/*.jar"
}
bootRepackage.enabled = false

现在,您的
war
任务应该创建没有任何jar的存档。

作为后续操作,我创建了一个,由于Graeme无法重现该行为,因此票据关闭。虽然对我来说它仍然不起作用

因此,我提出了一个简单的解决方案,它不像我最初希望的那样优雅,但非常直截了当:

  • 将slim.war文件解压缩到~/ROOT/

  • 将所有Grails 3.1.11+插件依赖项JAR复制到~/ROOT/WEB-INF/lib中

  • 注意:
    sym链接
    不起作用

  • 将~/ROOT文件夹移动到/opt/tomcat/webapps

  • 因此,我在构建机器上创建并发送给prod的war文件仍然很薄

    您是否尝试过此解决方案:?这里描述的方法:基本上这就是我到目前为止所做的。请详细说明
    设置要提供的所有依赖项的范围
    我已经修改了我的答案以便澄清。我应该将
    bootRepackage.enabled=false
    放在某个特定任务中,还是放在根目录中?因此,我尝试了
    提供的
    技巧,并且得到了一个~1MB的war文件(与我最初的尝试一样,所有JAR都被剥离)。调用索引时,我得到
    ERROR org.springframework.boot.context.web.ErrorPageFilter-由于异常[无法解析名为“GrailDispatcherservlet”的servlet中名为“/index”的视图]
    看起来您必须在war中保留
    运行时
    依赖项,并且只能删除
    编译
    。对于您的项目来说,它应该只是
    资产管道
    h2
    ,因此仍然可以显著减少战争规模。