Хороший ответ Джима - вы называете классы, которые хотите использовать, и все они соответствуют общему API. Однако данное решение предполагает, что все классы уже доступны в пути к классам приложения. Возможно, вы захотите иметь возможность добавить больше реализаций позже, например, после установки приложения.
Если это так, то вам, вероятно, придется использовать собственный загрузчик классов. Например, вы могли бы позволить людям помещать файлы jar в определенную папку где-нибудь и добавлять имена классов реализаций в файл свойств. Затем вам потребуется пользовательский загрузчик классов, который может загружать классы из jar-файлов внутри этой папки, и вы будете использовать этот загрузчик классов для загрузки классов (например, используя Class.forName (className, classLoader)).
Фактически, если у вас есть файл загрузчика классов для каждого файла JAR, вы можете иметь несколько классов с одинаковыми именами в файлах JAR, так как загрузчик классов определяет границы имен классов. Это в значительной степени то, что делает OSGI.
Вот некоторый код, относящийся к загрузке классов из jars:
http://sourceforge.net/projects/jcloader/
http://www.javaworld.com/javatips/jw-javatip70.html