在 Grails 3.1.7 中构建苗条 war

Building a slim war in Grails 3.1.7

我想要 assemble 一个 war 文件 w/o 任何 jar 文件(我已经将它们复制到我的 /opt/tomcat8/lib 目录)。

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

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

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

并且结果 war 确实变得非常小~1 MB。虽然当我将它部署到 tomcat 并调用 http://host:8080/ 时,我得到

javax.servlet.ServletException: Could not resolve view with name '/error' in servlet with name 'grailsDispatcherServlet' 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)

打造苗条 war 的正确方法是什么?

旁注:

该应用程序仅包含几个域 类 和脚手架控制器。 grails create-app

之后没有修改视图

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

例如compile "org.grails:grails-core"会变成provided "org.grails:grails-core"

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

您可以通过将此命令添加到 build.gradle:

来禁用 bootRepackage 任务
bootRepackage.enabled = false

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

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

所以我想出了一个简单的解决方法,虽然没有我最初希望的那么优雅,但是非常直接ward:

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

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

注意:sym-link 无效...

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

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