【问题标题】:Where (which properties file) does System.getProperty("key") reads from?System.getProperty("key") 从哪里(哪个属性文件)读取?
【发布时间】:2013-08-23 06:46:37
【问题描述】:

我的应用程序使用String str = System.getProperty("key","default");,它总是返回默认值,因为我无法在属性文件中设置键值对。

我尝试在位于 users->appdata->locallow->sun->java>deployment 的 deployment.properties 文件中设置它,并且还直接将 key=value 放在 java 控制面板的运行时参数中,但不起作用。

请帮助我正确设置它,或者如果存在要设置这些值的不同属性文件,请分享路径? 我用谷歌搜索但找不到。在此先感谢

编辑:我们使用 jeety 服务器进行部署。我们的源代码捆绑了许多属性文件。

【问题讨论】:

  • 它是什么样的应用程序?如果是 Web/企业应用程序(即 WAR 或 EAR 部署),请同时说明您正在使用哪个应用程序服务器。
  • @mthmulders 它基本上是一个客户端服务器应用程序。我们使用 IE 作为我们的客户端,在服务器端我们部署 jetty 服务器。

标签: java jvm filesystems


【解决方案1】:

无需添加单独的文件。

使用setProperties 方法。

要修改现有的系统属性集,请使用 System.setProperties。此方法采用已初始化的 Properties 对象以包含要设置的属性。此方法将整个系统属性集替换为由 Properties 对象表示的新集。

警告:更改系统属性具有潜在危险,应谨慎行事。许多系统属性在启动后不会重新读取,它们仅供参考。更改某些属性可能会产生意想不到的副作用。

Official Docs

如果你还想创建:Example by docs

【讨论】:

  • 缺点是这需要你硬编码属性,而系统属性是避免在程序中硬编码值的好方法(不是唯一的)。
  • @SURSEH ATTA 实际上我需要知道它从哪里读取(getProperty)或写入(setProperty)。这些方法读取写入的 excat 文件。
  • @RajeshKumar 恕我直言,Those are resolving at run time,不是来自文件。当您使用 setproperty() 时,会分配这些常量。
【解决方案2】:

如果你想为System.getProperty 设置一个自定义属性文件,我们这里就是这样做的:

  1. 为您将为 Web 应用程序创建的所有类创建一个基类作为基对象。
  2. 在基类中,编写此代码
    java.io.InputStream is = loader.getResourceAsStream("custom system property filename");
    System.getProperties().load(is);
    

【讨论】:

    【解决方案3】:

    好吧,System.getProperty(String) 返回与 JVM 的全局系统相关的属性。 Here you can find 可用属性列表。

    如果你想加载一个自定义的属性文件,你应该在你自己的属性对象中加载这个文件,你可以find an example here。您应该将此Properties object 与系统属性分开。您永远不应该只将自定义属性加载到系统属性中。 (您可以通过System.setProperties(Properties) 执行此操作。)这就像定义全局变量,即sign of poor program design

    【讨论】:

    • 嗨,实际上我的情况是跟踪我们客户使用的现有应用程序中的一些 xml 实例。现在我必须找到一种方法来将此“键”设置为默认值以外的值,以便可以进行跟踪。
    • 你可以考虑:System.getProperties().setProperty("key", "value").
    【解决方案4】:

    这些值是在运行时使用本机代码设置的。它在 System.c 中设置,以及一个名为 Java_java_lang_System_initProperties

    的函数

    片段

    JNIEXPORT jobject JNICALL
    Java_java_lang_System_initProperties(JNIEnv *env, jclass cla, jobject props)
    {
        char buf[128];
        java_props_t *sprops = GetJavaProperties(env);
        jmethodID putID = (*env)->GetMethodID(env,
                                              (*env)->GetObjectClass(env, props),
                                              "put",
                "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
        jmethodID removeID = (*env)->GetMethodID(env,
                                              (*env)->GetObjectClass(env, props),
                                              "remove",
                "(Ljava/lang/Object;)Ljava/lang/Object;");
        jmethodID getPropID = (*env)->GetMethodID(env,
                                              (*env)->GetObjectClass(env, props),
                                              "getProperty",
                "(Ljava/lang/String;)Ljava/lang/String;");
        jobject ret = NULL;
        jstring jVMVal = NULL;
    
        if (sprops == NULL || putID == NULL ) return NULL;
    
        PUTPROP(props, "java.specification.version",
                JDK_MAJOR_VERSION "." JDK_MINOR_VERSION);
        PUTPROP(props, "java.specification.name",
                "Java Platform API Specification");
        PUTPROP(props, "java.specification.vendor",
                JAVA_SPECIFICATION_VENDOR);
    
        PUTPROP(props, "java.version", RELEASE);
        PUTPROP(props, "java.vendor", VENDOR);
        PUTPROP(props, "java.vendor.url", VENDOR_URL);
        PUTPROP(props, "java.vendor.url.bug", VENDOR_URL_BUG);
        .......
        .......
        .......
    

    【讨论】:

      【解决方案5】:

      它们存储在调试/运行配置中 click here for screenshot

      你可以像这样访问它们。

      System.out.println(System.getProperty("username"));
      System.out.println(System.getProperty("password"));
      

      【讨论】:

        【解决方案6】:

        Java 系统属性由 JVM 自动设置。您可以通过将 -D 开关传递给运行时来添加其他属性,例如

        java -Dkey=blue -Dhopp=topp ....
        

        等等

        【讨论】:

        • 我已经尝试过了,但它不起作用。仅返回默认值。还有其他选择吗?据我所知 -D 用于布尔值。建议
        • 是的,它可以在命令提示符下工作,但不能从 java 控制面板。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多