1

我编写了一个非常简单的 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'
}

我根本不知道应该责备什么以及为什么我不能运行脚本。

任何帮助深表感谢!

4

1 回答 1

0

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

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

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

但我想理解你为什么会得到这个错误是相当重要的。如果您仔细查看jenkins-core库,您会注意到它具有对 servlet API 的“提供”依赖项。简单地说,提供的依赖意味着库(在您的情况下为 jenkins-core)是在假设 servlet API jar 将存在于您的生产环境的类路径中的情况下编译的 - 例如,在运行的 Web 应用程序中使用 lib 时在 servlet 容器中。

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

于 2018-06-18T18:30:24.293 回答