gpt4 book ai didi

java - Docker主机之间的Java类路径排序不一致

转载 作者:行者123 更新时间:2023-12-02 18:07:27 27 4
gpt4 key购买 nike

我正在Docker镜像中运行Java服务,该服务执行以下操作:
java -server -cp 'libs/*'
奇怪的是,我发现它会在我的本地计算机上启动,而不是在开发服务器上启动,在该服务器上会给出NoSuchMethodError

经过一番挖掘后,我发现libs目录中同时存在JPA的2.0版和2.1版。尽管这本身就是一个问题(并且很容易解决),但是它并不能解释这种不一致的情况,因此我决定打印出:

(ClassLoader.getSystemClassLoader() as URLClassLoader).urLs
.forEach(::println) // kotlin

我发现两台机器上的lib顺序不同。但是,同一台计算机上的后续图像运行之间是一致的,因此不是随机的。

尽管我现在知道为什么镜像无法在开发服务器上启动,并且可以解决当前问题,但我的确想知道:为什么该顺序在Docker主机之间不一致?可重现性和一致性不是Docker的重点之一吗?类路径的顺序是否可以取决于IP,主机名或已安装的主机目录(在不相关的位置)之类的挑剔的东西?

最佳答案

我只是碰到了这一点,发现JVM使用了一种在类路径上解析通配符的方法,该方法不提供任何顺序保证。
看到它使用call to readdir对通配符表示的内容进行迭代,并且readdir不保证任何特定顺序:

The order in which filenames are read by successive calls to readdir() depends on the filesystem implementation; it is unlikely that the names will be sorted in any fashion.


您可以通过在类路径上显式排序jar而不是使用通配符来避免排序问题。在我们的案例中,在发现主机系统的特定差异(从readdir产生不同结果)之前,我们删除了重复的jar。

关于java - Docker主机之间的Java类路径排序不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53635602/

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