【问题标题】:Unable to load class named com.mysql.jdbc.jdbc2.optional.MysqlDataSource无法加载名为 com.mysql.jdbc.jdbc2.optional.MysqlDataSource 的类
【发布时间】:2017-05-03 23:36:24
【问题描述】:

我正在尝试设置一个使用 Spark 和 Apache shiro(用于身份验证和授权)的简单 Web 应用程序。

我希望从 MySQL 数据库进行身份验证,但我收到了一个 ClassNotFoundException 却找不到它。

这是我的 shiro.ini 配置文件:

[main]
jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm

ds = com.mysql.jdbc.jdbc2.optional.MysqlDataSource
ds.serverName = localhost
ds.user = ...
ds.password = ...
ds.databaseName = mydb

jdbcRealm.dataSource = $ds
jdbcRealm.permissionsLookupEnabled = true
jdbcRealm.authenticationQuery = "SELECT password FROM users WHERE user_name = ?"
jdbcRealm.userRolesQuery = "SELECT role_name FROM user_roles WHERE user_name = ?"
jdbcRealm.permissionsQuery = "SELECT permission FROM roles_permissions WHERE role_name = ?

还有我的 build.gradle 文件

group 'test'
version '1.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'application'

mainClassName = "Main"

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
    compile 'com.sparkjava:spark-core:2.5.4'
    compile 'ch.qos.logback:logback-classic:1.1.8'
    compile 'org.apache.shiro:shiro-core:1.1.0'
    compile 'mysql:mysql-connector-java:6.0.5'
    compile 'commons-logging:commons-logging:1.2'
    compile 'commons-dbcp:commons-dbcp:1.4'
}

jar {
    from {
        (configurations.runtime).collect {
            it.isDirectory() ? it : zipTree(it)
        }
    }
}

我得到的例外是:

Exception in thread "main" org.apache.shiro.config.ConfigurationException: Unable to instantiate class [com.mysql.jdbc.jdbc2.optional.MysqlDataSource] for object named 'ds'.  Please ensure you've specified the fully qualified class name correctly.
    at org.apache.shiro.config.ReflectionBuilder.createNewInstance(ReflectionBuilder.java:143)
    at org.apache.shiro.config.ReflectionBuilder.buildObjects(ReflectionBuilder.java:114)
    at org.apache.shiro.config.IniSecurityManagerFactory.buildInstances(IniSecurityManagerFactory.java:170)
    at org.apache.shiro.config.IniSecurityManagerFactory.createSecurityManager(IniSecurityManagerFactory.java:119)
    at org.apache.shiro.config.IniSecurityManagerFactory.createSecurityManager(IniSecurityManagerFactory.java:97)
    at org.apache.shiro.config.IniSecurityManagerFactory.createInstance(IniSecurityManagerFactory.java:83)
    at org.apache.shiro.config.IniSecurityManagerFactory.createInstance(IniSecurityManagerFactory.java:41)
    at org.apache.shiro.config.IniFactorySupport.createInstance(IniFactorySupport.java:123)
    at org.apache.shiro.util.AbstractFactory.getInstance(AbstractFactory.java:47)
    at Main.main(Main.java:23)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Caused by: org.apache.shiro.util.UnknownClassException: Unable to load class named [com.mysql.jdbc.jdbc2.optional.MysqlDataSource] from the thread context, current, or system/application ClassLoaders.  All heuristics have been exhausted.  Class could not be found.
    at org.apache.shiro.util.ClassUtils.forName(ClassUtils.java:148)
    at org.apache.shiro.util.ClassUtils.newInstance(ClassUtils.java:164)
    at org.apache.shiro.config.ReflectionBuilder.createNewInstance(ReflectionBuilder.java:136)
    ... 14 more

虽然我不是 100% 确定,但我认为问题在于 mysql 驱动程序在运行时不在类路径中...

【问题讨论】:

  • 你是如何运行你的应用程序的?你确定你的所有依赖都包含在你的类路径中吗?
  • 检查你的项目jar中是否有mysql连接器jar文件,如果没有添加。

标签: gradle shiro spark-java


【解决方案1】:

尝试使用

com.mysql.cj.jdbc.MysqlDataSource

而不是

com.mysql.jdbc.jdbc2.optional.MysqlDataSource

你正在编译mysql-connector-java:6.0.5

reference

【讨论】:

  • com.mysql.cj.jdbc.MysqlDataSource 抛出错误The import com.mysql cannot be resolved
  • 你是在build.gradle文件中编译com.mysql.cj.jdbc.MysqlDataSource还是将jar文件添加到你的classpath中?
  • 我解决了我在 运行时删除的依赖项中解决的问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-07
  • 2015-03-03
相关资源
最近更新 更多