是否可以使用类路径重写正在运行的 jar 中的文件?

2022-09-02 09:22:07

我有一个JAR文件,其中包含该应用程序以及该应用程序的配置文件。应用程序从类路径(using )加载配置文件,并使用烘焙到 JAR 文件中的配置文件完全满足其依赖关系。ClassLoader.getResource()

有时我希望应用程序以稍微不同的配置运行(特别是我想覆盖JDBC URL以指向不同的数据库),所以我创建了一个新的配置文件,将其存储在正确的目录结构中(这意味着在类路径条目的目录中),我想做这样的事情:/config

java -cp new-config:. -jar application.jar

但是我无法让类路径在应用程序JAR的内容之前具有路径条目。JAR的内容始终是类路径上的第一件事,这是否是硬编码的?new-config


答案 1

为什么不直接调用应用程序而不指定 -jar,而是显式命名应用程序主类呢?这将允许您按所需的顺序将 new-config 和应用程序.jar放在类路径上:

例如(假设“new-config”是一个包含被覆盖属性文件的目录)

java -cp new-config:application.jar Application.Main.Class

我相信主类的名称可以在MANIFEST中找到。MF 文件在罐子里 ....


答案 2

使用 -jar 选项启动应用程序时:

...JAR 文件是所有用户类的源,其他用户类路径设置将被忽略

如此所述。解决方法是在 jar 文件的清单中指定类路径以包含其他路径(如此处所述)。

但是,鉴于您只是在谈论修改配置,您可能希望采用不依赖于类路径的不同方法。例如,我通常通过Spring配置我的应用程序,使用属性文件来确定数据库的位置等。我的Spring配置在测试,QA和实时环境中是一致的,但我在启动应用程序时传递了一个不同的属性文件作为命令行参数。

弹簧配置代码段

<bean id="MyDataSource" class="org.springframework.jdbc.datasource.SingleConnectionDataSource">
    <property name="url" value="jdbc:microsoft:sqlserver://${dbServer}:${dbPort};DatabaseName=${dbName}"/>
    <property name="username" value="${dbUserName}"/>
    <property name="password" value="${dbPassword}"/>
    <property name="suppressClose" value="false"/>
</bean>

属性文件代码段

dbServer=MyServer
dbPort=1433
dbName=MyDb
dbUserName=Me
dbPassword=foobar

推荐