在Grails 3.1.7中构建一场纤细的战争
我想组装一个没有任何jar文件的war文件(我已经将它们复制到我的在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
/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
,因此仍然可以显著减少战争规模。