有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java包含一个属性文件和一个Jar文件

我写了一个小应用程序。我已将特定于数据库的信息放在属性文件中

db.url=jdbc:mysql://localhost:3306/librarydb
db.user=root
db.passwd=pas$w0rd

当我构建应用程序以获取可执行jar文件时,属性文件包含在其中。将这些信息放在属性文件中的全部目的是允许用户更改这些信息,但这样做是不可能的

如何包含一个属性文件,而jar文件不在其中?有点像在中使用AppSettings文件。NET应用程序

我对Java非常陌生,如果您能将其分解为一组步骤,我将不胜感激

多谢各位

编辑:

这就是我如何从程序中的属性文件中获取值的方法

public class DatabaseHandler {

    public static Connection connectToDb() {
        Connection con = null;
        Properties props = new Properties();
        InputStream in = null;

        try {
            in = DatabaseHandler.class.getResourceAsStream("database.properties");
            props.load(in);
            in.close();

            String url = props.getProperty("db.url");
            String user = props.getProperty("db.user");
            String password = props.getProperty("db.passwd");

            con = DriverManager.getConnection(url, user, password);
        } catch (Exception ex) {        
            Logger.getLogger(DatabaseHandler.class.getName()).log(Level.SEVERE, null, ex); 
        }
            return con;
    }

}

共 (4) 个答案

  1. # 1 楼答案

    你说得对。如果用户打算修改这些属性,那么将它们放在JAR中的属性文件中是行不通的

    有两种方法:

    • 您可以将属性放入存储在文件系统中的属性文件中。问题在于找出文件系统中存储它们的位置:

      • 在UNIX/Linux上,对于在何处存储系统范围和每个用户的配置属性有一些约定,但这些约定有点松散,并且处于一种不断变化的状态(例如,某些“桌面”框架有自己的首选机制。

      • 我相信Windows也有类似的约定

      • 这种方法的问题可能是权限问题(您不希望一个用户更改另一个用户的首选项),甚至可能是只读文件系统等的问题

      • 如果要在文件系统中使用属性文件,那么将该位置硬连接到代码中是个坏主意。通过命令行参数和/或可使用-D选项设置的“系统属性”进行配置

    • 在Windows上,可以将属性放入Windows注册表。但您需要使用第三方库来完成此操作。当然,这不是可移植的——它在非Windows平台上不起作用

    • 您可以使用Java Preferences API。这可以跨多个平台移植,但它是一个以Java为中心的解决方案;i、 e.它不符合平台的“正常方式”

    简言之,从各个角度来看,没有一个解决方案是理想的


    但是一旦您决定了如何存储您的首选项,您就可以编写您的应用程序,以便它使用JAR文件中的属性文件来提供默认或初始设置

  2. # 2 楼答案

    您可以改为从类路径加载属性文件。这使您能够在jar内部绑定属性文件,但也可以在jar外部绑定属性文件。它只需要位于正在运行的应用程序的类路径上

    您可以通过以下方式执行此操作:

    Properties props = new Properties();
    InputStream inputStream = this.getClass().getClassLoader()
            .getResourceAsStream(propFileName);
    
    props.load(inputStream);
    
  3. # 3 楼答案

    而不是

    in = DatabaseHandler.class.getResourceAsStream("database.properties");
    

    试一试

    in = DatabaseHandler.class.getResourceAsStream("/database.properties");
    
  4. # 4 楼答案

    不要硬编码属性文件的位置。您的方法应该是从类路径流式传输文件

    如果不是,更好的方法是指向一个URL,该URL以特定的数据格式(比如JSON)返回属性信息

    如果您有JAR,请签出this

    如果您的应用程序是WAR,请检查properties in WAR