静态代码块中 JNLP 文件的系统属性
System Properties from JNLP file in static code block
概览:
- 我希望我的 Java Web Start 应用程序是安全的,所以我正在签署 JNLP 文件
- 签署 JNLP 文件时,我无法直接设置配置系统属性,因此我将它们作为参数传递给
main
方法
- 参数没有及时设置为系统属性以供
static
代码块使用
详情:
我有一系列 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 可能会触发过早的静态初始化。
概览:
- 我希望我的 Java Web Start 应用程序是安全的,所以我正在签署 JNLP 文件
- 签署 JNLP 文件时,我无法直接设置配置系统属性,因此我将它们作为参数传递给
main
方法 - 参数没有及时设置为系统属性以供
static
代码块使用
详情:
我有一系列 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 可能会触发过早的静态初始化。