java - Jenkins plugin can't access file on slave -
through own plugin, need know existence of file in workspace of jenkins slave. file can't found whereas exists on slave (d:\workspace\job_name\test.txt).
public class mybuilder extends builder implements serializable { private static final long serialversionuid = 1l; public boolean perform(abstractbuild<?, ?> build, launcher launcher, buildlistener listener) throws interruptedexception, ioexception { filepath fp = new filepath(build.getworkspace(), "test.txt"); string result = fp.act(new filecallable<string>() { private static final long serialversionuid = 1l; @override public string invoke(file file, virtualchannel channel) throws ioexception, interruptedexception { if (file.getabsolutefile().exists()){ return file.getname() + " exists."; } else { return file.getname() + " doesn't exist."; } } }); system.out.println("result: " + result); result:
fatal: remote file operation failed: d:\workspace\job_name\test.txt @ hudson.remoting.channel@182752b:slave hudson.util.ioexception2: remote file operation failed: d:\workspace\job_name\test.txt @ hudson.remoting.channel@182752b:slave @ hudson.filepath.act(filepath.java:900) @ hudson.filepath.act(filepath.java:877) @ com.company.tlb.proj.mybuilder.perform(unknown source) @ hudson.tasks.buildstepmonitor$1.perform(buildstepmonitor.java:19) @ hudson.model.abstractbuild$abstractbuildexecution.perform(abstractbuild.java:804) @ hudson.model.build$buildexecution.build(build.java:199) @ hudson.model.build$buildexecution.dorun(build.java:160) @ hudson.model.abstractbuild$abstractbuildexecution.run(abstractbuild.java:586) @ hudson.model.run.execute(run.java:1575) @ hudson.model.freestylebuild.run(freestylebuild.java:46) @ hudson.model.resourcecontroller.execute(resourcecontroller.java:88) @ hudson.model.executor.run(executor.java:237) caused by: java.io.ioexception: unable serialize hudson.filepath$filecallablewrapper@18b91cb @ hudson.remoting.userrequest.serialize(userrequest.java:166) @ hudson.remoting.userrequest.<init>(userrequest.java:62) @ hudson.remoting.channel.call(channel.java:671) @ hudson.filepath.act(filepath.java:893) ... 11 more caused by: java.io.notserializableexception: java.io.printstream @ java.io.objectoutputstream.writeobject0(objectoutputstream.java:1164) @ java.io.objectoutputstream.defaultwritefields(objectoutputstream.java:1518) @ java.io.objectoutputstream.writeserialdata(objectoutputstream.java:1483) @ java.io.objectoutputstream.writeordinaryobject(objectoutputstream.java:1400) @ java.io.objectoutputstream.writeobject0(objectoutputstream.java:1158) @ java.io.objectoutputstream.defaultwritefields(objectoutputstream.java:1518) @ java.io.objectoutputstream.writeserialdata(objectoutputstream.java:1483) @ java.io.objectoutputstream.writeordinaryobject(objectoutputstream.java:1400) @ java.io.objectoutputstream.writeobject0(objectoutputstream.java:1158) @ java.io.objectoutputstream.defaultwritefields(objectoutputstream.java:1518) @ java.io.objectoutputstream.writeserialdata(objectoutputstream.java:1483) @ java.io.objectoutputstream.writeordinaryobject(objectoutputstream.java:1400) @ java.io.objectoutputstream.writeobject0(objectoutputstream.java:1158) @ java.io.objectoutputstream.writeobject(objectoutputstream.java:330) @ hudson.remoting.userrequest._serialize(userrequest.java:155) @ hudson.remoting.userrequest.serialize(userrequest.java:164) ... 14 more what doing wrong?
links:
you're passing anonymous inner-class act(...) has implicit reference parent class, mybuilder. guess though mybuilder implements serializable, can't serialized due reference object isn't serializable (e.g. java.io.printstream stack-trace indicates).
make instance of filecallable<string> static inner class rid of implicit reference parent:
private static class myfilecallable implements filecallable<string> { private static final long serialversionuid = 1l; @override public string invoke(file file, virtualchannel channel) throws ioexception, interruptedexception { if (file.getabsolutefile().exists()){ return file.getname() + " exists."; } else { return file.getname() + " doesn't exist."; } } } and use instead:
string result = fp.act(new myfilecallable()); update: here's link java's nested classes tutorial outlines relationship between instance of inner class enclosing outer class instance:
an instance of innerclass can exist within instance of outerclass , has direct access methods , fields of enclosing instance.
this explained in more technical terms in jls (§8.1.3 inner classes , enclosing instances).
with in mind, quote serializable doc explains why encountered notserializableexception:
when traversing graph, object may encountered not support serializable interface. in case notserializableexception thrown , identify class of non-serializable object.
Comments
Post a Comment