【问题标题】:Using .properties file from Java console program使用 Java 控制台程序中的 .properties 文件
【发布时间】:2013-05-28 05:30:28
【问题描述】:

我创建了一个 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 似乎不适用??

我找到了an Oracle site about the .jar file's Manifest file,因为我希望那里有答案,但清单中的 Class-path: 元素似乎只引用了不在 .jar 中的 .jar 文件(而不是 .properties文件是!) 问题: 有没有办法将 .properties 文件包装到 .jar 文件中,这样我的用户就不必知道它的存在? 有没有办法将 Oracle 驱动程序 .jar 包装到应用程序的 .jar 中,这样我的用户就不必知道它的存在(Oracle 说这需要“自定义代码”)?

TIA

【问题讨论】:

    标签: java properties jar


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      例如

      java -cp ... -Dmyproject.properties=/path/to/my.app.properties 我的.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( );
       }
      

      【讨论】:

        【解决方案3】:

        您可以使用ClassLoader#getResource()ClassLoader#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
        

        请注意,将用户名和密码存储到程序is considered a heavy security risk中的任何数据库中。

        【讨论】:

        • 这正是我在 .properties 文件中寻找的内容。谢谢。还有其他一些关于动态加载 .jar 的帖子。他们似乎都同意,虽然很难做到正确,但最好还是按照通常的方式去做。
        猜你喜欢
        • 2014-09-28
        • 2012-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-12
        • 1970-01-01
        • 2012-04-21
        • 1970-01-01
        相关资源
        最近更新 更多