При упаковке Java-проектов мы полагаемся на Maven, но я полагаю, что проблемы с Gradle или Ant одинаковы.Иногда мы сталкиваемся с проблемой, известной как «Jar Hell», если одна зависимость зависит от транзитивной зависимости в другой версии, чем другая зависимость, как часто встречающийся пример - guava.Если загруженная библиотека имеет конфликтующие пути к классам или функции, вы получите печально известные ClassNotFoundException
или NoSuchMethodError
во время выполнения.(«забавно», что одно исключение, а другое ошибка между прочим ^^)
Я знаю, что проблемы можно несколько решить с помощью dependencyManagement
, используя Maven Shade Plugin иобнаружен с помощью плагина Enforcer, например, "Конвергенция зависимостей".Мне также известны многие вопросы, связанные с этими методами, например: SO Link .
Теперь мой вопрос: как мы можем обнаружить эти ошибки во время компиляции?Как я понимаю, сам java-компилятор javac
на самом деле не имеет механизмов для упаковки приложений, но я бы предположил, что jar
упаковщик, такой как shade
, assembly
или тому подобное, сможет обнаружить, все ликлассы и методы присутствуют?Очевидно, предполагая, что никакие классы не будут загружены во время выполнения.(Это касается нас, поскольку мы в основном создаем автономные приложения и не имеем дело с серверами приложений, такими как JBoss / Wildfly)