概述:
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文件或重新构建应用程序之间做出选择?
答案 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
类没有静态类依赖性,或任何其他类可能触发过早的静态初始化。