概述:
main方法中static代码块使用详细信息:
我有一系列几年前编写的Java (JNLP)应用程序。JNLP文件中有一些值需要根据环境进行更改(比如数据库连接字符串)。以前,我们使用JNLP文件的Property元素直接将这些值设置为。
对于较新版本的Java,我们希望对JNLP文件进行签名,以使其更加安全。因为我需要允许配置,所以我使用一个JNLP模板来允许更改,而不需要重新构建jar。JNLP模板不允许对属性元素进行通配符,因此我将配置值移到了参数部分。在我的应用程序的main方法中,我解析参数并将它们设置为System。
但是,应用程序的一些设置(即检查数据库连接)发生在static块中。static块中的代码在执行main方法之前执行,因此在设置系统属性之前,static块正在运行。
是否有办法及时从JNLP文件获取系统属性的值,以供静态代码块使用?如果没有,我需要在签署JNLP文件还是重新架构应用程序之间做出选择?
发布于 2017-03-12 05:29:44
我认为最好重新设计应用程序,以便从单独的属性文件/对象中获取配置信息。
正如您所观察到的,足够早地向系统属性对象注入一些内容是很棘手的。问题是在发生依赖类的静态初始化之前就这样做。
如果您确实想继续尝试系统属性方法,下面是一个可能有效的计划。
将“主”类重构为两部分。
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类没有静态类依赖关系,或者任何可能触发过早静态初始化的其他类。
https://stackoverflow.com/questions/42743879
复制相似问题