Groovy 由于 NoClassDefFoundError,脚本不会 运行
Groovy script won't run due to NoClassDefFoundError
我写了一个非常简单的 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'
}
我根本无法弄清楚是什么原因以及为什么我不能 运行 脚本。
非常感谢任何帮助!
显然您错过的是 servlet API。例如:
dependencies {
compile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0'
}
如果你把它放在你的依赖项中,你的脚本很可能会 运行。
但我想了解为什么会出现此错误非常重要。如果您仔细查看 jenkins-core 库,您会注意到它对 servlet API 具有 "provided" 依赖性。用简单的话来说,提供的依赖意味着库(在你的情况下是 jenkins-core )是在假设 servlet API jar 将出现在你的生产环境的 class 路径中编译的 - 例如在 servlet 容器内的 Web 应用程序 运行ning 中使用库时。
我猜你 运行 你的 groovy 脚本是一个独立的应用程序,这就是你收到错误的原因。并且... 免责声明 - 我不知道是否打算在独立应用程序中使用 jenkins-core :-)。
我写了一个非常简单的 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'
}
我根本无法弄清楚是什么原因以及为什么我不能 运行 脚本。
非常感谢任何帮助!
显然您错过的是 servlet API。例如:
dependencies {
compile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0'
}
如果你把它放在你的依赖项中,你的脚本很可能会 运行。
但我想了解为什么会出现此错误非常重要。如果您仔细查看 jenkins-core 库,您会注意到它对 servlet API 具有 "provided" 依赖性。用简单的话来说,提供的依赖意味着库(在你的情况下是 jenkins-core )是在假设 servlet API jar 将出现在你的生产环境的 class 路径中编译的 - 例如在 servlet 容器内的 Web 应用程序 运行ning 中使用库时。
我猜你 运行 你的 groovy 脚本是一个独立的应用程序,这就是你收到错误的原因。并且... 免责声明 - 我不知道是否打算在独立应用程序中使用 jenkins-core :-)。