Я запускаю сервис Java в образе Docker, который делает что-то вроде этого:
java -server -cp 'libs/*'
Странно, я обнаружил, что он запускается на моей локальной машине, но нена сервере разработчиков, где он дал бы NoSuchMethodError
.
. После некоторого копания я обнаружил, что в директории libs есть версия 2.0 и 2.1 JPA.Хотя это само по себе является проблемой (и ее легко исправить), это не объясняет несоответствия, поэтому я решил напечатать:
(ClassLoader.getSystemClassLoader() as URLClassLoader).urLs
.forEach(::println) // kotlin
Где я обнаружил, что порядок библиотек у обоих был разныммашины.Однако он был последовательным между последующими запусками образа на той же машине, поэтому не случайным.
Хотя теперь я знаю, почему образ не запускается на сервере разработки, и я могу решить эту проблему вЭто заставляет меня задуматься: почему этот порядок не одинаков для хостов Docker?Разве воспроизводимость и последовательность не являются одним из главных аспектов Docker?Может ли порядок пути к классам зависеть от таких хитроумных вещей, как IP, имя хоста или подключенные каталоги хостов (в несвязанных местах)?