由于NoClassDefFoundError,Groovy脚本将无法运行

时间:2018-06-18 14:02:40

标签: groovy groovyscriptengine

我写了一个非常简单的groovy脚本来测试cron表达式是否有效:

import hudson.scheduler.CronTabList

try {
    def cron = CronTabList.create("@daily")
    println("Valid cron!")
} catch(Exception e) {
    println("Invalid cron!")
    e.printStackTrace()
}

运行此操作失败并显示以下消息:

Caught: java.lang.NoClassDefFoundError: javax/servlet/ServletContextListener
java.lang.NoClassDefFoundError: javax/servlet/ServletContextListener
    at hudson.scheduler.BaseParser.<clinit>(BaseParser.java:149)
    at hudson.scheduler.CronTab.set(CronTab.java:113)
    at hudson.scheduler.CronTab.<init>(CronTab.java:100)
    at hudson.scheduler.CronTabList.create(CronTabList.java:121)
    at hudson.scheduler.CronTabList.create(CronTabList.java:96)
    at hudson.scheduler.CronTabList$create.call(Unknown Source)
    at validate_crontab.run(validate_crontab.groovy:7)
Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletContextListener
    ... 7 more

Process finished with exit code 1

我的build.gradle依赖项如下所示:

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.3.11'
    compile group: 'org.quartz-scheduler', name: 'quartz', version: '2.3.0'
    compile group: 'org.jenkins-ci.main', name: 'jenkins-core', version: '2.85'
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

我根本无法弄清楚应该责备什么以及为什么我无法运行脚本。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

显然你错过的是servlet API。例如:

dependencies {
    compile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0'
}

如果你把它放在你的依赖项中,你的脚本很可能会运行。

但我想要明白为什么会出现这个错误是非常重要的。如果您仔细查看jenkins-core库,您会发现它有一个&#34;提供的&#34;依赖于servlet API。在简单的单词中提供的依赖意味着库(在您的情况下为jenkins-core)是在假设servlet API jar将出现在生产环境的类路径中的情况下编译的 - 例如在servlet容器中运行的Web应用程序中使用lib时。

我猜你将你的groovy脚本作为一个独立的应用程序运行,这就是你收到错误的原因。并且......免责声明 - 我不知道在独立应用程序中是否使用jenkins-core,但是: - )。