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

时间:2017-03-12 04:46:49

标签: java jnlp

概述:

  • 我希望我的Java Web Start应用程序是安全的,因此我正在签署JNLP文件
  • 签署JNLP文件时,我无法直接设置系统属性,因此我将它们作为参数传递给main方法
  • 参数未及时设置为系统属性以供static代码块使用

详细信息:

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

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

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

有没有办法及时将JNLP文件中的值传递给系统属性以供静态代码块使用?如果没有,我是否需要在签署JNLP文件或重新构建应用程序之间做出选择?

1 个答案:

答案 0 :(得分:2)

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

正如您所观察到的那样,尽早将内容注入System属性对象可能会非常棘手。问题是在依赖类的静态初始化发生之前就这样做了。

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

将“主要”课程重构为两部分。

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类对RealMain类没有静态类依赖性,或任何其他类可能触发过早的静态初始化。