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

Popular posts from this blog

How to mention the localhost in android -

php - Calling a template part from a post -

c# - String.format() DateTime With Arabic culture -