在tomcat7上运行战争与grails run-app

时间:2014-08-20 13:46:32

标签: 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 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 {

我的猜测是AnsiConsoleUrlMappingsRenderer某种程度上取决于jline.console.history.History但是为什么它会从war文件中丢失?在战争生成期间是否可以做一些事情来确保ll依赖关系被正确打包?

3 个答案:

答案 0 :(得分:3)

它是grails中的一个错误。

https://jira.grails.org/browse/GRAILS-8532

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

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

答案 1 :(得分:2)

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

runtime 'jline:jline:2.12'

我没有看到Grails 2.5.1的这个错误,但Grails 2.5.4没有。看起来像一个错误。

答案 2 :(得分:0)

您的Tomcat是否配置为运行解压缩或打包战争。开发作为一个解压缩的战争运行,因此像servlet.getRealPath()这样的命令在打包war上运行时返回一个有效值,Tomcat servlet容器返回null。在server.xml中搜索unpackWARs属性。

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

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