代码之家  ›  专栏  ›  技术社区  ›  Guss

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

  •  15
  • Guss  · 技术社区  · 16 年前

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

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

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

    但是我不能让类路径具有 new-config

    4 回复  |  直到 16 年前
        1
  •  21
  •   alasdairg    16 年前

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

    e、 g.(假设“new config”是包含重写属性文件的目录)

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

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

        2
  •  13
  •   Adamski    16 年前

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

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

    here . 一种解决方法是在jar文件的清单中指定类路径,以包含额外的路径(如下所述) here ).

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

    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>
    

    dbServer=MyServer
    dbPort=1433
    dbName=MyDb
    dbUserName=Me
    dbPassword=foobar
    
        3
  •  3
  •   Gerd Klima    16 年前

    由-JAR选项指定的JAR存档将覆盖所有其他值。

    ClassLoader.getResource() .

    final Properties p = new Properties();
    p.load(DefaultConfiguration.class.getResourceAsStream("config.properties"));
    

    然后,我们以同样的方式加载外部文件,并用外部值覆盖内部值。

    有关类加载工作原理的信息,请参见:

    http://java.sun.com/javase/6/docs/technotes/tools/findingclasses.html

        4
  •  1
  •   Kelly S. French    16 年前

    仅使用类路径可能是不可能的。有很多方法可以让你打电话给 ClassLoader.getResource() 使用静态路径查找资源。如果它正在这样做,它将绕过类路径。

    推荐文章