В вашем приложении могут быть разные версии одного и того же класса (или библиотеки). Это не большая проблема, вам просто нужно использовать разные загрузчики классов для своих библиотек.
Вам нужно создать URLClassLoader для загрузки вашего тестового приложения с открытым исходным кодом (родительский загрузчик классов будет системным загрузчиком классов), возможно, другой загрузчик классов для клиентской версии 3.1 как дочерний по отношению к первому. Затем удалите эти библиотеки из пути к классам, разрешите и «запустите» основной класс из приложения с открытым исходным кодом. Он должен либо работать напрямую, либо, по крайней мере, давать достаточно подсказок (NoClassDefFoundError) для пропущенных шагов (раньше не пробовал, извините, это довольно теоретически). Взгляните на JavaDoc для класса java.lang.Classloader
(и его расширителей)
Если бы требовалось использовать разные версии одной и той же библиотеки в одном приложении, я бы использовал OSGi в качестве платформы, потому что там вы получаете эту функциональность бесплатно. Клиентский комплект может зависеть от версии клиента 2.0.2, тестовый комплект - от версии клиента 3.1. Вам просто нужно отредактировать файлы Manifest и запустить приложение с каркасом OSGi (например, Equinox).