首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >静态代码块中JNLP文件的系统属性

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

Stack Overflow用户
提问于 2017-03-12 04:46:49
回答 1查看 408关注 0票数 0

概述:

  • 我希望我的Java应用程序是安全的,所以我要对JNLP文件进行签名
  • 在对JNLP文件进行签名时,我不能直接设置配置系统属性,因此我将它们作为参数传递到main方法中
  • 这些参数不会及时设置为系统属性,以供static代码块使用

详细信息:

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

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-12 05:29:44

我认为最好重新设计应用程序,以便从单独的属性文件/对象中获取配置信息。

正如您所观察到的,足够早地向系统属性对象注入一些内容是很棘手的。问题是在发生依赖类的静态初始化之前就这样做。

如果您确实想继续尝试系统属性方法,下面是一个可能有效的计划。

将“主”类重构为两部分。

代码语言:javascript
复制
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类没有静态类依赖关系,或者任何可能触发过早静态初始化的其他类。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42743879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档