tl;博士:我们的 Spring Boot jar 中的类似乎可以看到捆绑的 jar 中的类,但它们的内容似乎无法看到。为什么?

我们的主要产品是一个网络应用程序,但所有的业务逻辑都集中在一个核心 mac-guffin-api.jar . mac-guffin-api.jar不是 Spring Boot 项目,但有一个名为 net.initech.api.Configuration 的 Spring Java 配置文件初始化所有服务和存储库等。我们使用 MS SQL Server 作为我们的后端 sqljdbc42:jar司机。

我们需要编写一个 ETL 来重用来自 API 项目的相同业务逻辑,因此我们创建了一个导入 mac-guffin-api.jar 的 Spring Boot Spring Batch 项目。作为 Maven 依赖项。 ETL 的配置( net.initech.etl.Configuration )导入的 API 配置没有问题(我可以从控制台日志中看到它)但是当 API 配置去创建数据库连接时 它找不到驱动程序。

Caused by: java.lang.ClassNotFoundException: 'com.microsoft.sqlserver.jdbc.SQLServerDriver' 
    at java.net.URLClassLoader.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:94) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Unknown Source) 
    at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:246) 
    ... 113 more 

但是,我可以清楚地看到包含驱动程序的 JAR 存在。 ETL jar 的内容是( Nb: mac-guffin-api.jarsqljdbc42-4.2.jar 未解压,它们是 ETL jar 中的 jar ):
mac-guffin-etl.jar 
| 
+- org.springframework.boot.loader... 
| 
+- BOOT-INF 
   | 
   +- classes 
   |  | 
   |  +- com.initech.etl.Main.class 
   |  | 
   |  +- com.initech.etl.Configuration.class 
   | 
   +- lib 
      | 
      +- mac-guffin-api.jar 
      |  | 
      |  +- com.initech.api.Configuration.class 
      | 
      +- sqljdbc42-4.2.jar 
         | 
         +- com.microsoft.sqlserver.jdbc.SQLServerDriver.class 

所以显然类ETL的配置类可以看到包含的JAR的内容(或者至少是API jar的内容),但是他们的API jar似乎看不到 com.microsoft.sqlserver.jdbc.SQLServerDriver.class在 SQL Server JDBC jar 中。

我什至可以做一个 Class.forName( "com.microsoft.sqlserver.jdbc.SQLServerDriver.class" )从 Spring 上下文的实例化之前开始,它没有问题。

这是类加载器的限制吗?是不是因为API项目不是Spring Boot?是因为缺少配置参数吗?这里发生了什么?

请您参考如下方法:

您可能从配置中获取驱动程序值,例如

my.driver = 'com.microsoft.sqlserver.jdbc.SQLServerDriver'



并且该配置使用单引号返回值。请检查您的配置文件。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!