Unable to use CliBuilder in a job-DSL

156 views
Skip to first unread message

Xavier Xemaire

unread,
Mar 23, 2017, 9:02:31 AM3/23/17
to job-dsl-plugin
I would like to use CliBuilder to parse lines of a steerfile to build jobs.
But I get an exception:
java.lang.NoClassDefFoundError: org/apache/commons/cli/ParseException


I know that to be able to use CliBuilder with GroovyShell, I need to add commons-cli.jar (here Version 1.2) in the field: Additional classpath.
But I still get the exception.

My Job DSL:
import org.apache.commons.cli.*
def cli = new CliBuilder(usage: 'Hello World')

def giturl = 'https://github.com/quidryan/aws-sdk-test.git'
job
("DSL-Tutorial-1-Test-1") {
    scm
{
        git
(giturl)
   
}
    steps
{
        maven
("test -Dtest.suite=1")
   
}
}

The exception:

Processing provided DSL script
FATAL
: org/apache/commons/cli/ParseException
java.lang.NoClassDefFoundError: org/apache/commons/cli/ParseException
        at java
.lang.Class.getDeclaredConstructors0(Native Method)
        at java
.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
        at java
.lang.Class.getDeclaredConstructors(Class.java:2020)
        at org
.codehaus.groovy.reflection.CachedClass$2$1.run(CachedClass.java:77)
        at java
.security.AccessController.doPrivileged(Native Method)
        at org
.codehaus.groovy.reflection.CachedClass$2.initValue(CachedClass.java:74)
        at org
.codehaus.groovy.reflection.CachedClass$2.initValue(CachedClass.java:72)
        at org
.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:49)
        at org
.codehaus.groovy.util.LazyReference.get(LazyReference.java:36)
        at org
.codehaus.groovy.reflection.CachedClass.getConstructors(CachedClass.java:271)
        at groovy
.lang.MetaClassImpl.<init>(MetaClassImpl.java:220)
        at groovy
.lang.MetaClassImpl.<init>(MetaClassImpl.java:230)
        at groovy
.lang.MetaClassRegistry$MetaClassCreationHandle.createNormalMetaClass(MetaClassRegistry.java:171)
        at groovy
.lang.MetaClassRegistry$MetaClassCreationHandle.createWithCustomLookup(MetaClassRegistry.java:161)
        at groovy
.lang.MetaClassRegistry$MetaClassCreationHandle.create(MetaClassRegistry.java:144)
        at org
.codehaus.groovy.reflection.ClassInfo.getMetaClassUnderLock(ClassInfo.java:253)
        at org
.codehaus.groovy.reflection.ClassInfo.getMetaClass(ClassInfo.java:285)
        at org
.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.getMetaClass(MetaClassRegistryImpl.java:258)
        at org
.codehaus.groovy.runtime.InvokerHelper.getMetaClass(InvokerHelper.java:881)
        at org
.codehaus.groovy.runtime.callsite.CallSiteArray.createCallConstructorSite(CallSiteArray.java:87)
        at org
.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:60)
        at org
.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:235)
        at org
.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:247)
        at script
.run(script:2)
        at script$run
.call(Unknown Source)
        at org
.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
        at org
.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
        at org
.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117)
        at javaposse
.jobdsl.dsl.AbstractDslScriptLoader.runScriptEngine(AbstractDslScriptLoader.groovy:111)
        at sun
.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun
.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun
.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java
.lang.reflect.Method.invoke(Method.java:498)
        at org
.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
        at groovy
.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
        at org
.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:384)
        at groovy
.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1024)
        at org
.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:69)
        at org
.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:52)
        at org
.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154)
        at org
.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:174)
        at javaposse
.jobdsl.dsl.AbstractDslScriptLoader$_runScripts_closure1.doCall(AbstractDslScriptLoader.groovy:58)
        at sun
.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun
.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun
.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java
.lang.reflect.Method.invoke(Method.java:498)
        at org
.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
        at groovy
.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
        at org
.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
        at groovy
.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1024)
        at groovy
.lang.Closure.call(Closure.java:414)
        at groovy
.lang.Closure.call(Closure.java:430)
        at org
.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2030)
        at org
.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2015)
        at org
.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2068)
        at org
.codehaus.groovy.runtime.dgm$164.invoke(Unknown Source)
        at org
.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:274)
        at org
.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56)
        at org
.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
        at org
.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
        at org
.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
        at javaposse
.jobdsl.dsl.AbstractDslScriptLoader.runScripts(AbstractDslScriptLoader.groovy:45)
        at javaposse
.jobdsl.plugin.ExecuteDslScripts.perform(ExecuteDslScripts.java:251)
        at hudson
.tasks.BuildStepCompatibilityLayer.perform(BuildStepCompatibilityLayer.java:78)
        at hudson
.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20)
        at hudson
.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:779)
        at hudson
.model.Build$BuildExecution.build(Build.java:205)
        at hudson
.model.Build$BuildExecution.doRun(Build.java:162)
        at hudson
.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:534)
        at hudson
.model.Run.execute(Run.java:1728)
        at hudson
.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
        at hudson
.model.ResourceController.execute(ResourceController.java:98)
        at hudson
.model.Executor.run(Executor.java:404)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.cli.ParseException
        at java
.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java
.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at java
.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at org
.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:450)
        at org
.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:403)
       
... 73 more

My Configuration:
Jenkins: 2.32.2
Job-DSL: 1.58
Plattform: RHEL 7.1


I have run the job builder locally on my PC (see adding additionalClasspath to standalone scripts (javaposse.jobdsl.Run) ) without problem (the script is in d:\temp\test.groovy):

set CLI_JAR=d:\repos\DEPLOY\jenkins_dsl\job-DSL\download-cli\target\runtime\libs\commons-cli-1.2.jar

set DSL_LIB=d:\repos\3pp\job-dsl-plugin\job-dsl-core\build\one-jar-build\lib
set DSL_MAIN_JAR=d:\repos\3pp\job-dsl-plugin\job-dsl-core\build\one-jar-build\main\main.jar
java -cp %CLI_JAR%;%DSL_LIB%\*;%DSL_MAIN_JAR% javaposse.jobdsl.Run d:\temp\test.groovy
Processing DSL script test.groovy
Mrz 23, 2017 12:42:48 PM org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoCachedMethodSiteNoUnwrap invoke
Information: From d:\temp\test.groovy, Generated item: GeneratedJob{name='DSL-Tutorial-1-Test-1'}

Is there some known restrictions with the feature additional Classpath on jenkins Server?
Is there a way to use CliBuilder in a job-DSL?

Thanks in advance
Xavier

Daniel Spilker

unread,
Mar 29, 2017, 12:23:25 PM3/29/17
to job-dsl...@googlegroups.com
Check you additional classpath setting. If the classpath points to a non-existing JAR file, the file will be ignored and the classes are not found.

This scripts works for me:

import org.apache.commons.cli.*
 
CommandLineParser parser = new BasicParser()

Daniel

--
You received this message because you are subscribed to the Google Groups "job-dsl-plugin" group.
To unsubscribe from this group and stop receiving emails from it, send an email to job-dsl-plugin+unsubscribe@googlegroups.com.
To post to this group, send email to job-dsl-plugin@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/job-dsl-plugin/37ee52c9-b54b-4f07-9e3b-36f37d8f1acd%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Xavier Xemaire

unread,
Mar 30, 2017, 11:04:45 AM3/30/17
to job-dsl-plugin
Hi Daniel,

Thank you very much for your answer.

Your script works for me too. But when I use CliBuilder I get the exception.
So it seems that there is a problem with CliBuilder but not with the classes that are defined in commons-cli.jar:
I was also able to create a new 'Options' Object.

In the meantime I do not use CliBuilder any longer.
I'm a newbie in groovy and I don't understand why it is possible to use the CliBuilder with the job builder locally and not in the jenkins-server.
This seems to be a problem with the black magic of class loading of jenkins.



Reply all
Reply to author
Forward
0 new messages