1

我有一个名为 dbstuff 的 java 项目,它从db.propertieswith读取属性getClass().getResourceAsStream("/db.properties")。这些值是诸如连接字符串之类的东西。这个 dbstuff 用于各种项目,其中大多数是 web。

我现在有一个作为依赖项使用的 dropwizard 项目(maven)dbstuff.jar,该项目被编译为一个 fat jar,如此db.properties所述,目前 dbstuff 仅在文件存在时读取值/src/main/resources,并且在创建包时db.properties嵌入到罐子里。

我想要实现的是db.properties外部化,以便我可以拥有各种db.properties(每个环境一个)但只有一个 dropwizard jar,这可能吗?

谢谢你

4

2 回答 2

0

我认为您可以在 DropWizard 中创建一个配置类,然后使用它为每个环境返回正确的配置 - https://dropwizard.readthedocs.org/en/latest/manual/hibernate.html

至于您的问题,如果您在同一路径上有多个资源,即使在不同的 jar 上,也不能保证将使用哪个 Java。当您将名为 db.properties 的文件添加到 /src/main/resources 时,它会变成资源“db.properties”,并按如下方式读取:

http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getResourceAsStream(java.lang.String)

于 2013-09-17T13:36:30.403 回答
0

db.properties您可以在运行时通过系统属性传入外部文件的路径,例如:

java -jar myjar.jar -DdbConfig=/path/to/db.properties

然后在您的代码中,dbstuff.jar您可以加载属性文件:

final String path = System.getProperty("dbConfig");
final Properties properties = Properties.load(new FileInputStream(path));

或者,正如您所提到的,您正在使用 Dropwizard,在您的配置文件(yaml 文件或您正在使用的任何文件)中有一个属性指定外部db.properties文件的位置,在服务器初始化期间加载属性,然后将它们传递给任何需要它在dbstuff.jar.

然后您可以更进一步,忘记该db.properties文件并在您的 Dropwizard 配置中有一个完整的部分来指定所有属性,例如:

db:
    url: jdbc://....
    user: dbuser
    # etc...

然后传上dbstuff.jar需要什么对象。有关如何执行此操作的更多信息,请参阅 Dropwizard 的配置文档。

于 2013-09-17T13:36:45.810 回答