gpt4 book ai didi

java - 静态变量在 Maven jar 和 eclipse runnable jar 中的行为不同

转载 作者:行者123 更新时间:2023-12-02 03:00:35 25 4
gpt4 key购买 nike

我需要使用在外部类中初始化的变量以在内部类中使用。所以我使用了静态变量。这也是Flink应用程序。

当构建为 eclipse-export-runnable jar 时——它工作正常——变量的状态保留

当构建为 maven 或 eclipse-export-jar 时——它失败——变量状态丢失

FileMonitorWrapper.fileInputDir--values 为 ""并且不获取传递的值。

听起来很奇怪......有什么想法

static transient String fileInputDir="";
static transient String fileArchiveDir="";
@SuppressWarnings("serial")
public DataStream<String> ScanDirectoryForFile(String inputDir, String inputFilePattern,String archiveDir, StreamExecutionEnvironment env) {
try {
FileMonitorWrapper.fileArchiveDir = archiveDir;
FileMonitorWrapper.fileInputDir = inputDir;
filteredDirFiles = dirFiles.filter(new FileMapper());
.
.
.
}
}



@SuppressWarnings("serial")
static class FileMapper implements FilterFunction<TimestampedFileInputSplit>{
@Override
public boolean filter(TimestampedFileInputSplit value) throws Exception {

if(value.toString().contains("done"))
FileMonitorWrapper.doneFound = true;
if(value.toString().contains("dat"));
FileMonitorWrapper.datFound = true;
if(FileMonitorWrapper.datFound && FileMonitorWrapper.doneFound) {
try {
if(value.getPath().toString().contains("done")) {
Files.move(Paths.get(FileMonitorWrapper.fileInputDir+"\\"+value.getPath().getName()),
Paths.get(FileMonitorWrapper.fileArchiveDir+"\\"+value.getPath().getName()));
}
}catch(Exception e){
e.printStackTrace();
}

return (!value.toString().contains("done"));
}
else
return false;
}
}

}

最佳答案

一般来说,POJO 的序列化不会捕获静态变量的状态。据我了解,Flink 序列化没有什么不同。

因此,当您说静态变量状态在某些情况下“保留”时,我认为您误解了证据。其他的事情是保留静态变量的状态,或者将它们初始化为“之前”和“之后”情况下碰巧相同的值。

<小时/>

为什么我这么确定?问题是序列化静态变量没有多大意义。考虑一下这个

public class Cat {
private static List<Cat> allCats = new ArrayList<>();
private String name;
private String colour;

public Cat(...) {
...
allCats.add(this);
}
...
}

Cat fluffy = new Cat("fluffy", ...);
Cat claus = new Cat("claus", ...);

如果Cat的静态字段已连载:

  1. 每次串行流包含 Cat它将(必须)包含迄今为止创建的所有猫。

  2. 每当我反序列化包含 Cat 的流时,我还需要反序列化 ArrayList<Cat> 。我用它做什么?

    • 我要覆盖allCats吗?用它? (并且失去了其他猫的踪迹?)
    • 我要把它扔掉吗?
    • 我是否尝试合并列表? (如何?什么语义?我有两只猫被称为“蓬松”吗?)

基本上,这个场景没有任何语义可以很好地一般。 (通用)解决方案是不序列化 static变量。

关于java - 静态变量在 Maven jar 和 eclipse runnable jar 中的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57054261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com