【问题标题】:Building a slim war in Grails 3.1.7在 Grails 3.1.7 中构建一场小型战争
【发布时间】:2016-06-06 13:48:14
【问题描述】:

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

我读到了 -nojars options,但它不适用于 Grails 3.1.7。

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

war{
  rootSpec.exclude "**/*.jar"
}

由此产生的战争确实变得非常小~1 MB。虽然当我将它部署到 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)

建立slim war的正确方法是什么?

旁注:

该应用程序仅包含几个域类和脚手架控制器。在grails create-app之后没有修改视图

【问题讨论】:

标签: grails gradle war


【解决方案1】:

首先在您的build.gradle 中,您必须将所有compile 依赖项的范围更改为provided。出于某种原因,必须保留 runtime 依赖项才能使 Grails 正常工作(我对此还没有解释)。

例如compile "org.grails:grails-core"将更改为provided "org.grails:grails-core"

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

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

bootRepackage.enabled = false

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

【讨论】:

  • 请详细说明set scope of all dependencies to provided
  • 我已经修改了我的答案以进行澄清
  • 我应该把bootRepackage.enabled = false 放到某个特定的任务上,还是干脆放到根目录下?
  • 所以,我尝试了provided 技巧,得到了一个大约 1 MB 的 war 文件(所有 jar 都被剥离,就像我最初的尝试一样)。调用索引后,我得到ERROR org.springframework.boot.context.web.ErrorPageFilter - Forwarding to error page from request [/] due t o exception [Could not resolve view with name '/index' in servlet with name 'grailsDispatcherServlet']
  • 看来您必须在战争中保留runtime 依赖项,并且只能删除compile。对于您的项目,它应该只有 asset-pipeline 和 h2,所以仍然显着减少战争规模。
【解决方案2】:

作为后续,我创建了一个issue,由于 Graeme 无法重现该行为,因此该票已关闭。虽然对我来说还是不行。

所以我想出了一个简单的解决方法,它不像我最初希望的那样优雅,但非常简单:

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

  2. 将所有 Grails 3.1.11 + 插件依赖 jar 复制到 ~/ROOT/WEB-INF/lib

注意:sym-link 不起作用...

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 2016-09-01
    • 2019-01-22
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多