grails 运行-app (Grails 2.5.0) 上的 NoClassDefFoundError

NoClassDefFoundError on grails run-app (Grails 2.5.0)

当我尝试 运行 使用 Grails 2.5.0 新创建的项目时:

$ grails create-app test250
$ cd test250
$ grails run-app

我收到以下错误:

| Running Grails application
| Error java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
| Error     at org.grails.plugins.tomcat.fork.ForkedTomcatServer.<clinit>(ForkedTomcatServer.groovy:44)
| Error Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
| Error     at java.net.URLClassLoader.run(URLClassLoader.java:366)
| Error     at java.net.URLClassLoader.run(URLClassLoader.java:355)
| Error     at java.security.AccessController.doPrivileged(Native Method)
| Error     at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
| Error     at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
| Error     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
| Error     at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
| Error     ... 1 more
Exception in thread "main" 
| Error Forked Grails VM exited with error

我的机器是 运行ning OSX 10.10.2,我有几个项目 运行ning 在 Grails 2.2.5 上没有问题。

看起来问题是 Tomcat 插件间接使用了 commons-logging(ForkedTomcatServer 扩展了 Grails ForkedGrailsProcess class 引用 org.apache.commons.logging.Log) 但它没有导出,也不是 Grails 依赖项。

它是 asset-pipeline 插件的间接依赖项,因此应该使 jar 可用并解决大多数用户的错误。您是否在 BuildConfig.groovy 中删除了 asset-pipeline 作为依赖插件?

您应该能够通过在 BuildConfig.groovy:

中显式添加公共日志的依赖项来让事情正常进行
dependencies {
   runtime 'commons-logging:commons-logging:1.2'
   ...
}

使用 GVM(正如 Jeff 指出的那样)管理我机器上安装的不同 Grails 版本解决了问题。