静态代码块中 JNLP 文件的系统属性

System Properties from JNLP file in static code block

概览:


详情:

我有一系列 Java 多年前编写的 Web Start (JNLP) 应用程序。 JNLP 文件中设置的一些值需要根据环境(如数据库连接字符串)进行更改。以前我们使用 JNLP 文件的 属性 元素将这些值直接设置为系统属性。

对于较新版本的 Java,我们希望对 JNLP 文件进行签名以使其更安全。因为我需要允许配置,所以我使用 JNLP 模板来允许更改而无需重新构建 jar。 JNLP 模板不允许使用通配符 属性 元素,因此我已将配置值移至 Argument 部分。在我的应用程序的 main 方法中,我正在解析参数并将它们设置为系统属性。

但是,应用程序的某些设置(即检查数据库连接)发生在 static 块中。 static 块中的代码在 main 方法执行之前执行,因此 static 块现在是 运行 在我的系统属性设置之前。

有没有办法及时从JNLP文件中取值到System Properties以供静态代码块使用?如果没有,我是否需要在签署 JNLP 文件或重新构建应用程序之间做出选择?

我认为您最好重新构建应用程序以从单独的属性文件/对象获取配置信息。

如您所见,尽早将内容注入系统属性对象可能很棘手。问题是在依赖 classes 的静态初始化发生之前进行。

如果您确实想继续尝试系统属性方法,这里有一个可行的计划。

将您的 "main" class 重构为两部分。

public class Launcher {

     public void main(String[] args) {
         // Extract properties from args
         // Set them in System Properties object
         // Use class.forName(...) to load the RealMain class
         // Use reflection to call RealMain.main, passing the args.
    }
}

import ...
public class RealMain {
    // real stuff
    public void main(String[] args) {
        // real stuff
    }
}

假设 Launcher class 对 RealMain class 或 任何其他没有静态 class 依赖class 可能会触发过早的静态初始化。