Якщо jar знаходиться на вашому classpath, і ви знаєте його Main class, ви можете просто викликати основний клас. Використовуючи DITA-OT як приклад:
import org.dita.dost.invoker.CommandLineInvoker;
....
CommandLineInvoker.main('-f', 'html5', '-i', 'samples/sequence.ditamap', '-o', 'test')
Зауважте, що це змусить підлеглу банку розділити простір пам’яті та класний шлях із вашою баночкою з усім потенціалом для перешкод, які можуть спричинити. Якщо ви не хочете, щоб цей матеріал забруднився, у вас є інші варіанти, як було сказано вище, а саме:
- створіть новий ClassLoader з баночкою в ньому. Це більш безпечно; ви можете принаймні виділити знання нового банку до основного завантажувача, якщо ви архітектуруєте речі з тими знаннями, які ви будете використовувати чужих банок. Це ми робимо в своєму магазині для нашої системи плагінів; основне додаток - це крихітна оболонка із заводом ClassLoader, копія API та знання, що реальний додаток - це перший плагін, для якого він повинен створити ClassLoader. Плагіни - це пара банок - інтерфейс та реалізація -, які поєднуються між собою. Усі ClassLoaders поділяють всі інтерфейси, тоді як кожен ClassLoader має лише знання про власну реалізацію. Стек трохи складний, але він проходить всі тести і працює чудово.
- використання
Runtime.getRuntime.exec(...)
(який повністю ізолює банку, але має нормальне значення "знайти додаток", "уникнути своїх рядків праворуч", "WTF-орієнтований на платформу" та "OMG System Threads" підводні камені запущених системних команд.