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

[Решено] java.lang.NoDefClassFoundError

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

Статус темы:
Закрыта.
  1. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Всем доброго времени суток.

    Столкнулся с проблемой, которую никак не могу решить. Чувствую, что ответ где-то рядом, но понять не могу =)

    В общем, имею майн класс со следующим кодом:
    Код:
    package ru.coolboy.progadgets;
    
    import org.bukkit.configuration.file.FileConfiguration;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class Main
    extends JavaPlugin
    {
        public FileConfiguration config;
        public static Main plugin;
    
        @Override
        public void onEnable()
        {
            plugin = this;
            config = this.getConfig();
            saveDefaultConfig();
            RandomFireworks.getManager().addColors();
            RandomFireworks.getManager().addTypes();
            this.getCommand("pg").setExecutor(new Commands());
            getServer().getPluginManager().registerEvents(new Listeners(), this);
            getLogger().info("enabled.");
        }
    
        @Override
        public void onDisable()
        {
           getLogger().info("disabled.");
        }
    }
    
    После этого имею код класса Configuration:
    Код:
    package ru.coolboy.progadgets.configurations;
    
    import org.bukkit.ChatColor;
    
    import ru.coolboy.progadgets.Main;
    
    public class Configuration
    {
        public static String RELOAD = ChatColor.translateAlternateColorCodes('&', Main.plugin.getConfig().getString("Messages.Main.plugin-reloaded"));
        public static String NO_PERMISSION = ChatColor.translateAlternateColorCodes('&', Main.plugin.getConfig().getString("Messages.No-permissions"));
    }
    
    После обращения к классу Configuration в классе Commands посредством:
    Код:
    sender.sendMessages(Configuration.RELOAD);
    
    Ловлю ошибку - java.lang.NoClassDefFoundError

    Прошу помощи.
     
    Последнее редактирование: 10 апр 2016
  2. Хостинг MineCraft
    <
  3. GoodCoder

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

    Баллы:
    76
    JavaPlugin это класс, а не интерфейс.
     
  4. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Это называется - мой код без IDE.
    Но в плагине всё правильно.
     
  5. GoodCoder

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

    Баллы:
    76
    Поэтому там должно быть extends
     
  6. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Уже давно =)
     
  7. Code

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

    Баллы:
    123
    Имя в Minecraft:
    _Gizmo
    может ты кинешь стактрейс?)
     
  8. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Легко
    Код:
    Caused by: java.lang.NoClassDefFoundError: Could not initialize class ru.coolboy.progadgets.configurations.Configuration
        at ru.coolboy.progadgets.Listeners.onPlayerInteractWithDiamond(Listeners.java:59) ~[?:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_45]
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_45]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_45]
        at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_45]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:300) ~[patched.jar:git-PaperSpigot-430]
        ... 19 more
    
    59 строка моего листенера имеет следующий вид:

    Код:
    if (player.getItemInHand().getType() == Material.valueOf(Configuration.DIAMOND_FOUNTAIN_MATERIAL.toUpperCase()))
    {
    
     
    Последнее редактирование: 9 апр 2016
  9. Sonicxd2

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

    Баллы:
    76
    Ну ты и молодец, конечно. Класс Configuration подгружается вместе с плагином, по этому оно не может подгрузиться. Совет - в onEnable сетать эти значения.
     
  10. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Каким образом?
    Я почему так реализую конфигурацию то, у меня достаточно много исходников других проектов хранится. И этот метод самый удобный - как по мне. Странность в том, что абсолютно такой же метод работает в моём другом плагине отлично, без каких-либо ошибок.

    Обновлено:

    Да и в Main класс данные подгружать не получится. Они же все статичные.
    Только если геттеры и сеттеры делать.[DOUBLEPOST=1460279873,1460230293][/DOUBLEPOST]Up, проблема до сих пор не решена.
     
    Последнее редактирование: 10 апр 2016
  11. fall.us

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

    Баллы:
    76
    Имя в Minecraft:
    fallus
    Проблема в Вас. Вы неправильно используете основные возможности Java(исправил). Чтобы помочь разобраться, нужен нормальный исходный код: тот что в первом посте - фигня полная(если Ваш код выглядит в реальности именно так, то у Вас проблемы с незнанием языка, на котором Вы программируете).
    Скидывайте нормальные исходники, и Вам укажут на ошибки.[DOUBLEPOST=1460280542,1460280420][/DOUBLEPOST]Конкретно нужны все куски кода, где Вы манипулируете классом Configuration.
     
    Последнее редактирование: 10 апр 2016
  12. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Я не знаком с синтаксисом java на 100%) В этом и проблема, только поэтому я обратился сюда. Но никогда не поздно научиться. Через 10-20 минут я скину весь source code =)
     
  13. fall.us

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

    Баллы:
    76
    Имя в Minecraft:
    fallus
    Под "синтаксисом" я конечно же НЕ имел ввиду сам синтаксис Java, скорее - основы программирования на Java. Исправлю.[DOUBLEPOST=1460285803,1460281197][/DOUBLEPOST]Я так понял, Вы хотите использовать статические переменные, так? Если так... мм. Я просто оставлю это здесь.
    Код:
    public class MyPlugin extends JavaPlugin
    {
        public void onEnable()
        {
            Configuration.Load(getConfig());
        }
    }
    
    public class Configuration
    {
        public static String RELOAD = "This is default reload message";
    
        public static void Load(FileConfiguration config)
        {
            Configuration.RELOAD = config.getString("message.reload-message", Configuration.RELOAD);
        }
    }
     
    Последнее редактирование: 10 апр 2016
  14. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    Обновил топик. Смотрите =)
     
  15. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Статические ссылки губят.
    Запили нормальную реализацию языка. А если у тебя и вправду две строки, то храни их в Main.
     
  16. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    В том то и дело, что у меня там чуть больше 50 строк. Да и в каком смысле "нормальную" реализацию языка?
    Мне просто нужно получать данные из конфига удобным способом. Так то я могу просто в нужном мне месте вот этот кусок вставить
    Код:
    Main.plugin.config.getString("Bla-bla-bla");
    
    Но это не слишком то удобно и в плане читаемости кода и в плане реализации. Особенно, когда одну и ту же строчку нужно достать несколько раз.
     
  17. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Лично мне удобнее работать с Properties. Просто загрузил в properties файл языка и вытаскивай текст как из HashMap.
     
  18. fall.us

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

    Баллы:
    76
    Имя в Minecraft:
    fallus
    Вы не можете в объявлении статической переменной обращаться к еще не инициализированным полям других классов.
    Используйте для этого отдельную функцию. Я привел пример.
     
    Последнее редактирование: 10 апр 2016
  19. Автор темы
    CoolBoy

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

    Баллы:
    96
    Skype:
    thecoolboy2070
    Имя в Minecraft:
    CoolBoy
    После долгих манипуляций решил проблему из топика довольно просто.
    И проблема была весьма странная.
    В Configuration имел:
    Код:
    public static String RELOAD = ChatColor.translateAlternateColorCodes('&', Main.plugin.getConfig().getString("Messages.Main.plugin-reloaded"));
    
    Вместе с ошибкой из топика кидало и эту ошибку:
    Код:
    Caused by: java.lang.NullPointerException
        at org.bukkit.ChatColor.translateAlternateColorCodes(ChatColor.java:324) ~[patched.jar:git-PaperSpigot-430]
        at ru.coolboy.showbowdamage.Configuration.<clinit>(Configuration.java:16) ~[?:?]
        ... 13 more
    
    После того как изменил строчку на:
    Код:
    public static String RELOAD = Main.plugin.getConfig().getString("Messages.Main.plugin-reloaded"));
    
    Ошибка из топика изчезла.

    Также после обьявления plugin = this, в класе Main, при обращении к нему из другого класса посредством plugin вы будете ловить null.
    Решил костылём:
    Код:
    Main plugin = Main.plugin;
    
    Всё отдуплилось.

    @fall.us мой метод опять работает как нужно =D[DOUBLEPOST=1460291879,1460291392][/DOUBLEPOST]Обновлено:
    Всё прекрасно работает в моей реализации. Даже не знаю, насколько это плохо/костыльно, но тем неменее всё работает. Всем огромное спасибо за помощь =)

    Тема закрыта.
     
    Последнее редактирование: 10 апр 2016
Статус темы:
Закрыта.

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