【问题标题】:Using MySQL JDBC driver inside Gradle issue? [duplicate]在 Gradle 问题中使用 MySQL JDBC 驱动程序? [复制]
【发布时间】:2022-02-06 00:22:47
【问题描述】:

我正在尝试学习如何在 Java 中使用 Gradle,并且正在开始一个全新的项目。我正在尝试连接到数据库。

我的build.gradle 文件是

plugins {
    id 'java'
}

repositories {
    mavenCentral()
}

jar {
    manifest {
        attributes 'Main-Class': 'com.brian.Application'
    }
}

dependencies {
    testImplementation 'junit:junit:4.13.2'
    implementation 'mysql:mysql-connector-java:8.0.25'
}

group 'org.brian'
version '1.0-SNAPSHOT'

文件com.brian.Application是

package com.brian;

public class Application {
    public static void main(String[] args) {
        DBConnection.runDBTest();
    }
}

而我的DBConnection 是

package com.brian;

import java.sql.*;

public class DBConnection {
    private static String url = "jdbc:mysql://localhost:3306/RecipeCollection";
    private static String driverName = "com.mysql.cj.jdbc.Driver";
    private static String username = "RecipeCurator";
    private static String password = "Sup3rYumm!";
    private static Connection con;
    private static String urlstring;

    public static Connection getConnection() {
        try {
            Class.forName(driverName);
            try {
                con = DriverManager.getConnection(url, username, password);
            } catch (SQLException e) {
//                System.out.println("Failed to create database connection");
                e.printStackTrace();
            }
        } catch (ClassNotFoundException e) {
            System.out.println("Could not find driver for " + driverName);
            e.printStackTrace();
        }
        return con;
    }

    public static void runDBTest() {
        Connection con = null;
        Statement stmt = null;
        ResultSet rs = null;
        con = DBConnection.getConnection();
        try {
            stmt = con.createStatement();
            rs = stmt.executeQuery("SELECT 1");
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("Something went wrong");
        }
        System.out.println(rs);
    }
}

当我执行./gradlew build 时,它会成功构建。

当我尝试使用 java -jar build/libs/recipe-curator-1.0-SNAPSHOT.jar 运行它时,我收到此错误

Could not find driver for com.mysql.cj.jdbc.Driver
java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:315)
    at com.brian.DBConnection.getConnection(DBConnection.java:15)
    at com.brian.DBConnection.runDBTest(DBConnection.java:33)
    at com.brian.Application.main(Application.java:5)
Exception in thread "main" java.lang.NullPointerException
    at com.brian.DBConnection.runDBTest(DBConnection.java:35)
    at com.brian.Application.main(Application.java:5)

我不确定发生了什么,因为我有 mysql 作为依赖项,并且构建似乎工作正常,但它没有运行。我做错了什么?

【问题讨论】:

    标签: java gradle mysql-connector


    【解决方案1】:

    这是因为 Java 不知道从哪里加载 MySQL 驱动程序类。您的构建创建的 JAR 没有提到它需要运行的 JAR 文件(如 MySQL 连接器/J JAR)的 Class-Path 标头。

    您可以尝试配置jar 以填充Class-Path 以引用所需的JAR。这是一个适用于 Gradle 的示例7.3.3

    jar {
        manifest {
            attributes(
                    "Main-Class": "com.brian.Application",
                    'Class-Path': configurations.runtimeClasspath.files.collect { it.name }.join(' ')
            )
        }
    }
    

    这将在META-INF/MANIFEST.MF 中为您提供Class-Path: mysql-connector-java-8.0.25.jar protobuf-java-3.11.4.jar 在build/libs/recipe-curator-1.0-SNAPSHOT.jar 中。它不会确保所需的 JAR 位于同一位置 (build/libs)。

    更简单的替代方法是使用 Gradle 的 Application 插件,它可以帮助您创建一个包含适用于 Windows 和 Unix 的运行器脚本的发行版。

    • 将id 'application' 添加到plugins 闭包
    • 将jar 闭包替换为以下内容
    application {
        mainClass.set('com.brian.Application')
    }
    

    然后运行./gradlew build installDist。这将在build/distributions 下创建tar 和zip 分发版,并在build/install/recipe-curator 下安装一个分发版。然后,您可以在类 Unix 系统上运行 build/install/recipe-curator/bin/recipe-curator(或在 Windows 上运行 build\install\recipe-curator\bin\recipe-curator.bat)。

    【讨论】:

      猜你喜欢
      • 2014-12-18
      • 2012-03-10
      • 2012-11-23
      • 1970-01-01
      • 2011-06-23
      • 2016-09-07
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      相关资源
      最近更新 更多