NoClassDefFoundError после импорта hikaricp через зависимость Maven - PullRequest
0 голосов
/ 05 октября 2019

Я получаю ошибку java.lang.NoClassDefFoundError: com/zaxxer/hikari/HikariDataSource при запуске моего плагина Java на spigot. из того, что я могу сказать, я правильно импортировал его.

Я знаю, что этот вопрос был опубликован несколько раз, но просматривая 3-4, я не вижу четкого ответа на вопрос, что не так. Код падает на hikari = new HikariDataSource(), который также является первым используемым оператором hikari.

My Pom

<groupId>drhampust.github.io</groupId>
<artifactId>Blank</artifactId>
<version>1.0-SNAPSHOT</version>

<repositories>
    <repository>
        <id>spigot-repo</id>
        <url>https://hub.spigotmc.org/nexus/content/repositories/snapshot/</url>
    </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>org.spigotmc</groupId>
        <artifactId>spigot-api</artifactId>
        <version>1.14.4-R0.1-SNAPSHOT</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.17</version>
    </dependency>
    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
        <version>3.4.0</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

похоже, что hikari не компилируется в jar, но яможет использовать свои активы во время кодирования.

Код:

import com.zaxxer.hikari.HikariDataSource;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;

import java.sql.*;

    public class Main extends JavaPlugin {

    //DataBase vars.
    public String username, password, database, host, properties, table; //db variables
    public int port; //db variable

    //Connection vars
    private HikariDataSource hikari;

    @Override
    public void onEnable() {
        getLogger().info("onEnable is called!");
        loadConfig();

        new BukkitRunnable(){
            @Override
            public void run(){
                connectToDatabase();
            }
        }.runTaskAsynchronously(this);

        this.getServer().getPluginManager().registerEvents(new SetterGetter(), this);
    }
    @Override
    public void onDisable() {
        getLogger().info("onDisable is called!");
    }


    public synchronized void connectToDatabase() {
        //Database details
        String address = getConfig().getString("Database.address");
        String name = getConfig().getString("Database.Name");
        String username = getConfig().getString("Database.username");
        String password = getConfig().getString("Database.password");
        int port = getConfig().getInt("Database.port");

        //Initialise hikari instace
        hikari = new HikariDataSource();

        //Setting Hikari properties
        hikari.setMaximumPoolSize(10);
        hikari.setDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlDataSource");
        hikari.addDataSourceProperty("serverName", address);
        hikari.addDataSourceProperty("port", port);
        hikari.addDataSourceProperty("databaseName", name);
        hikari.addDataSourceProperty("user", username);
        hikari.addDataSourceProperty("password", password);
    }

    public void loadConfig() {
        getConfig().options().copyDefaults(true);
        saveConfig();
    }
}

полный отчет о сбое в контейнере для вставки, чтобы его было легче увидеть: https://pastebin.com/JEMz0f6T

Моя попыткасоздать автономную программу, используя hikaricp: Код:

package test;

import com.zaxxer.hikari.HikariDataSource;

public class Main
{
    public static void main(String[] args) {
        HikariDataSource hikari = new HikariDataSource();

        //Setting Hikari properties
        hikari.setMaximumPoolSize(10);
        hikari.setDriverClassName("com.mysql.jdbc.Driver");
        hikari.setJdbcUrl("jdbc:mysql://" + "localhost" + ":" + "3306" + "/" + "plugin");
        hikari.setUsername("Server1");
        hikari.setPassword("227VU07dickCQjav");
    }
}

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>Test</groupId>
    <artifactId>Test</artifactId>
    <version>1.0-SNAPSHOT</version>


    <dependencies>
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.17</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP -->
        <dependency>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
            <version>3.4.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <!-- Build an executable JAR -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>test.Main</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

</project>

stacktrace: https://pastebin.com/fNQ7EFnQ

Я опубликовал проблему на HikaricpGithub, это может не подходить, так как это кажется проблемой только для меня, но эй! Может быть, он может помочь. Я не знаю, почему это происходит, я подозреваю, что другие люди могут выполнить HikariCP просто отлично, вопрос в том, почему это не работает для меня ...

Редактировать: кажется, что-то подобное произошло раньше:

https://www.spigotmc.org/threads/hikaricp-with-spigot-not-importing-with-the-jar.246851/ Проверка, могу ли я заставить мою проблему исправить себя, используя эту информацию.

Хорошо. Добавив новые аргументы в мой pom.xml, я теперь удалил NoClassDefFoundErrorи теперь получили это: https://pastebin.com/9DU9Tqra

Но, эй, это предупреждение, а не аварийный сброс. это значит, что это сработало!

Отсутствуют детали? Спросите, и я посмотрю, что я могу сделать.

Ответы [ 2 ]

0 голосов
/ 06 октября 2019

Проблема в NoClassDefFoundError.

Что это исправило? Я исправил это после записи в spigotmc:

https://www.spigotmc.org/threads/hikaricp-with-spigot-not-importing-with-the-jar.246851/

и добавил:

<build>
    <finalName>${project.name}</finalName>
    <defaultGoal>clean package</defaultGoal>

    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>

            <includes>
                <include>*</include>
            </includes>
        </resource>
    </resources>

    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.5.1</version>

            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.3</version>

            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>

            <configuration>
                <createDependencyReducedPom>false</createDependencyReducedPom>
            </configuration>
        </plugin>
    </plugins>
</build>

в мой pom.xml, после добавления я использовал «clean», затем"пакет" с помощью Maven и попробовал, и это сработало. однако я получаю предупреждение:

[23:02:45] [Craft Scheduler Thread - 0/WARN]: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
[23:02:45] [Craft Scheduler Thread - 0/WARN]: SLF4J: Defaulting to no-operation (NOP) logger implementation
[23:02:45] [Craft Scheduler Thread - 0/WARN]: SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Однако это не относится к исходному вопросу. Я выберу это в качестве ответа, если кто-то не найдет лучшего решения.

0 голосов
/ 05 октября 2019

@ Хэмпус, я попробовал и проверил, что в версии 3.4.0 Hicari Pool класс com.zaxxer.hikari.HikariDataSource доступен в пакете com / zaxxer / hikari. Вы можете увидеть скриншот ниже. Что я сомневаюсь, так это репозиторий, который вы добавили. Пожалуйста, удалите следующее из pom.xml и попробуйте.

<repositories>
    <repository>
        <id>spigot-repo</id>
        <url>https://hub.spigotmc.org/nexus/content/repositories/snapshot/</url>
    </repository>
</repositories>

Я знаю, что вы можете использовать свой нексус, этот файл JAR доступен в Maven Central. Ниже приведена ссылка на хранилище mvn.

https://mvnrepository.com/artifact/com.zaxxer/HikariCP/3.4.0

enter image description here

...