Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Плагин для нескольких версий

Bind

Активный участник
Пользователь
Баллы
68
Всем привет,

уже 4 день не могу понять как эта система работает: https://github.com/mbax/AbstractionExamplePlugin

Мне нужно сделать свой плагин для нескольких версий сразу (например: 1.8.1 и 1.8.3).

Может кто показать чистый и понятный образец? Буду очень благодарен :)
 
Технически плагин должен работать на 1.8.1 и 1.8.3 без всяких адаптаций. Если в этих версиях минимальные различия. У меня плагины с API 1.7.9 работают на 1.5.2 .
 
О, годный пример, а то я на словах каждый раз пытаюсь объяснять :)
@fromgate
Форкану-ка я его.

По теме: это и есть чистейший образец. Основной проект (pom.xml) включает в себя описание интерфейса к версия-зависимой части. Интерфейс от версии не зависит. В проект включены три подмодуля, по ревизиям внутрянки сервера CraftBukkit. Каждая из них зависит явно от конкретной несовместимой с другими версией ядра.
Каждый модуль компилируется, всё вместе включается в плагин, а во время запуска код определяет, ядро какой nms подходит под ядро, где запущен сервер, и грузит нужный класс. Основной код плагина работает с конкретным классом, используя только общие интерфейс.
 
Технически плагин должен работать на 1.8.1 и 1.8.3 без всяких адаптаций. Если в этих версиях минимальные различия. У меня плагины с API 1.7.9 работают на 1.5.2 .
Это если использовать API, который не содержит пакетов и других хороших вещей.
О, годный пример, а то я на словах каждый раз пытаюсь объяснять :)
@fromgate
Форкану-ка я его.

По теме: это и есть чистейший образец. Основной проект (pom.xml) включает в себя описание интерфейса к версия-зависимой части. Интерфейс от версии не зависит. В проект включены три подмодуля, по ревизиям внутрянки сервера CraftBukkit. Каждая из них зависит явно от конкретной несовместимой с другими версией ядра.
Каждый модуль компилируется, всё вместе включается в плагин, а во время запуска код определяет, ядро какой nms подходит под ядро, где запущен сервер, и грузит нужный класс. Основной код плагина работает с конкретным классом, используя только общие интерфейс.

Весь код я понял, как определят и т.д.. Но как он добавил в каждый класс, подходящие версией, импорты?

Например:
В папке v1_7_R1
Код:
import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer;
И в папке v1_7_R2
Код:
import org.bukkit.craftbukkit.v1_7_R2.entity.CraftPlayer;

Я вот одного не понимаю...
 
В коде плагина импортов к ним нету.
В интерфейсном коде импортов к ним нету.
В каждом из модулей (считай их отдельными проектами) — импорты из соответствующей версии ядра. Зависимости прописаны в их отдельных pom.xml-ах.

Оболочка IDE сама при необходимости парсит зависимости текущего проекта и предлагает добавить импорты. А для каждого из модулей вариант всего один.

Насколько я помню:
  • 1.8.0-1.8.1 это v1_8_R1
  • 1.8.2 это v1_8_R2
  • 1.8.3-1.8.7 это v1_8_R3
но могу ошибаться!
 
В коде плагина импортов к ним нету.
В интерфейсном коде импортов к ним нету.
В каждом из модулей (считай их отдельными проектами) — импорты из соответствующей версии ядра. Зависимости прописаны в их отдельных pom.xml-ах.

Оболочка IDE сама при необходимости парсит зависимости текущего проекта и предлагает добавить импорты. А для каждого из модулей вариант всего один.

Насколько я помню:
  • 1.8.0-1.8.1 это v1_8_R1
  • 1.8.2 это v1_8_R2
  • 1.8.3-1.8.7 это v1_8_R3
но могу ошибаться!
так как я понял он в "Build Patch" закинул разных версий ядра?
 
Кто он?
Компиляцией (сборкой проекта) занимается Maven — это отдельный стандартизированный инструмент.
В файле его проекта (pom.xml) описано, от каких других проектов зависит текущий, с указанием конкретных версий. Во время компиляции Maven убеждается, что все зависимости выкачаны из их репозиториев (по сути просто расшаренные в веб папки), т.е. во время компиляции каждого из подмодулей автоматически будет выкачано с интернета соответствующее ядро, и исходники удачно скомпилируются. Если хочешь, можешь считать что для каждого модуля в его Build Path добавлено отдельное ядро, но внутри это чуть-чуть не так и делается автоматически системой сборки.
После того, как будут скомпилированы классы подмодулей, основной проект включит их в свой .jar.
Благодаря ленивой загрузке в Java классы, которые скомпилированы под ядро, отличающееся от того, где запущен плагин, загружены не будут, и не вызовут исключения ClassNotFound.
 
Кто он?
Компиляцией (сборкой проекта) занимается Maven — это отдельный стандартизированный инструмент.
В файле его проекта (pom.xml) описано, от каких других проектов зависит текущий, с указанием конкретных версий. Во время компиляции Maven убеждается, что все зависимости выкачаны из их репозиториев (по сути просто расшаренные в веб папки), т.е. во время компиляции каждого из подмодулей автоматически будет выкачано с интернета соответствующее ядро, и исходники удачно скомпилируются. Если хочешь, можешь считать что для каждого модуля в его Build Path добавлено отдельное ядро, но внутри это чуть-чуть не так и делается автоматически системой сборки.
После того, как будут скомпилированы классы подмодулей, основной проект включит их в свой .jar.
Благодаря ленивой загрузке в Java классы, которые скомпилированы под ядро, отличающееся от того, где запущен плагин, загружены не будут, и не вызовут исключения ClassNotFound.
Спасибо за пояснение, я програмирую на Eclipse, где мне достать Maven, создать эти pom.yml файлы?

P.S А нельзя просто закинуть нужные версии в Build Patch и в отдельных классах по определенной версии использовать нужные импорты, а при загрузке плагина проверить на какой версии стоит сервер и использовать нужный класс?
 
@Reality_SC
Когда импортируемые пакеты различаются, вообще можно не переживать - подключаешь сразу все три версии craftbukkit и ручками прописываешь новые импорты.
У меня сложности возникли, когда пакеты называются одинаково, а содержимое разное - это то что было с WorldGuard.

@Bind
В Eclipse есть встроенный плагин Maven. Соответственно можно либо сразу создать Maven-проект (это будет основной плагин) и модули (под каждую версию - отдельный).
Можно попробовать преобразовать существующий проект в Maven, но у меня как-то всё криво получилось, что я в итоге создал новый проект - Maven, перетянул в него все файлы и начал делать новый проект.
 
я програмирую на Eclipse
Я не пользуюсь Eclipse, я пишу в NetBeans.
где мне достать Maven, создать эти pom.yml файлы?
Maven должен идти модулем к IDE, по крайней мере у меня оно так. Так-то это отдельный продукт, и скачивается свободно со своего сайта, но всё-таки IDE должна поддерживать его сама, 95%. В Файл-Открыть (Создать) появляются отдельные типа проектов, а именно Проекты Maven или Проекты pom.xml.
pom.xml ты должен сделать сам, в целом у тебя вполне рабочий пример перед глазами.
А нельзя просто закинуть нужные версии в Build Patch и в отдельных классах по определенной версии использовать нужные импорты, а при загрузке плагина проверить на какой версии стоит сервер и использовать нужный класс?
Нет. И Build Path.
Во, fromgate корректно всё написал.
Можно попробовать преобразовать существующий проект в Maven, но у меня как-то всё криво получилось, что я в итоге создал новый проект - Maven, перетянул в него все файлы и начал делать новый проект.
Не забывай коммитить в гитхаб фичи по их готовности и end-of-day :)
Почему ты не выкладываешь pom.xml, как твои исходники-то собирать? )) делать свой проект? ))
 
Последнее редактирование:
@Reality_SC
Когда импортируемые пакеты различаются, вообще можно не переживать - подключаешь сразу все три версии craftbukkit и ручками прописываешь новые импорты.
У меня сложности возникли, когда пакеты называются одинаково, а содержимое разное - это то что было с WorldGuard.

@Bind
В Eclipse есть встроенный плагин Maven. Соответственно можно либо сразу создать Maven-проект (это будет основной плагин) и модули (под каждую версию - отдельный).
Можно попробовать преобразовать существующий проект в Maven, но у меня как-то всё криво получилось, что я в итоге создал новый проект - Maven, перетянул в него все файлы и начал делать новый проект.
Спасибо огромное за ответ. Только вот тот пример совсем запутанный... Пално папок разных, не понятно как это все должно выглядить в Eclipse. Теперь вообще, пытаюсь новый проект создать, в одной вкладке не дает нажать "Далее" и затем зависает все... Может кто сделает самый простой пример, который я могбы заимпортит в Eclipse? Я готов заплатить.
 
@Bind
  1. Проверь, что в твоём Eclipse установлен плагин, который осуществляет поддержку проектов Maven.
  2. Почитай тут, очень основная инфа и очень кратко, http://www.apache-maven.ru/quick_start.html
  3. Проект должен просто открываться, как самый обычный проект. По твоей ссылке и идёт этот самый простой пример. Просто выкачай его и открой в Eclipse, попробуй скомпилировать, поменять что-нибудь в нём. А так и до своего додумаешься.
Прости, я за тебя сделать это не могу, у меня вообще Эклипса нет, и качать не буду :)
Когда импортируемые пакеты различаются, вообще можно не переживать - подключаешь сразу все три версии craftbukkit и ручками прописываешь новые импорты.
Кстати нет, нельзя подключить несколько зависимостей, отличающихся только версиями. Ну, в "правильном пути" нельзя:
upload_2015-6-26_11-40-1.png
Some problems were encountered while building the effective model for ru.methuselah:launcher:jar:0.15a
'dependencies.dependency.(groupId:artifactId:type:classifier)' must be unique: ru.simsonic:rscUtilityLibrary:jar -> version 2.0.4 vs 2.0.5 @ line 57, column 15

It is highly recommended to fix these problems because they threaten the stability of your build.

For this reason, future Maven versions might no longer support building such malformed projects.
Хотя хз, может быть просто предупреждение, сборка вроде продолжилась.
 
@Bind
  1. Проверь, что в твоём Eclipse установлен плагин, который осуществляет поддержку проектов Maven.
  2. Почитай тут, очень основная инфа и очень кратко, http://www.apache-maven.ru/quick_start.html
  3. Проект должен просто открываться, как самый обычный проект. По твоей ссылке и идёт этот самый простой пример. Просто выкачай его и открой в Eclipse, попробуй скомпилировать, поменять что-нибудь в нём. А так и до своего додумаешься.
Прости, я за тебя сделать это не могу, у меня вообще Эклипса нет, и качать не буду :)

Кстати нет, нельзя подключить несколько зависимостей, отличающихся только версиями. Ну, в "правильном пути" нельзя:
Посмотреть вложение 33708
Хотя хз, может быть просто предупреждение, сборка вроде продолжилась.
Спасибо, я все по нему и делал. Только вот создаю я проект не через команды, так как не знаю куда их прописывать)
Я все заинсталил, теперь пробую создать новый проект и все зависает(( Хотя до этого получитлось создать.
 
Ну да, командами и не надо. Там всё через Эклипс должно само по себе происходить.
 

Поделиться этой страницей

Назад
Верх