Другие упоминали несколько хороших инструментов, вероятно, наиболее распространенным является maven. Плющ еще один, который больше ориентирован только на управление зависимостями. Лично я использую gradle, который обладает некоторыми из лучших функций под знакомой классной оболочкой ... который все еще развивается и местами документируется. ;)
Следует помнить, что эти инструменты обрабатывают транзитивные зависимости. В вашем примере C является транзитивной зависимостью A, потому что A зависит от B, который зависит от C. Некоторые из этих инструментов сборки будут обрабатывать этот тип зависимости по-разному, и это может вас удивить, когда вы меньше всего этого ожидаете.
Например, если A на самом деле ссылается на код из C, то есть: у него есть зависимость времени компиляции от C, то ваши настройки A-> B-> C будут работать в чем-то вроде Maven. С другой стороны, gradle также заставит вас объявить, что A зависит от C ... поскольку это так. Зависимости во время выполнения полностью разрешаются в любом случае.
Сюрприз наступает, когда вы транзитивно включаете что-то в течение нескольких месяцев, и часть вашего кода основана на аспектах C, и вы решаете, что вам больше не нужна зависимость от B. Внезапно ваш код не будет собран, пока вы не выясните, что вам нужна указанная зависимость A-> C. В этом примере это довольно просто обнаружить, но иногда это не так.
И если от такого разговора ваша голова немного плавает, и вы не планируете, что ваш проект станет намного сложнее ... тогда вы, вероятно, можете просто придерживаться того, что вы делаете какое-то время. Как уже упоминали другие, это правильный способ сделать это без помощи инструмента.