Java1.4中的Jar文件依赖项

Java1.4中的Jar文件依赖项,java,jar,classpath,executable-jar,Java,Jar,Classpath,Executable Jar,我正在从事一个小型Java项目,该项目现在连接到MS SQL Server 2000数据库,但不久将连接到MS SQL Server 2005数据库。为了便于部署,我正在创建一个jar。我试图设置它,以便只需更改配置文件和更改驱动程序(就像在.NET中一样)。但是,由于Java的局限性,以及嵌入式类路径(1)上缺少通配符。有没有办法在不显式引用每个驱动程序jar的情况下绕过这个问题? 如果我必须这样做,我将不得不在每次数据库更改时重新编译 :但是,在类路径jar清单头中不支持类路径通配符。您可以

我正在从事一个小型Java项目,该项目现在连接到MS SQL Server 2000数据库,但不久将连接到MS SQL Server 2005数据库。为了便于部署,我正在创建一个jar。我试图设置它,以便只需更改配置文件和更改驱动程序(就像在.NET中一样)。但是,由于Java的局限性,以及嵌入式类路径(1)上缺少通配符。有没有办法在不显式引用每个驱动程序jar的情况下绕过这个问题? 如果我必须这样做,我将不得不在每次数据库更改时重新编译


:但是,在类路径jar清单头中不支持类路径通配符。

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

我想说,在部署时将第三方代码包含在同一JAR中不是Java方式(如标准做法)。然而,jar只是一个zip文件,所以在大多数情况下(清单中出现的一些奇特的东西除外),如果需要的话,您可以将它们组合起来

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

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


你永远不需要重新编译。如果您在更改驱动程序时必须重新编译,那么您就没有真正正确地使用JDBC。

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

我非常鼓励不要在您自己的jar中包含jdbc驱动程序jar。 仅在运行时将它们添加到路径。 类似地,您可以在运行时从系统属性甚至配置文件中获取JDBC驱动程序管理器的名称

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

java -jar myapp.jar -cp sqlserver.jar -DdriverManager=com.microsoft.sqlserver.jdbc.SQLServerDriver -DdbUrl=jdbc:some:url
在应用程序中,执行以下操作(我省略了异常处理):

)

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


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

通常,您可以修改。这样的方法是处理Java中“插件”类型JAR的一般方法(与您的情况非常相似)。

您的链接是Java 6。在1.4中,根本没有类路径通配符。我可以对不在我的类路径上的Jar中的类执行class.ForName()吗?如果没有,那么我仍然局限于类路径上特别列出的jar,并且当新的驱动程序jar出现时,仍然需要重新编译(重新jar?)。Class.forName必须在类路径运行时上。不需要重新编译。当一个新的jar出现时,您只需替换该文件,无需重新编译。Microsoft有一个很好的习惯,即以不同的方式命名其驱动程序jar文件。我可以对jar中不在我的类路径上的类执行Class.ForName()吗?如果没有,那么我仍然局限于类路径上特别列出的jar,并且当新的驱动程序jar出现时,仍然需要重新编译(重新jar?)。在Class.forName()中,您提供了一个字符串,以便可以将任何您想要的内容放在那里,并捕获异常以查看是否找到了什么。但是为什么要硬编码Class.forName()?上面提供的解决方案允许您在运行时对其进行更改,这样您的应用程序就可以支持任何数据库,只要提供了正确的driverManager和db url(并且classpath中有一个带有数据库驱动程序的jar)。
Class.forName(System.getProperty("driverManager"));
Connection conn = DriverManager.getConnection(System.getProperty("dbUrl"))