Java 詹金斯插件可以';无法访问节点上的文件

Java 詹金斯插件可以';无法访问节点上的文件,java,jenkins,jenkins-plugins,Java,Jenkins,Jenkins Plugins,通过我自己的插件,我需要知道Jenkins节点工作区中是否存在文件。但是无法找到该文件,因为它确实存在于节点上(D:\workspace\JOB\u NAME\test.txt) 公共类MyBuilder扩展生成器实现可序列化{ 私有静态最终长serialVersionUID=1L; 公共布尔执行(AbstractBuild、Launcher、Launcher、BuildListener) 抛出InterruptedException,IOException{ FilePath fp=新文件路径

通过我自己的插件,我需要知道Jenkins节点工作区中是否存在文件。但是无法找到该文件,因为它确实存在于节点上(
D:\workspace\JOB\u NAME\test.txt

公共类MyBuilder扩展生成器实现可序列化{
私有静态最终长serialVersionUID=1L;
公共布尔执行(AbstractBuild、Launcher、Launcher、BuildListener)
抛出InterruptedException,IOException{
FilePath fp=新文件路径(build.getWorkspace(),“test.txt”);
String result=fp.act(new FileCallable()){
私有静态最终长serialVersionUID=1L;
@凌驾
公共字符串调用(文件、虚拟通道通道)引发IOException、InterruptedException{
如果(file.getAbsoluteFile().exists()){
返回文件。getName()+“存在。”;
}否则{
返回文件。getName()+“不存在。”;
}
}
});
System.out.println(“结果:+result”);
结果:

FATAL: remote file operation failed: D:\workspace\JOB_NAME\test.txt at hudson.remoting.Channel@182752b:Node
hudson.util.IOException2: remote file operation failed: D:\workspace\JOB_NAME\test.txt at hudson.remoting.Channel@182752b:Node
    at hudson.FilePath.act(FilePath.java:900)
    at hudson.FilePath.act(FilePath.java:877)
    at com.company.tlb.proj.MyBuilder.perform(Unknown Source)
    at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:19)
    at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:804)
    at hudson.model.Build$BuildExecution.build(Build.java:199)
    at hudson.model.Build$BuildExecution.doRun(Build.java:160)
    at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:586)
    at hudson.model.Run.execute(Run.java:1575)
    at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46)
    at hudson.model.ResourceController.execute(ResourceController.java:88)
    at hudson.model.Executor.run(Executor.java:237)
Caused by: java.io.IOException: Unable to serialize hudson.FilePath$FileCallableWrapper@18b91cb
    at hudson.remoting.UserRequest.serialize(UserRequest.java:166)
    at hudson.remoting.UserRequest.<init>(UserRequest.java:62)
    at hudson.remoting.Channel.call(Channel.java:671)
    at hudson.FilePath.act(FilePath.java:893)
    ... 11 more
Caused by: java.io.NotSerializableException: java.io.PrintStream
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
    at hudson.remoting.UserRequest._serialize(UserRequest.java:155)
    at hudson.remoting.UserRequest.serialize(UserRequest.java:164)
    ... 14 more
致命:远程文件操作失败:hudson.remoting上的D:\workspace\JOB\u NAME\test.txt。Channel@182752b:节点
hudson.util.IOException2:远程文件操作失败:位于hudson.remoting的D:\workspace\JOB\u NAME\test.txt。Channel@182752b:节点
在hudson.FilePath.act(FilePath.java:900)
位于hudson.FilePath.act(FilePath.java:877)
位于com.company.tlb.proj.MyBuilder.perform(未知源)
在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)
运行(Executor.java:237)
原因:java.io.IOException:无法序列化hudson.FilePath$FileCallableWrapper@18b91cb
在hudson.remoting.UserRequest.serialize(UserRequest.java:166)
在hudson.remoting.UserRequest.(UserRequest.java:62)
在hudson.remoting.Channel.call(Channel.java:671)
位于hudson.FilePath.act(FilePath.java:893)
…还有11个
原因:java.io.NotSerializableException:java.io.PrintStream
位于java.io.ObjectOutputStream.WriteObject 0(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.\u序列化(UserRequest.java:155)
位于hudson.remoting.UserRequest.serialize(UserRequest.java:164)
…还有14个
我做错了什么

链接:


您正在将一个匿名内部类传递给
act(…)
,该类隐式引用其父类
MyBuilder
。我的猜测是,即使
MyBuilder
实现了
Serializable
,但由于引用了另一个不可
Serializable
的对象,它实际上无法序列化(如堆栈跟踪显示的
java.io.PrintStream

FileCallable
的实例设置为静态内部类,以消除对其父类的隐式引用:

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.";
    }
  }
}
更新: 下面是指向Java教程的链接,该教程概述了内部类的实例与其封闭的外部类实例之间的关系:

InnerClass的实例只能存在于的实例中 OuterClass并可以直接访问its的方法和字段 封闭实例

JLS()中也有更多的技术术语对此进行了解释

考虑到这一点,以下引用解释了您遇到
NotSerializableException
的原因:

在遍历图形时,可能会遇到一个不存在的对象 支持序列化接口 将引发NotSerializableException,并将标识 不可序列化的对象


就是这样……非常感谢。在我授予你奖金之前,你能告诉我一个解释这个微妙之处的官方文件吗?我找不到该告诉谷歌什么!@StéphaneBruckert很高兴我能帮上忙!用其他参考资料更新了我的答案。很棒的帖子。享受这个+125!
String result = fp.act(new MyFileCallable());