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

Blc_Dragon

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

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

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

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

Что вообще за нафиг. куда рыть?
Мне выносить все это дело в отдельный класс? или можно как то исправить подобный бздец?
Заранее спасибо
 
Попробуй так MyPlugin pl = (MyPlugin)Bukkit.getPluginManager().getPlugin("MyPlugin");
 
А без этого Bukkit.getPluginManager().getPlugin("MyPlugin"); все нормально?
что с ним, что без. ловлю с завидной регулярностью.

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

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

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

Как будет плохо:
Java:
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!");
    }

А вот так наш сервер все устроило:
Java:
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!");
        }
    }

как я понял, когда я создаю переменную, вместо хранения в ней ссылки, почему то хранится целый объект.
 
что с ним, что без. ловлю с завидной регулярностью.

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

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

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

Как будет плохо:
Java:
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!");
    }

А вот так наш сервер все устроило:
Java:
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!");
        }
    }

как я понял, когда я создаю переменную, вместо хранения в ней ссылки, почему то хранится целый объект.
Или класс просто не выгружается из за того что есть ссылка на него.
 
Я в этом не очень шарю, но что если попробовать использовать WeakReference?
 
Где-то торчит достижимая ссылка на один из классов перезагружаемого плагина. Вообще перезагрузка плагинов штука сложная, но как нибудь надйу время и распишу что и как и почему происходит.
 
Последнее редактирование:
Где-то торчит достижимая ссылка на один из классов перезагружаемого плагина. Вообще перезагрузка плагинов штука сложная, но как нибудь надйу время и распишу что и как и почему происходит.
Да это стандартная шняга кастомного класслоадера же. Жабахрень.
 
Да это стандартная шняга кастомного класслоадера же. Жабахрень.
Вот про эту жабахрень я и написать собираюсь. Плюс тут ещё в самом бакките есть пара косяков которые дополнительно стреляют в ногу.
 
Проблема вылезает при попытке перезагрузить плагин перезагрузчиком (plugman).
Вообще перезагружать лучше последовательностью disable + enable.
В pm-е, которым пользуюсь я, даже есть специальная команда /pm sreload <плагин> для этого.
Ну и в самом плагине стоит при необходимости сделать команду а-ля /<pl> reload.
 
Вообще перезагружать лучше последовательностью disable + enable.
В pm-е, которым пользуюсь я, даже есть специальная команда /pm sreload <плагин> для этого.
Ну и в самом плагине стоит при необходимости сделать команду а-ля /<pl> reload.
Все это круто конечно же. Но иногда нужно в рантайме плагин полностью обновить залив новый джарник. К примеру я так часто делаю, ибо рестартить сервер с онлайном не вариант.
 
Все это круто конечно же. Но иногда нужно в рантайме плагин полностью обновить залив новый джарник. К примеру я так часто делаю, ибо рестартить сервер с онлайном не вариант.
+1
Где-то торчит достижимая ссылка на один из классов перезагружаемого плагина. Вообще перезагрузка плагинов штука сложная, но как нибудь надйу время и распишу что и как и почему происходит.
был бы очень признателен
 
у меня такое же недавно было, я начал шарится и в плагинах нашел еще один свой плагин(с другим названием и содержанием), но main'ы были расположены по одному пути: dorrito.main, по отдельности работали нормально, а вместе писало ошибку
 
у меня такое же недавно было, я начал шарится и в плагинах нашел еще один свой плагин(с другим названием и содержанием), но main'ы были расположены по одному пути: dorrito.main, по отдельности работали нормально, а вместе писало ошибку
Не думаю что спустя 4 года это актуально, но для плагинов нельзя использовать олинаковые названия пакетов.
 
Назад
Верх