在 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:
解压 slim .war-文件到 ~/ROOT/
将所有 Grails 3.1.11 + 插件依赖 jar 复制到 ~/ROOT/WEB-INF/lib
注意:sym-link
无效...
- 将 ~/ROOT 文件夹移动到 /opt/tomcat/webapps
因此,我在构建机器上创建并发送到产品的 war 文件仍然很薄
我想要 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:
解压 slim .war-文件到 ~/ROOT/
将所有 Grails 3.1.11 + 插件依赖 jar 复制到 ~/ROOT/WEB-INF/lib
注意:sym-link
无效...
- 将 ~/ROOT 文件夹移动到 /opt/tomcat/webapps
因此,我在构建机器上创建并发送到产品的 war 文件仍然很薄