1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите SQL & Bukkit ошибка при перезагрузке плагина

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

Метки:
  1. Автор темы
    NyanGuyMF

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

    Баллы:
    76
    Пишу плагин с подключение к MySQL бд. Всё нормально, подключается, но при перезагрузке плагина /asw pmanager reload вылезает красивая ошибка:
    PHP:
    java.lang.VerifyError: Bad type on operand stack
    Exception Details
    :
      
    Location:
        
    me/nyanguymf/jailplugin/managers/data/DatabaseManager.<init>()V @68: putfield
      Reason
    :
        
    Type 'me/nyanguymf/jailplugin/managers/data/MySQLCore' (current frame, stack[1]) is not assignable to 'me/nyanguymf/jailplugin/managers/data/Database'
      
    Current Frame:
        
    bci: @68
        flags
    : { }
        
    locals: { 'me/nyanguymf/jailplugin/managers/data/DatabaseManager', 'java/lang/String', 'java/lang/String', 'java/lang/String', integer, 'java/lang/String', 'java/lang/String' }
        
    stack: { 'me/nyanguymf/jailplugin/managers/data/DatabaseManager', 'me/nyanguymf/jailplugin/managers/data/MySQLCore' }
      
    Bytecode:
        
    0x0000000: 2ab7 000c 120e b800 104c 1216 b800 104d
        0x0000010
    : 1218 b800 104e 121a b800 1c36 0412 20b8
        0x0000020
    : 0010 3a05 1222 b800 103a 062b 1224 b600
        0x0000030
    : 2699 0019 2abb 002c 592c 2d15 0419 0519
        
    0x0000040: 06b7 002e b500 31a7 0037 bb00 3359 1235
        0x0000050
    : b700 372b b600 3a12 3eb6 003a b600 4012
        0x0000060
    : 44b8 0046 bb00 3359 124c b700 372b b600
        0x0000070
    : 3a12 3eb6 003a b600 4012 44b8 004e b1
      Stackmap Table
    :
        
    full_frame(@74,{Object[#1],Object[#39],Object[#39],Object[#39],Integer,Object[#39],Object[#39]},{})
        
    same_frame(@126)

        
    at me.nyanguymf.jailplugin.JailPlugin.onEnable(JailPlugin.java:40) ~[?:?]
        
    at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:264) ~[patched_1.12.2.jar:git-Paper-1587]
        
    at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:316) ~[patched_1.12.2.jar:git-Paper-1587]
        
    at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:405) ~[patched_1.12.2.jar:git-Paper-1587]
        
    at autosaveworld.features.pluginmanager.InternalUtils.loadPlugin(InternalUtils.java:104) ~[?:?]
        
    at autosaveworld.features.pluginmanager.PluginManager.reloadPlugin(PluginManager.java:253) ~[?:?]
        
    at autosaveworld.features.pluginmanager.PluginManager.handlePluginManagerCommand(PluginManager.java:66) ~[?:?]
        
    at autosaveworld.commands.subcommands.PluginManagerSubCommand.handle(PluginManagerSubCommand.java:36) ~[?:?]
        
    at autosaveworld.commands.NoTabCompleteCommandsHandler.onCommand(NoTabCompleteCommandsHandler.java:113) ~[?:?]
        
    at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[patched_1.12.2.jar:git-Paper-1587]
        
    at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:151) ~[patched_1.12.2.jar:git-Paper-1587]
        
    at org.bukkit.craftbukkit.v1_12_R1.CraftServer.dispatchCommand(CraftServer.java:685) ~[patched_1.12.2.jar:git-Paper-1587]
        
    at org.bukkit.craftbukkit.v1_12_R1.CraftServer.dispatchServerCommand(CraftServer.java:648) ~[patched_1.12.2.jar:git-Paper-1587]
        
    at net.minecraft.server.v1_12_R1.DedicatedServer.aP(DedicatedServer.java:463) ~[patched_1.12.2.jar:git-Paper-1587]
        
    at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:424) ~[patched_1.12.2.jar:git-Paper-1587]
        
    at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:774) ~[patched_1.12.2.jar:git-Paper-1587]
        
    at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:666) ~[patched_1.12.2.jar:git-Paper-1587]
        
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_191]
    PHP:
    /**
     * DatabaseManager.java 2018-12-31
     *
     * @author NyanGuyMF
     *
     * @version 1.0
     */
    package me.nyanguymf.jailplugin.managers.data;

    import java.sql.Connection;

    import me.nyanguymf.jailplugin.JailPlugin;
    import me.nyanguymf.jailplugin.managers.ConfigManager;

    /**
     * Mediator pattern
     *
     * @author nyanguymf
     */
    public class DatabaseManager implements IDatabase {
        private 
    Database databaseCore;

        public 
    DatabaseManager() {
            
    String  databaseDriver  = ConfigManager.getString("database.db-driver");
            
    String  host            = ConfigManager.getString("database.host");
            
    String  database        = ConfigManager.getString("database.database");
            
    int     port            = ConfigManager.getInt("database.port");
            
    String  user            = ConfigManager.getString("database.user");
            
    String  password        = ConfigManager.getString("database.password");

            if (
    databaseDriver.equalsIgnoreCase("mysql")) {
                
    databaseCore = new MySQLCore(host, database, port, user, password);
            } else { 
    // TODO: add other SQL drivers
                // TODO: JailPlugin.log() && JailPlugin.debug()
                
    JailPlugin.log("Couldn't load " + databaseDriver + " database driver", "DatabaseManager");
                
    JailPlugin.debug("There is no " + databaseDriver + " database driver", "DatabaseManager");
            }
        }

        @
    Override
        
    public Connection getConnection() {
            return 
    databaseCore.getConnection();
        }

        @
    Override
        
    public boolean isConnected() {
            return 
    databaseCore.isConnected();
        }

        @
    Override
        
    public void close() {
            
    databaseCore.isConnected();
        }
    }
    PHP:
    /**
     * MySQLCore.java 2018-12-31
     *
     * @author NyanGuyMF
     *
     * @version 1.0
     */
    package me.nyanguymf.jailplugin.managers.data;

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.SQLNonTransientConnectionException;

    import me.nyanguymf.jailplugin.JailPlugin;

    /**
     * @author nyanguymf
     *
     */
    class MySQLCore extends Database {

        public 
    MySQLCore(String host, String database, int port, String user, String password) {
            
    this.host       = host;
            
    this.database   = database;
            
    this.port       = port;
            
    this.user       = user;
            
    this.password   = password;

            try {
                
    connect();
            } catch (
    SQLNonTransientConnectionException ex) {
                
    JailPlugin.debug("You can use https://stackoverflow.com/questions/1673530/"
                                
    +"error-2003-hy000-cant-connect-to-mysql-server-on-127-0-0-1-111 to fix this", "Database");
                
    ex.printStackTrace();
            }
        }

        
    /**
         * Connect to database.
         */
        
    private void connect() throws SQLNonTransientConnectionException {
            try {
                Class.
    forName("com.mysql.jdbc.Driver");
                
    connection = DriverManager.getConnection(

                        
    "jdbc:mysql://" + host + ":" + port + "/" + database
                        
    + "?useUnicode=true&characterEncoding=utf-8&autoReconnect=true"
                        
    , user, password

                        
    );
            } catch (
    SQLException ex) {
                
    JailPlugin.debug("SQL Exception", "MySQLCore#connect()");
                
    ex.printStackTrace();
            } catch (
    ClassNotFoundException ex) {
                
    JailPlugin.debug("Class com.mysql.jdbc.Driver not found", "MySQLCore#connect()");
                
    ex.printStackTrace();
            }
        }

        @
    Override
        
    public Connection getConnection() {
            try {
                if (
    connection.isClosed() || connection == null)
                    
    connect();

            } catch (
    SQLException ex) {
                
    JailPlugin.debug("SQL Exception", "MySQLCore#getConnection()");
                
    ex.printStackTrace();
            }

            return 
    connection;
        }

        @
    Override
        
    public boolean isConnected() {
            return 
    connection != null; // && connection.isClosed() ??
        
    }

        @
    Override
        
    public void close() {
            try {
                if (
    isConnected())
                    
    connection.close();

            } catch (
    SQLException e) {
                
    JailPlugin.debug("SQL Exception", "MySQLCore#close()");
                
    e.printStackTrace();
            }
        }
    }
    Как это фиксить, чтобы можно было спокойно перезагружать плагин, а не сервер? :D
     
  2. Code

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

    Баллы:
    123
    Имя в Minecraft:
    _Gizmo
    на странице плагина написано, что этим релоадом даже конфиги нельзя перегружать. а ты видимо новую джарку суешь, потому и ошибка. не уверен что это фиксится.
    как альтернативу можешь попробовать hot swap
    https://www.google.com/search?q=java+remote+debug+hot+swap
     
  3. Автор темы
    NyanGuyMF

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

    Баллы:
    76
    При перезагрузке плагинов без подключения к БД у меня всё нормально, а тут - ошибка :D
     
  4. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    То же что и всегда, где-то остались используемые куски этого плагина. Либо поток где-то какой-то остался, либо забыл из сервера всё разрегать, либо есть другие зависимые плагины.
     
  5. Автор темы
    NyanGuyMF

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

    Баллы:
    76
    Нет ни плагинов, ни потоков. Не совсем понял, что означает "разрегать все сервера"? При выключении плагина выполняется метод, закрывающий соединение - DatabaseManager.close();

    Как пофиксить-то? :D
     
  6. Code

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

    Баллы:
    123
    Имя в Minecraft:
    _Gizmo
    не разрегать все сервера, а разрегать всё из сервера. я плагины не пишу, но подозреваю что тут имеется ввиду вызов unregister если при загрузке ты делал register чего либо
     
  7. Автор темы
    NyanGuyMF

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

    Баллы:
    76
    То есть возможный вариант решения - unregister(RegisteredListener listener) из HandlerList?
     

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