如何将文件附加到可以在此jar中进行编辑的jar中?

时间:2019-01-12 19:00:21

标签: java config

我正在制作一个适用于MySQL数据库的程序,目前我将URL,登录名和密码等存储为public static String。现在,我需要使其能够在另一台计算机上工作,因此数据库地址会有所不同,因此我需要一种在programm内进行编辑并保存的方法。我只想使用外部txt文件,但是我不知道如何指出它的位置。

我决定使用属性文件进行制作,将其放置在src/res文件夹中。当我在Intellij Idea中尝试时,它可以正常工作,但是当我构建jar(工件)时,我得到了java.io.FileNotFoundException

我尝试了两种方法: 这是刚刚复制的 private String getFile(String fileName) {

    StringBuilder result = new StringBuilder("");

    //Get file from resources folder
    ClassLoader classLoader = getClass().getClassLoader();
    File file = new File(classLoader.getResource(fileName).getFile());
    System.out.println(file.length());

    try (Scanner scanner = new Scanner(file)) {

        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            result.append(line).append("\n");
        }

        scanner.close();

    } catch (IOException e) {
        e.printStackTrace();
    }

    return result.toString();

}
System.out.println(obj.getFile("res/cfg.txt"));</code>

And second one using Properties class:

try(FileReader reader =  new FileReader("src/res/cfg.txt")) {
Properties properties = new Properties();
properties.load(reader);
System.out.println(properties.get("password"));
}catch (Exception e) {
e.printStackTrace();
System.out.println(e);
}

StringBuilder result = new StringBuilder(""); //Get file from resources folder ClassLoader classLoader = getClass().getClassLoader(); File file = new File(classLoader.getResource(fileName).getFile()); System.out.println(file.length()); try (Scanner scanner = new Scanner(file)) { while (scanner.hasNextLine()) { String line = scanner.nextLine(); result.append(line).append("\n"); } scanner.close(); } catch (IOException e) { e.printStackTrace(); } return result.toString(); } System.out.println(obj.getFile("res/cfg.txt"));</code> 通过两种方式,我得到Properties。像这样附加配置文件的正确方法是什么?

3 个答案:

答案 0 :(得分:3)

由于该文件位于.JAR内,因此无法通过new File()进行访问,但是您仍然可以通过ClassLoader进行读取:

Properties properties = new Properties();
try (InputStream stream = getClass().getResourceAsStream("/res/cfg.txt")) {
    properties.load(stream);
}

请注意,JAR是只读的。所以这种方法行不通。

如果要具有可编辑的配置,则应将cfg.txt放在JAR之外,并从文件系统中读取。例如这样的

Properties properties = new Properties();
File appPath = new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().toURI()).getParentFile();
try (InputStream stream = new FileInputStream(new File(appPath, "cfg.txt"))) {
    properties.load(stream);
}

答案 1 :(得分:1)

您可以在多个位置放置配置选项,并且可靠的部署策略将使用以下某些(或全部)技术:

  • 将配置文件存储在相对于用户主文件夹的已知位置,如我在评论中所述。这适用于Windows(C:\Users\efrisch),Linux(/home/efrisch)和Mac(/Users/efrisch

    File f = new File(System.getProperty("user.home"), "my-settings.txt");
    
  • 读取环境变量以对其进行控制

    File f = new File(System.getenv("DEPLOY_DIR"), "my-settings.txt");
    
  • 使用Apache ZooKeeper之类的分散服务来存储数据库设置

  • 使用Standalone JNDI (或部署目标中内置的JNDI)

  • 使用Connection Pool

答案 2 :(得分:0)

尝试将数据库凭据保存在环境变量中,然后以以下方式调用它们:

public static String myValue = System.getenv("ENVIRONMENT_VARIABLE_NAME");