3

我创建了一个 Java 程序来比较版本管理工具中保存为文件的脚本和我们数据库中加载的脚本。这是一个简单的程序,从头到尾运行,并在发现差异时输出到控制台。现在我想从 .properties 文件中加载数据库 URL、用户名和密码以及我的文件的位置。

我确实假设如果我将文件放在类路径上,它将在我的 Java 程序中可见:

Properties values = new Properties();
try
{
    File checkPackages = new File("myfile.properties");
    if(!checkPackages.exists()) throw new FileNotFoundException();

    values.load(new FileReader(checkPackages));
}
catch(FileNotFoundException fnfe) {}

我还想把整个程序保存到一个 .jar 文件中,这样它就更有用了。不幸的是,我发现引用 .properties 文件的唯一方法是将它放在运行 java.exe 的目录中。PATH 或 CLASSPATH 似乎不适用?

我发现了一个关于 .jar 文件的 Manifest 文件的 Oracle 站点,因为我希望那里有答案,但是清单中的 Class-path: 元素似乎只引用了不在 .jar 中的 .jar 文件(而不是 .properties 文件!) 问题:有没有办法将 .properties 文件包装到 .jar 文件中,这样我的用户就不必知道它在那里?有什么方法可以将 Oracle 驱动程序 .jar 包装到应用程序的 .jar 中,这样我的用户就不必知道它的存在(Oracle 说这需要“自定义代码”)?

TIA

4

3 回答 3

1

其中一种方法是使用 -D 开关在 java 命令行上定义系统属性。该系统属性可能包含您的属性文件的路径。

例如

java -cp ... -Dmyproject.properties=/path/to/my.app.properties my.package.App

如此处所述,在您的代码中获取属性:

String propPath = System.getProperty( "myproject.properties" );

final Properties myProps;

final FileInputStream in = new FileInputStream( propPath );

 try
 {
     myProps = Properties.load( in );
 }
 finally
 {
     in.close( );
 }
于 2013-06-01T14:14:44.197 回答
1

ClassLoader#getResource()您可以使用andClassLoader#getResourceAsStream()方法在类路径中获取资源(即使密封在 JAR 中) 。

例如:

Properties values = new Properties();
values.load(ThisClass.class.getClassLoader().getResourceAsStream("myproject.properties"));
// umm, don't forget to close the stream, this code is just an example usage

请注意,将用户名和密码存储到程序中的任何数据库都被认为存在严重的安全风险

于 2013-06-01T14:25:17.137 回答
0

好吧,我建议使用公钥和私钥加密敏感数据(在这种情况下为用户名、密码、url),而不是隐藏它。.properties毕竟压缩任何 jar 文件(本质上是 zip 格式)并跟踪文件并不难

于 2013-06-01T14:01:09.200 回答