读取 JAR 文件外部的属性文件

2022-08-31 07:39:24

我有一个JAR文件,我的所有代码都存档以供运行。我必须访问一个属性文件,该文件需要在每次运行之前进行更改/编辑。我想将属性文件保存在JAR文件所在的同一目录中。有没有办法告诉Java从该目录中获取属性文件?

注意:我不想将属性文件保留在主目录中或在命令行参数中传递属性文件的路径。


答案 1

因此,您希望将主/可运行jar位于同一文件夹中的文件视为文件,而不是main/runnable jar的资源。在这种情况下,我自己的解决方案如下:.properties

首先:你的程序文件架构应该是这样的(假设你的主程序是main.jar它的主要属性文件是main.properties):

./ - the root of your program
 |__ main.jar
 |__ main.properties

使用此体系结构,您可以在 main.properties 运行之前或运行期间使用任何文本编辑器修改 main.jar.properties 文件中的任何属性(取决于程序的当前状态),因为它只是一个基于文本的文件。例如,您的 main.properties 文件可能包含:

app.version=1.0.0.0
app.name=Hello

因此,当您从根/基文件夹运行主程序时,通常您将像这样运行它:

java -jar ./main.jar

或者,立即:

java -jar main.jar

在 main.jar中,您需要为 main.properties 文件中的每个属性创建一些实用工具方法。假设该属性将具有以下方法:app.versiongetAppVersion()

/**
 * Gets the app.version property value from
 * the ./main.properties file of the base folder
 *
 * @return app.version string
 * @throws IOException
 */

import java.util.Properties;

public static String getAppVersion() throws IOException{

    String versionString = null;

    //to load application's properties, we use this class
    Properties mainProperties = new Properties();

    FileInputStream file;

    //the base folder is ./, the root of the main.properties file  
    String path = "./main.properties";

    //load the file handle for main.properties
    file = new FileInputStream(path);

    //load all the properties from this file
    mainProperties.load(file);

    //we have loaded the properties, so close the file handle
    file.close();

    //retrieve the property we are intrested, the app.version
    versionString = mainProperties.getProperty("app.version");

    return versionString;
}

在主程序中需要该值的任何部分中,我们按如下方式调用其方法:app.version

String version = null;
try{
     version = getAppVersion();
}
catch (IOException ioe){
    ioe.printStackTrace();
}

答案 2

我通过其他方式做到了。

Properties prop = new Properties();
    try {

        File jarPath=new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath());
        String propertiesPath=jarPath.getParentFile().getAbsolutePath();
        System.out.println(" propertiesPath-"+propertiesPath);
        prop.load(new FileInputStream(propertiesPath+"/importer.properties"));
    } catch (IOException e1) {
        e1.printStackTrace();
    }
  1. 获取 Jar 文件路径。
  2. 获取该文件的父文件夹。
  3. 在 InputStreamPath 中使用该路径和属性文件名。