Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

[Решено, но причина бага неизвестна]Plugin already initialized! (но это ложь)

Тема в разделе "Разработка плагинов для новичков", создана пользователем Blc_Dragon, 8 мар 2017.

  1. Автор темы
    Blc_Dragon

    Blc_Dragon Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    Доброго времени суток, форумчане.

    Ловлю java.lang.IllegalArgumentException: Plugin already initialized!
    (умею я переводить, понимаю, что ругается на уже загруженный плуг)

    Проблема в том, что такого плуга в загруженых нет.
    Проблема вылезает при попытке перезагрузить плагин перезагрузчиком (plugman).

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

    Что вообще за нафиг. куда рыть?
    Мне выносить все это дело в отдельный класс? или можно как то исправить подобный бздец?
    Заранее спасибо
     
  2. Хостинг MineCraft
    <
  3. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Попробуй так MyPlugin pl = (MyPlugin)Bukkit.getPluginManager().getPlugin("MyPlugin");
     
  4. Автор темы
    Blc_Dragon

    Blc_Dragon Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    оно так и было.

    p.s
    Вынес в отдельный класс - не помогло.
    Вообще не вкуриваю что за лажа
     
  5. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    А без этого Bukkit.getPluginManager().getPlugin("MyPlugin"); все нормально?
     
  6. Автор темы
    Blc_Dragon

    Blc_Dragon Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    что с ним, что без. ловлю с завидной регулярностью.

    Заметил еще что интересное.
    1.Отрубаем плагин который не можем включить. (прям совсем. unload. Т.е. он даже не Disabled. его нет для сервера. совсем).
    2.Перезагружаем плагин, без которого никаких ошибок (это тот "второй" плагин)
    3.Запускаем первый плагин. Он запускается.

    Если теперь попробовать его перезагрузить, то снова ошибка. т.е. он нормально запускается после перезагрузки плагина, вызывающего проблему.
    Это может быть связано с листенером, который ловит включение и выключение "первого" плагина?[DOUBLEPOST=1488963971,1488963842][/DOUBLEPOST]Отключил листенер. не помогло.

    Начинаю медленно сходить с ума[DOUBLEPOST=1488966228][/DOUBLEPOST]Понаркоманил (перелопатил весь плуг), и вот что вышло:

    Как будет плохо:
    Код:
    public void doSomething(){
            Plugin myPlugin = Bukkit.getPluginManager().getPlugin("MyPlugin");
            //MyPlugin myPlugin = (MyPlugin)Bukkit.getPluginManager().getPlugin("MyPlugin"); - не даст никакой разницы
            //myPlugin = null перед return или\и в конце метода совершенно не даст сподвигов.
            if (myPlugin==null){
                ThisPlugin.instance().getLogger().log(Level.INFO, "MyPlugin not founded! Something would not be completed!");
                return;
            }
            if (!myPlugin.isEnabled()){
                ThisPlugin.instance().getLogger().log(Level.INFO, "MyPlugin founded, but disabled! Something will be enabled after MyPlugin enabling");
                return;
            }
            this.somed=Bukkit.getPluginManager().getPlugin("MyPlugin").getConfig().getDouble("something");
            this.booleanf=true;
            ThisPlugin.instance().getLogger().log(Level.INFO, "Something completed!");
        }
    
    А вот так наш сервер все устроило:
    Код:
    public void doSomething(){
            if (Bukkit.getPluginManager().getPlugin("MyPlugin")!=null){
                if (Bukkit.getPluginManager().getPlugin("MyPlugin").isEnabled()){
                    this.somed=Bukkit.getPluginManager().getPlugin("MyPlugin").getConfig().getDouble("something");
                    this.booleanf=true;
                    ThisPlugin.instance().getLogger().log(Level.INFO, "Something completed!");
                }else{
                    ThisPlugin.instance().getLogger().log(Level.INFO, "MyPlugin founded, but disabled! Something will be enabled after MyPlugin enabling");
                }
            }else{
                ThisPlugin.instance().getLogger().log(Level.INFO, "MyPlugin not founded! Something would not be completed!");
            }
        }
    
    как я понял, когда я создаю переменную, вместо хранения в ней ссылки, почему то хранится целый объект.
     
  7. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Или класс просто не выгружается из за того что есть ссылка на него.
     
  8. OsipXD

    OsipXD Старожил Пользователь

    Баллы:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    Я в этом не очень шарю, но что если попробовать использовать WeakReference?
     
  9. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Где-то торчит достижимая ссылка на один из классов перезагружаемого плагина. Вообще перезагрузка плагинов штука сложная, но как нибудь надйу время и распишу что и как и почему происходит.
     
    Последнее редактирование: 9 мар 2017
  10. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Да это стандартная шняга кастомного класслоадера же. Жабахрень.
     
  11. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Вот про эту жабахрень я и написать собираюсь. Плюс тут ещё в самом бакките есть пара косяков которые дополнительно стреляют в ногу.
     
  12. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Вообще перезагружать лучше последовательностью disable + enable.
    В pm-е, которым пользуюсь я, даже есть специальная команда /pm sreload <плагин> для этого.
    Ну и в самом плагине стоит при необходимости сделать команду а-ля /<pl> reload.
     
  13. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Все это круто конечно же. Но иногда нужно в рантайме плагин полностью обновить залив новый джарник. К примеру я так часто делаю, ибо рестартить сервер с онлайном не вариант.
     
  14. Автор темы
    Blc_Dragon

    Blc_Dragon Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    +1
    был бы очень признателен
     

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