在tomcat7上运行war vs grails运行应用程序

在tomcat7上运行war vs grails运行应用程序,grails,war,run-app,Grails,War,Run App,我在tomcat7上运行grails生成的war文件时遇到问题。如果/当我使用grails run app运行同一个应用程序时,一切都很好,并且工作正常。运行tomcat7和部署war时出现的异常: 2014-08-20 09:17:28,933 [http-bio-127.0.0.1-8080-exec-7] ERROR errors.GrailsExceptionResolver - ClassNotFoundException occurred when processing reque

我在tomcat7上运行grails生成的war文件时遇到问题。如果/当我使用grails run app运行同一个应用程序时,一切都很好,并且工作正常。运行tomcat7和部署war时出现的异常:

2014-08-20 09:17:28,933 [http-bio-127.0.0.1-8080-exec-7] ERROR errors.GrailsExceptionResolver  - ClassNotFoundException occurred when processing request: [GET] /
jline.console.history.History. Stacktrace follows:
java.lang.ClassNotFoundException: jline.console.history.History
    at org.codehaus.plugin.swagger.builder.SwaggerDocsBuilder.buildApiDeclarations(SwaggerDocsBuilder.groovy:71)
    at org.codehaus.plugin.swagger.builder.SwaggerDocsBuilder.rebuild(SwaggerDocsBuilder.groovy:48)
    at org.codehaus.plugin.swagger.builder.SwaggerDocsBuilder.build(SwaggerDocsBuilder.groovy:36)
    at org.codehaus.grails.plugins.swaggerapidocs.SwaggerApiDocsController.resources(SwaggerApiDocsController.groovy:21)
    at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:198)
    at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
    at com.brandseye.cors.CorsFilter.doFilter(CorsFilter.java:82)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
SwaggerDocsBuilder.groovy的第71行

rules = new BuildPathMap().build(grailsApp)
BuildPathMap
扩展

import org.codehaus.groovy.grails.web.mapping.reporting.AnsiConsoleUrlMappingsRenderer
class BuildPathMap extends AnsiConsoleUrlMappingsRenderer {

我的猜测是,
ansiconsoleurlmappingsrender
某种程度上取决于
jline.console.history.history
,但为什么war文件中缺少它呢?在war生成过程中,是否可以做些什么来确保正确打包所有依赖项?

您的Tomcat是否配置为运行未打包或打包的war。开发作为未打包的war运行,因此servlet.getRealPath()等命令在打包war上运行时返回有效值,TomcatServlet容器返回null。在server.xml中搜索unpackWARs属性

  <Host name="localhost"  appBase="webapps"
        unpackWARs="false" autoDeploy="false">


另外,在开发中运行时会为您添加一些依赖项,您需要在BuildConfig.groovy中指定它们,否则它们可能在战争中不可用。

这是grails中的一个bug

可以通过将以下代码段添加到BuildConfig.groovy来解决此问题:

grails.war.resources = { stagingDir, args ->
    copy(todir: "${stagingDir}/WEB-INF/lib", flatten: "true") {
        fileset(dir: "${grailsHome}/lib", includes: "**/jline-*.jar, **/jansi-*.jar")
    }
}
runtime 'jline:jline:2.12'

不确定这是否是最佳解决方案,但我通过在BuildConfig.groovy中显式添加一个jLine依赖项,解决了这个问题:

grails.war.resources = { stagingDir, args ->
    copy(todir: "${stagingDir}/WEB-INF/lib", flatten: "true") {
        fileset(dir: "${grailsHome}/lib", includes: "**/jline-*.jar, **/jansi-*.jar")
    }
}
runtime 'jline:jline:2.12'

我在Grails2.5.1中没有看到这个错误,但在Grails2.5.4中看到了。看起来像是一个bug。

“在开发中运行时,还为您添加了一些依赖项,您需要在BuildConfig.groovy中指定它们,否则它们可能在战争中不可用。”-这是我觉得奇怪的事情,但看起来确实如此。有没有办法防止这种情况发生,所以在我的开发中,我可以防止生产中可能出现的问题?嘿@ash,你能验证我的答案是否正确吗?为我工作,谢谢。但是JIRA链接不起作用。是的,JIRA不起作用,他们迁移了它。不管怎样,我已经停止使用Grails了,这里也一样,只是在从2.5.1升级到2.5.4时才出现。