我正在开发一个小型Java项目,该项目现在连接到MS SQL Server 2000数据库,但很快将连接到MS SQL Server 2005数据库。我正在创建一个jar,以便于部署。我试图设置它,所以我可以更改配置文件并更改驱动程序(就像在.NET中一样)。但是,由于Java Jar embedded classpath的限制,以及嵌入式类路径(1)中缺少通配符。有没有办法解决这个问题而不明确地引用每个驱动程序jar? 如果我必须这样做,我将不得不每次数据库更改时重新编译...
(1):但是,Class-Path jar-manifest标头中不支持类路径通配符。
答案 0 :(得分:2)
通常,您可以修改classpath at runtime。像这样的方法是在Java中处理“插件”类型jar的一般方法(与你的情况非常相似)。
答案 1 :(得分:0)
您可以包含有关使用哪种驱动程序的信息,例如:配置文件。或者在JAR文件本身的清单中。只需在启动应用程序时包含所有JAR文件,但从配置中加载驱动程序的名称。
答案 2 :(得分:0)
我想说,在部署的同一个Jar中包含第三方代码并不是Java方式(在标准实践中)。然而,jar只是一个zip文件,因此在大多数情况下(除了清单中的一些花哨的东西),如果需要,你可以将它们组合起来。
话虽这么说,您可以在jar文件中包含对所有潜在JDBC驱动程序jar的类路径引用,或者只是以正确的方式调用JDBC驱动程序jar。然后在同一目录中有一个配置文件(确保在JAR的类路径中包含。)然后从中读取驱动程序名称,并使用Class.forName()加载驱动程序。
你可以做更好的事情(比如在运行时找到合适的jar并动态加载它,即使它不在类路径上)但是这些事情有点复杂,所以像上面那样简单的东西应该有效。
您永远不必重新编译。如果在更改驱动程序时必须重新编译,那么你并没有真正做正确的JDBC。
答案 3 :(得分: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属性,即可更改驱动程序。这样您就不必重新编译以支持新驱动程序。
这是我能想到的最简单的解决方案。