我可以使用类路径覆盖正在运行的jar中的文件吗?

Gus*_*uss 18 java jar classpath executable-jar

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

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

java -cp new-config:. -jar application.jar
Run Code Online (Sandbox Code Playgroud)

但我不能让类new-config路径在应用程序JAR的内容之前有路径条目.它是硬编码的,JAR的内容始终是类路径中的第一件事吗?

ala*_*irg 21

为什么不在不指定-jar的情况下调用应用程序,而是明确地命名应用程序主类?这将允许您按所需顺序将new-config和application.jar放在类路径中:

例如(假设"new-config"是包含重写属性文件的目录)

java -cp new-config:application.jar Application.Main.Class
Run Code Online (Sandbox Code Playgroud)

我相信主类的名字可以在jar里面的MANIFEST.MF文件中找到....

  • 主要问题是我实际上并没有使用-cp参数,而是在清单文件中指定类路径,因为应用程序需要许多其他外部JAR - 提取所有容易出错的内容.但我敢打赌,我可以写一些脚本从清单中提取类路径并自动构建一个相关的命令行,所以这可能是我将要使用的答案. (2认同)

Ada*_*ski 13

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

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

作为描述在这里.解决方法是在jar文件的清单中指定类路径以包含附加路径(此处描述).

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

Spring配置代码段

<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>
Run Code Online (Sandbox Code Playgroud)

属性文件片段

dbServer=MyServer
dbPort=1433
dbName=MyDb
dbUserName=Me
dbPassword=foobar
Run Code Online (Sandbox Code Playgroud)