Если jar находится в вашем пути к классам, и вы знаете его основной класс, вы можете просто вызвать основной класс. На примере DITA-OT:
import org.dita.dost.invoker.CommandLineInvoker;
....
CommandLineInvoker.main('-f', 'html5', '-i', 'samples/sequence.ditamap', '-o', 'test')
Обратите внимание, что это приведет к тому, что подчиненный jar будет совместно использовать пространство памяти и путь к классам с вашим jar, со всеми возможными помехами, которые могут вызвать. Если вы не хотите, чтобы этот материал был загрязнен, у вас есть другие варианты, как упоминалось выше, а именно:
- создайте новый ClassLoader с jar в нем. Это более безопасно; вы можете по крайней мере изолировать знания нового jar-файла от основного загрузчика классов, если вы проектируете вещи, зная, что вы будете использовать инопланетные jar-файлы. Это то, что мы делаем в моем магазине для нашей системы плагинов; основное приложение - это крошечная оболочка с фабрикой ClassLoader, копией API и знанием того, что реальное приложение - это первый плагин, для которого оно должно создать ClassLoader. Плагины - это пара jar-файлов - интерфейс и реализация, - которые скреплены вместе. Все загрузчики классов совместно используют все интерфейсы, в то время как каждый загрузчик классов знает только о своей собственной реализации. Стек немного сложный, но он проходит все тесты и прекрасно работает.
- use
Runtime.getRuntime.exec(...)
(который полностью изолирует jar-файл, но имеет обычные ошибки запуска системных команд «найти приложение», «экранировать строки правильно», «специфичный для платформы WTF» и «OMG System Threads».