0 голосов
 
1313 просмотров
17.09.2016 / 06:21  Death

Как запустить другой jar, так что бы он влиял на код того от куда запускают?

Вот захотелось сделать что-то на подобии модов для моей игры, или модули. Что бы я просто выпустил само приложение, и оставалось только другим скачать одновлённый модуль и запихнуть его в папку с модулями, или же в самой программе, выбрать модуль, а там уже сама программа его разместит, там где нужно. Вопрос: как сделать так что бы эти модули влияли на код?
Например у нас есть в главной программе класс со списком врагов, там есть 3 типа врага, когда подключен модуль, то сначала загрузится сама программы, а потом модули, как модуль загрузился, то добавилось ещё 5 типов врагов.
Ответы
 
2 голоса
 
# 17.09.2016 / 12:09  aNNiMON
Допустим, у тебя есть app.jar и ты хочешь добавлять модули plugin1.jar, plugin2.jar.
При запуске app.jar нужно добавить модули в classpath:
  1. java -cp plugin1.jar;plugin2.jar -jar app.jar
Тогда ты сможешь получить доступ к классам из plugin1.jar и plugin2.jar.
Написав скрипт или программу для запуска приложения, ты можешь просканировать файлы в нужной папке и сделать автоматическое добавление модулей в classpath, сделав запуск программы ещё проще. Там же можно сделать и включение/отключение модулей.

Следующая часть — создание интерфейса для модулей в программе.
Нужен единый интерфейс, который предоставляет всем модулям необходимые данные и получает от них информацию.
  1. interface Module {
  2.     String getName();
  3.     List<String> getInfo(String type);
  4. }
В данном примере каждый модуль обязан реализовать интерфейс Module и предоставить информацию о названии модуля и передать какие-то данные в зависимости от полученного type.
Программа передаёт String type модулю, а взамен получает список строк. Методов в интерфейсе может быть много, самих интерфейсов тоже может быть много, какие данные передавать в модули, а какие получать решаешь сам в зависимости от задачи.

Реализация плагина может быть такая:
  1. public class ReverseModule implements Module {
  2.     public String getName() {
  3.         return "Reverser";
  4.     }
  5.  
  6.     public List<String> getInfo(String type) {
  7.         return Arrays.asList(new StringBuilder(type).reverse().toString());
  8.     }
  9. }

Далее, основное приложение должно знать, где в модуле находится класс, реализующий интерфейс Module. Это может быть заранее прописано в основном приложении, либо читаться из файла конфигурации, либо обусловить пакет, в котором будут храниться модули, как сам решишь.

Когда мы знаем, где находится класс модуля, мы можем его запустить. Для этого используется Reflection API.
  1. Class<?> moduleClass = Class.forName("com.modules.ReverseModule");
  2. Module module = (Module) moduleClass.newInstance();
  3.  
  4. String moduleName = module.getName(); // "Reverser"
  5. List<String> info = module.getInfo("Wladimir134679"); // ["976431rimidalW"]
Изм. aNNiMON от 17.09.2016 / 12:13
 
0 голосов
 
# 17.09.2016 / 21:56  Витаминыч
Можно погуглить исходники Forge ModLoader для майнкрафта, как пример загрузчика модов и т.д.
18.09.2016 / 05:56  Death
Я делал моды для майнкрафта. Так что знаю как там идёт загрузка. Но сборка самого файла .jar будет ручной, так как в forge там есть батнки собирающие.
 
0 голосов
 
# 17.09.2016 / 10:17  Naik
При запуске добавлять все модули в classpath либо грузить модули через ClassLoader
17.09.2016 / 10:39  Death
Можно по подробней? Как и что подключать и где?
Всего: 3

Реклама

Мы в соцсетях

tw tg yt gt