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