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.jar
和
sqljdbc42-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'
并且该配置使用单引号返回值。请检查您的配置文件。