与 Maven 的 Snowflake 连接,类路径上的 jar

Snowflake connection with Maven, jar on classpath

我目前正在尝试与我们的 Snowflake 数据库建立简单的连接。我遵循了他们网站上的文档:https://docs.snowflake.net/manuals/user-guide/jdbc-configure.html 并验证连接字符串是否正确。

然而,每次我启动该程序时,我都会收到一个 SQLException,说明它找不到 jar,或者没有找到驱动程序:

[19:28:54] [Server thread/WARN]: driver not found
[19:28:54] [Server thread/WARN]: java.sql.SQLException: No suitable driver found for jdbc:snowflake://d9022.east-us-2.azure.snowflakecomputing.com/
[19:28:54] [Server thread/WARN]:        at java.sql.DriverManager.getConnection(Unknown Source)
[19:28:54] [Server thread/WARN]:        at java.sql.DriverManager.getConnection(Unknown Source)
[19:28:54] [Server thread/WARN]:        at com.mcnations.nationsatwar.jdbc.DatabaseManager.getConnection(DatabaseManager.java:44)
[19:28:54] [Server thread/WARN]:        at com.mcnations.nationsatwar.jdbc.DatabaseManager.init(DatabaseManager.java:50)
[19:28:54] [Server thread/WARN]:        at com.mcnations.nationsatwar.jdbc.DatabaseManager.<init>(DatabaseManager.java:19)
[19:28:54] [Server thread/WARN]:        at net.mcnations.nationsatwar.Player.NationPlayer.<init>(NationPlayer.java:54)
[19:28:54] [Server thread/WARN]:        at net.mcnations.nationsatwar.NationsInitializer.playerLogin(NationsInitializer.java:78)

我使用 Maven 作为我的依赖项。在我的 POM 中,我只有:

<!-- https://mvnrepository.com/artifact/net.snowflake/snowflake-jdbc -->
        <dependency>
            <groupId>net.snowflake</groupId>
            <artifactId>snowflake-jdbc</artifactId>
            <version>3.9.2</version>
        </dependency>

即使声明了 Maven 依赖项(根据 Snowflake 的文档),我仍然遇到无驱动程序异常。然后我将 jar 添加到我的构建路径中,并希望(也许)您在构建路径上同时需要 Maven 依赖项和实际的 .jar 文件。这并没有解决问题。

此时我不知所措。我不知道自己做错了什么,也不知道如何解决。

我的连接class:

package com.mcnations.nationsatwar.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

import net.mcnations.nationsatwar.Player.NationPlayer;

public class DatabaseManager {

    private NationPlayer player;

    public DatabaseManager(NationPlayer player) throws SQLException{
        this.player = player;

        init();

    }

    private static Connection getConnection() throws SQLException{


        try {

            Class.forName("net.snowflake.client.jdbc.SnowflakeDriver");

        }catch(ClassNotFoundException ex) {

            System.err.println("driver not found");
        }

        Properties properties = new Properties();

        properties.put("user", "NationsUser");
        properties.put("password", "//myPassword");
        properties.put("db", "//myDB");
        properties.put("role", "SYSADMIN");

        String connectStr = "jdbc:snowflake://9022.east-us-2.azure.snowflakecomputing.com/";

        return DriverManager.getConnection(connectStr, properties);

    }

    private static void init() throws SQLException{

        Connection connObject = getConnection();

        Statement statement = connObject.createStatement();

        ResultSet rSet = statement.executeQuery("SELECT * FROM PlayerData");

        if(rSet == null) {
            System.out.println("rSet is null");
        }
        else {
            System.out.println(rSet.next());
        }

    }

}

错误 "java.sql.SQLException: No suitable driver found for java.sql.SQLException: No suitable driver found for jdbc:snowflake://.snowflakecommputing.com" 当您尝试使用 Java 程序连接 Snowflake 数据库但您没有 Snowflake JDBC 驱动程序 {ex . snowflake-jdbc-3.11.0.jar} 在调用 getConnection() 方法之前未在您的类路径或驱动程序中注册。

请确保您已将 Snowflake JDBC 驱动程序 "snowflake-jdbc-3.11.0.jar" 包含到您的构建库路径中。

I am using Eclipse and i never faced any such issue .
Create a Maven Project , put dependencies and you are good .

File->New->Project->Maven Project .Give a name to the project ->Finish .

Now add the below dependency.

    <dependency>
            <groupId>net.snowflake</groupId>
            <artifactId>snowflake-jdbc</artifactId>
            <version>3.9.0</version>
        </dependency>

如果你得到了 jar,你能检查你的 ~/.m2 文件夹吗?

此错误是由于应用程序无法找到 Snowflake jdbc 驱动程序造成的。当 jar 文件具有必需的参数(即 config.yml)时,可能会发生这种情况。

因为 Snowflake JDBC 驱动程序没有这些必需的文件,我告诉主要 class 启动它们本身,以及 Snowflake JDBC jar 文件一起通过:

@echo off
title Server Console
java -classpath "spigot-1.15.1.jar;lib/*" org.bukkit.craftbukkit.Main
PAUSE

所在行java -classpath "spigot-1.15.1.jar;lib/*" org.bukkit.craftbukkit.Main

  1. 启动 java 应用程序
  2. 沿着 "my_main_jar.jar;"
  3. 的 class 路径
  4. 使用 /lib 目录中的所有文件启动
  5. 并指向主要 class(在我的例子中,org.bukkit.craftbukkit.Main)

这些命令行参数本质上是 "handed off" 应用程序。

据我了解,您没有在您的应用程序中部署所需的 JAR (snowflake-jdbc-3.9.2.jar),因此它无法在类路径中找到驱动程序。当我在没有正确类路径的情况下尝试 运行 我的应用程序时,这是类似的输出:

java -cp snowflaketest01-1.0-SNAPSHOT.jar com.gokhanatil.snowflaketest01.Main
driver not found
Exception in thread "main" java.sql.SQLException: No suitable driver found for jdbc:snowflake://xxxxxxxxxx.snowflakecomputing.com/
    at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:702)
    at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:189)
    at com.gokhanatil.snowflaketest01.Main.getConnection(Main.java:28)
    at com.gokhanatil.snowflaketest01.Main.main(Main.java:36)

您可以自己包含 JAR,也可以让 Maven 将所需的 JAR 打包到您的最终 jar 中。您可以在您的 pom 文件中包含以下内容:

...
    <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
        </configuration>
    </plugin>
...

因此它会生成一个大的 JAR 文件,其中包含所有必需的 JAR(雪花驱动程序等):

java -cp snowflaketest01-1.0-SNAPSHOT-jar-with-dependencies.jar com.gokhanatil.snowflaketest01.Main

请检查 java 类路径:https://docs.oracle.com/javase/8/docs/technotes/tools/windows/classpath.html

并使用 Maven 在 JAR 中包含依赖项: Including dependencies in a jar with Maven