2

我正在开发一个小型 Java 项目,该项目现在连接到 MS SQL Server 2000 数据库,但很快将连接到 MS SQL Server 2005 数据库。我正在创建一个 jar 以便于部署。我试图设置它,这样我就可以更改配置文件并更改驱动程序(就像在 .NET 中一样)。但是,由于 Java 的Jar 嵌入类路径的限制,以及嵌入的类路径 (1) 上缺少通配符。有没有办法在不明确引用每个驱动程序 jar 的情况下解决这个问题?如果我必须这样做,我每次数据库更改时都必须重新编译......

(1):但是,Class-Path jar-manifest 标头中不支持类路径通配符。

4

4 回答 4

2

通常,您可以在运行时修改类路径。像这样的方法是在 Java 中处理“插件”类型 jar 的一般方法(与您的情况非常相似的要求)。

于 2009-08-26T14:43:19.420 回答
0

您可以在配置文件中包含有关使用哪个驱动程序的信息。或者在 JAR 文件本身的清单中。启动应用程序时只需包含所有 JAR 文件,但从配置中加载驱动程序的名称。

于 2009-08-26T14:26:04.410 回答
0

我想说的是,在您部署的同一个 Jar 中包含第三方代码不是 Java 方式(如在标准实践中)。然而,jar 只是一个 zip 文件,所以在大多数情况下(除了清单中的一些花哨的东西),如果需要,您可以将它们组合起来。

话虽如此,您可以在 jar 文件中包含对所有潜在 JDBC 驱动程序 jar 的类路径引用,或者简单地以正确的方式调用 JDBC 驱动程序 jar。然后在同一目录中有一个配置文件(确保在 JAR 的类路径中包含 .),然后从中读取驱动程序名称,并使用 Class.forName() 加载驱动程序。

你可以做一些更有趣的事情(比如在运行时找到正确的 jar 并动态加载它,即使它不在类路径上)但是这些事情有点复杂,所以像上面这样简单的事情应该可以工作。

您永远不必重新编译。如果您在更改驱动程序时必须重新编译,那么您实际上并没有正确执行 JDBC。

于 2009-08-26T14:29:39.817 回答
0

您必须将驱动程序 jar 文件和特定提供程序的 JDBC 驱动程序的实际名称分开。

我真的鼓励不要在你自己的 jar 中包含 jdbc 驱动程序 jar。就在他们到运行时的路径。同样,您可以在运行时从系统属性甚至配置文件中获取 JDBC 驱动程序管理器的名称。

所以像这样运行应用程序:

java -jar myapp.jar -cp sqlserver.jar -DdriverManager=com.microsoft.sqlserver.jdbc.SQLServerDriver -DdbUrl=jdbc:some:url

在你的应用程序中,做这样的事情(我省略了异常处理):

Class.forName(System.getProperty("driverManager"));
Connection conn = DriverManager.getConnection(System.getProperty("dbUrl"))

;

这样,您只需将适当的 jar 文件添加到类路径并更改 driverManager 和 dbUrl 属性即可更改驱动程序。这样您就不必重新编译来支持新的驱动程序。

这是我能想到的最简单的解决方案。

于 2009-08-26T14:42:08.127 回答