没有加载HikariCP驱动程序的光滑3.0.0 - IllegalAccessException:AbstractHikariConfig无法访问具有修饰符"private"的成员

Yan*_*eve 5 reflection scala slick hikaricp slick-3.0

我试图使用tminglei/slick-pg v9.0.0和光滑的3.0.0并得到一个IllegalAccessException:

akka.actor.ActorInitializationException: exception during creation
    at akka.actor.ActorInitializationException$.apply(Actor.scala:166) ~[akka-actor_2.11-2.3.11.jar:na]
    ...
Caused by: java.lang.RuntimeException: driverClassName specified class 'com.github.tminglei.MyPostgresDriver$' could not be loaded
    at com.zaxxer.hikari.AbstractHikariConfig.setDriverClassName(AbstractHikariConfig.java:370) ~[HikariCP-java6-2.3.8.jar:na]
    at slick.jdbc.HikariCPJdbcDataSource$$anonfun$forConfig$18.apply(JdbcDataSource.scala:145) ~[slick_2.11-3.0.0.jar:na]
    at slick.jdbc.HikariCPJdbcDataSource$$anonfun$forConfig$18.apply(JdbcDataSource.scala:145) ~[slick_2.11-3.0.0.jar:na]
    at scala.Option.map(Option.scala:146) ~[scala-library-2.11.7.jar:na]
    at slick.jdbc.HikariCPJdbcDataSource$.forConfig(JdbcDataSource.scala:145) ~[slick_2.11-3.0.0.jar:na]
    at slick.jdbc.HikariCPJdbcDataSource$.forConfig(JdbcDataSource.scala:135) ~[slick_2.11-3.0.0.jar:na]
    at slick.jdbc.JdbcDataSource$.forConfig(JdbcDataSource.scala:35) ~[slick_2.11-3.0.0.jar:na]
    at slick.jdbc.JdbcBackend$DatabaseFactoryDef$class.forConfig(JdbcBackend.scala:223) ~[slick_2.11-3.0.0.jar:na]
    at slick.jdbc.JdbcBackend$$anon$3.forConfig(JdbcBackend.scala:33) ~[slick_2.11-3.0.0.jar:na]
    ...
Caused by: java.lang.IllegalAccessException: Class com.zaxxer.hikari.AbstractHikariConfig can not access a member of class com.github.tminglei.MyPostgresDriver$ with modifiers "private"
    at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:109) ~[na:1.7.0_79]
    at java.lang.Class.newInstance(Class.java:373) ~[na:1.7.0_79]
    at com.zaxxer.hikari.AbstractHikariConfig.setDriverClassName(AbstractHikariConfig.java:366) ~[HikariCP-java6-2.3.8.jar:na]
    ... 43 common frames omitted
Run Code Online (Sandbox Code Playgroud)

HikariCP是光面3.0.0中的默认连接池

我已经像示例中那样定义了驱动程序类:

trait MyPostgresDriver extends ExPostgresDriver with PgArraySupport
  with PgEnumSupport
  with PgRangeSupport
  with PgHStoreSupport
  with PgSearchSupport{

  override val api = new MyAPI {}

  //////
  trait MyAPI extends API
  with ArrayImplicits
  with RangeImplicits
  with HStoreImplicits
  with SearchImplicits
  with SearchAssistants

}

object MyPostgresDriver extends MyPostgresDriver
Run Code Online (Sandbox Code Playgroud)

我的数据库配置非常简单[以下类型安全配置的摘录]:

slick.dbs.default {

  driver="com.github.tminglei.MyPostgresDriver$"

  db {
    driver="org.postgresql.Driver"

    url="jdbc:postgresql://hostname:port/dbname"
    user=user
    password="pass"
  }
}
Run Code Online (Sandbox Code Playgroud)

它似乎不应该工作,但......

我应该以某种方式改变我的司机课程吗?还有别的吗?

注意:在我正在使用的stacktrace中可以看到

  1. Java 1.7.0_79
  2. 斯卡拉2.11.7
  3. akka 2.3.11(我分享了光滑和akka的配置实例)
  4. 光滑的3.0.0
  5. HikariCP-java6 2.3.8
  6. tminglei的slick-pg_core 0.9.0

最后,通过Class.class中的jdk代码进行调试时(反编译的第143行)

 Constructor tmpConstructor1 = this.cachedConstructor; 
Run Code Online (Sandbox Code Playgroud)

我得到以下(toString'ed)值(如intellij所示):

private com.github.tminglei.MyPostgresDriver$()
Run Code Online (Sandbox Code Playgroud)

这可能是问题的原因吗?如果是这样我该如何解决?


编辑

我已经用库存PostgresDriver替换了自定义驱动程序配置,如下所示:

slick.dbs.default {

  driver="slick.driver.PostgresDriver$"

  db {
    driver="org.postgresql.Driver"

    url="jdbc:postgresql://hostname:port/dbname"
    user=user
    password="pass"
  }
}
Run Code Online (Sandbox Code Playgroud)

错误是一样的:

akka.actor.ActorInitializationException: exception during creation
    ...
Caused by: java.lang.RuntimeException: driverClassName specified class 'slick.driver.PostgresDriver$' could not be loaded
    ... 
Caused by: java.lang.IllegalAccessException: Class com.zaxxer.hikari.AbstractHikariConfig can not access a member of class slick.driver.PostgresDriver$ with modifiers "private"
Run Code Online (Sandbox Code Playgroud)

jec*_*art 13

我遇到了类似的问题.

我认为你正在使用,Database.forConfig("slick.dbs.default")但你的配置文件是DatabaseConfig格式.

相反,尝试使用:

val dbConfig: DatabaseConfig[PostgresDriver] = DatabaseConfig.forConfig("slick.dbs.default")
val db = dbConfig.db
Run Code Online (Sandbox Code Playgroud)