我在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
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依赖关系被正确打包?
答案 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中指定它们,否则它们可能在战争中不可用。