我的一些代码存在问题,我搜索并尝试了所有我知道的内容,没有任何运气。
情境:
如果它不存在,应用程序将下载JDBC驱动程序并将其添加到ClassLoader,如下所示:( note :storageDataManager是我用于SQL方法的类)
File h2Driver = new File(directory.toString() + File.separator + "lib" + File.separator + "h2.jar");
if (h2Driver.exists()) {
URL[] url = new URL[0];
try {
url = new URL[]{h2Driver.toURI().toURL()};
storageDataManager.setClassLoader(new URLClassLoader(url));
} catch (MalformedURLException ignore) {}
}
当storageDataManager运行第一个查询时,它会尝试连接指定的驱动程序,如果它有ClassLoader,则使用ClassLoader:
if (getClassLoader() != null) {
getLogging().debug("Loading custom class loader for H2 driver: " + getClassLoader().toString());
Driver driver = (Driver) Class.forName("org.h2.Driver", true, getClassLoader()).newInstance();
getLogging().debug("Loaded H2 driver: " + driver.toString() + " - " + driver.getMinorVersion() + " - " + driver.getMajorVersion());
DriverManager.registerDriver(driver);
} else {
getLogging().debug("Loading H2 driver.");
Class.forName("org.h2.Driver");
}
outputDrivers();
this.con = DriverManager.getConnection(this.url, this.username, this.password);
break;
当我运行应用程序时,我收到此错误:
“*没有为jdbc找到合适的驱动程序:h2:plugins \ Odin \ data \ OdinStorage; AUTO_RECONNECT = TRUE *”
这是完整的日志:
[Debug] Loading custom class loader for H2 driver: java.net.URLClassLoader@3bf3d5f4
[Debug] Loaded H2 driver: org.h2.Driver@67257ce8 - 3 - 1
[Debug] Checking DriverManager drivers.
[Debug] Found driver #1: sun.jdbc.odbc.JdbcOdbcDriver
[Debug] Found driver #2: com.mysql.jdbc.Driver
[Debug] Found 2 drivers in DriverManager.
--------------------------- STACKTRACE ERROR ---------------------------
Class name: java.sql.DriverManager
Error message: No suitable driver found for jdbc:h2:plugins\Odin\data\OdinStorage;AUTO_RECONNECT=TRUE
Error cause: null
File name: null
Function name: getConnection
Error line: -1
--------------------------- STACKTRACE START ---------------------------
java.sql.DriverManager.getConnection(Unknown Source)
java.sql.DriverManager.getConnection(Unknown Source)
com.craftfire.commons.managers.DataManager.connect(DataManager.java:756)
com.craftfire.commons.managers.DataManager.executeQuery(DataManager.java:526)
com.craftfire.odin.managers.StorageManager.checkInventoryDatabase(StorageManager.java:65)
com.craftfire.odin.managers.StorageManager.checkDatabases(StorageManager.java:56)
com.craftfire.odin.managers.StorageManager.<init>(StorageManager.java:34)
com.craftfire.odin.managers.OdinManager.loadDatabases(OdinManager.java:206)
com.craftfire.odin.managers.OdinManager.init(OdinManager.java:75)
com.craftfire.odin.layer.bukkit.Odin.onEnable(Odin.java:63)
org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:217)
org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:374)
org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:381)
org.bukkit.craftbukkit.CraftServer.loadPlugin(CraftServer.java:266)
org.bukkit.craftbukkit.CraftServer.enablePlugins(CraftServer.java:248)
org.bukkit.craftbukkit.CraftServer.<init>(CraftServer.java:200)
net.minecraft.server.ServerConfigurationManagerAbstract.<init>(ServerConfigurationManagerAbstract.java:50)
net.minecraft.server.ServerConfigurationManager.<init>(SourceFile:11)
net.minecraft.server.DedicatedServer.init(DedicatedServer.java:105)
net.minecraft.server.MinecraftServer.run(MinecraftServer.java:377)
net.minecraft.server.ThreadServerApplication.run(SourceFile:539)
---------------------------- STACKTRACE END ----------------------------
我的问题是,为什么驱动程序不会出现在DriverManager.getDrivers()中?
注意:我不希望将库添加到CLASSPATH,这就是我需要找到上述问题的解决方案的原因。
我该如何解决这个问题?我只需要从jar中加载H2 JDB驱动程序。
我也试过这个:
有人能为我提供解决方案吗?
谢谢!
答案 0 :(得分:5)
根据Oracle文档:http://docs.oracle.com/cd/E19501-01/819-3659/beadf/index.html
类加载器将类加载委托给子类加载器,在类路径上搜索类。但是,用于加载库的URLClassloader对于系统或引导层次结构是不可见的,因此它无法找到该类(尽管它已被加载,尽管在另一个castl ...类加载器中)。
最简单的解决方案是使用URLClassloader替换系统类加载器并使用addUrl(... path ...)加载库,正如此答案所示:How should I load Jars dynamically at runtime?
答案 1 :(得分:1)
您必须将确切的 org.h2.Driver
* .jar文件名添加到应用程序的类路径中。
示例:/home/applications/games/minecraft/drivers/jdbcH2driver.jar
因此,决定驱动程序在应用程序中的位置,并找到应用程序主文件夹路径,以便在安装使用它的应用程序时完全构建它。
此外,它可能无法运行,因为从网上下载时可能需要一段时间,之后必须复制到“应用程序类路径的正确文件夹”才能使用它并使用正确的.jar名称(如上段所述)。 要成功下载“查询和应用程序操作应放在一个线程中”,以防止超出下一行指令。
明智地,在应用程序启动时,您将检查.jar是否存在并下载它(如果它不存在并安装),同时向用户发出警告,如果.jar不存在则下载它。
答案 2 :(得分:1)
我遇到了同样的问题。使用
在pom.xml中配置了h2驱动程序<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.193</version>
</dependency>
因为我在我的项目中使用Java 6(不要问为什么;-))但是来自Maven Repository的h2-1.4.193.jar依赖于Java 7,因此无法使用此驱动程序版本。 / p>
更改pom.xml以使用h2-1.4.190.jar解决了我的问题。
另请参阅h2database git项目中的issue #300。
答案 3 :(得分:1)
就我而言,错误在 Maven 范围内
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
<scope>test</scope>
</dependency>
一旦您将其删除或将其更改为可见范围,它就会起作用
答案 4 :(得分:0)
答案 5 :(得分:0)
对我来说,使用groovy
和grapes
进行依赖解析时出现此错误。
您需要告诉葡萄使用systemClassLoader。 e.g。
@GrabConfig(systemClassLoader=true)
答案 6 :(得分:0)
设置Hibernate属性 url值为: JDBC:H2:MEM:测试; DB_CLOSE_DELAY = -1
driverClassName:
<property name="driverClassName">
<value>org.hibernate.dialect.H2Dialect</value>
将H2驱动程序添加到pom:
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.3.166</version>
</dependency>
答案 7 :(得分:0)
我在 Kotlin 项目中遇到了同样的问题。 我在 bild.gradle.kts 中添加了
dependencies {
implementation("com.h2database:h2:1.4.199")
..
}
然后在 IntelliJ File->Invalidate Cache 中。