【问题标题】:Running war on tomcat7 vs grails run-app在 tomcat7 与 grails run-app 上运行战争
【发布时间】:2014-10-13 21:51:49
【问题描述】:

我在 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生成期间是否可以做一些事情来确保正确打包所有依赖项?

【问题讨论】:

  • 嘿@ash 你能验证我的回答是否正确吗?

标签: grails war run-app


【解决方案1】:

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

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

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

【讨论】:

  • "在开发中运行时还为您添加了一些依赖项,您需要在 BuildConfig.groovy 中指定它们,否则它们可能在战争中不可用。" - 我觉得这很奇怪,但看起来确实如此。有没有办法防止这种情况发生,所以在我的开发中我可以防止生产中可能出现的问题?
【解决方案2】:

这是 grails 中的一个错误。

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

可以通过将以下 sn-p 添加到 BuildConfig.groovy 的解决方法来解决此问题:

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

【讨论】:

  • 为我工作,谢谢。 JIRA 链接没有。
  • 是的,JIRA 不工作,他们迁移了它。反正我停止使用 Grails。
【解决方案3】:

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

runtime 'jline:jline:2.12'

我在 Grails 2.5.1 中没有看到此错误,但在 Grails 2.5.4 中出现了。好像是个bug。

【讨论】:

  • 此处相同,仅在从 2.5.1 升级到 2.5.4 时出现。
猜你喜欢
  • 1970-01-01
  • 2016-07-12
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 2014-11-10
  • 2013-09-14
  • 2016-09-25
  • 1970-01-01
相关资源
最近更新 更多