Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何:在Java中动态定义属性_Java_Properties_Ibatis_Dynamic - Fatal编程技术网

如何:在Java中动态定义属性

如何:在Java中动态定义属性,java,properties,ibatis,dynamic,Java,Properties,Ibatis,Dynamic,如何在Java中动态定义一些属性。现在,我使用的是一个属性文件,但我需要在安装之前更改这些属性,所以这些属性应该在jar(或install)文件之外的文件中设置 这些属性定义了我的IBatis连接。继续使用.properties并将文件作为资源加载 如果它在类路径中,就会找到它 我使用的是一个资源包,因为它对我来说更容易 编辑 如果文件位于类路径中,则可以将其作为资源加载:Some.class.loadResource(…),或者我所做的是使用基本相同的ResourceBundle 例如,如果我

如何在Java中动态定义一些属性。现在,我使用的是一个属性文件,但我需要在安装之前更改这些属性,所以这些属性应该在jar(或install)文件之外的文件中设置


这些属性定义了我的IBatis连接。

继续使用.properties并将文件作为资源加载

如果它在类路径中,就会找到它

我使用的是一个资源包,因为它对我来说更容易

编辑

如果文件位于类路径中,则可以将其作为资源加载:
Some.class.loadResource(…)
,或者我所做的是使用基本相同的ResourceBundle

例如,如果我有:

import java.util.ResourceBundle;

public class ResourceBundleTest {
    public static void main( String [] args ) {
        ResourceBundle bundle = ResourceBundle.getBundle("connection");
        for( String key: bundle.keySet() ){
            System.out.printf("bundle[%s]=%s%n",key, bundle.getString(key));
        }
    }
}
如果在类路径中,我可以加载该文件。属性位于外部,位于“some/nested/dir”中

如果我运行它而不将该目录添加到我的类路径,它将无法工作:

$java ResourceBundleTest 
Exception in thread "main" java.util.MissingResourceException: Can't find bundle for base name connection, locale es_ES
    at java.ut...ceBundle.java:1427)
    at java.ut...urceBundle.java:1250)
    at java.ut...ceBundle.java:705)
    at Resourc...st.java:6)
但是如果我将目录添加到我的类路径中,那么文件将很容易找到

$java -cp some/nested/dir/:.  ResourceBundleTest 
bundle[lastName]=Reyes
bundle[age]=0x1F
bundle[name]=Oscar
$
以类似的方式,您可以拥有一个.jar文件,并将.properties文件放在任何您想要的地方,您只需将其包含在类路径中

使用属性的等效值为:

import java.util.Properties;

public class LoadProperties {
    public static void main( String [] args ) throws java.io.IOException {
        Properties properties = new Properties();
        properties.load( LoadProperties.class.getResourceAsStream("connection.properties"));
        properties.list( System.out );
    }
}

但出于某种原因,我更喜欢资源包。

属性文件很好,您只需将其包含在类路径中,它就可以位于jar之外


如果您想变得更时尚,您可以使用Preferences API,但这将使您的操作系统更符合标准,这会使部署变得复杂,因为您的配置位置会因平台而异,并且需要依赖平台的安装。

是,使用属性文件是常见的做法。此外,一般做法是为每个环境提供单独的属性文件,构建过程将根据目标选择正确的属性文件。您所需要做的就是将文件保存在类路径中,并使用类加载器查找它

只需将文件放在运行时类路径覆盖的路径之一,或者将文件的路径添加到(默认)运行时类路径。这样,Java代码可以继续作为类路径资源访问它

使用
java-JAR
命令或双击文件执行JAR文件时,将忽略
-cp
-classpath
参数,甚至是
%classpath%
环境变量。您可以在
META-INF/MANIFEST.MF
文件中将JAR文件的默认类路径定义为
Class Path
条目

例如

表示JAR文件当前所在的路径包含在运行时类路径中。因此,如果您将属性文件与JAR文件放在同一个文件夹中,它就会工作

您还可以指定绝对磁盘文件系统路径:

Class-Path: /var/foo

这样,文件夹
/var/foo
就被置于运行时类路径中。因此,如果您将属性文件放在该文件夹中,它就会工作

请澄清这个问题。属性文件不必在jar中。你为什么不把它存储在文件系统中呢?嗨,谢谢你的帮助,但我相信你不明白我的问题。我照你说的做。问题是属性的值将发生更改,并且无法在jar文件中设置这些值。它们需要很容易改变。现在清楚了吗?很可能你不明白我说的:P如果它在类路径中(可能在你的类之外),它将被加载。让我用一句话来更新答案sample@Victor:我相信您不理解“类路径”现象:)您基本上需要做的就是将文件放在运行时类路径覆盖的路径之一,或者将文件的路径添加到运行时类路径中。这样Java代码就可以继续作为类路径资源访问它。@Vic我已经更新了我的示例,第一次可能不够清楚。让我知道更新是否更好。我认为iBatis不支持
首选项
Class-Path: .
Class-Path: /var/foo