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