如何访问 jar 包内部的配置文件?

7
我正在使用FlatPack来解析和加载平面文件中的数据。这需要加载一个配置文件,其中存储了平面文件列的映射关系。
我有一个常量来定义映射文件的位置:
private static final String MAPPING_FILE = "src/com/company/config/Maping.pzmap.xml";

我有一个parse(File dataFile)方法,实际上是用于解析的:

private void parse(File dataFile) throws FileNotFoundException, SQLException {
        Parser parser;

        log.info("Parsing " + dataFile.getName());

        FileReader mappingFileReader = new FileReader(MAPPING_FILE);
        FileReader dataFileReader = new FileReader(dataFile);

        parser = DefaultParserFactory.getInstance().newFixedLengthParser(mappingFileReader, dataFileReader);
        parser.setHandlingShortLines(true);

        DataSet dataSet = parser.parse();

        //process the data
}

当我将所有内容打包成jar文件并运行时,它在FileReader mappingFileReader = new FileReader(MAPPING_FILE);处出现FileNotFoundException。但是该文件确实在jar文件中。
我该如何访问它?
我已经查看了这个问题这个问题关于访问jar文件内部文件的方法,它们都建议临时提取文件。但是我不想这样做。
5个回答

15

1
应该是 "Class.getResourceAsStream()"。 - mtpettyp

2

1

如果我没记错的话,getResourceAsStream() 的行为可能会因为你的 Web 应用程序部署在哪个 Web 服务器上而有所不同,例如当它作为 war 文件部署在 Websphere 实例上时可能会出现问题。但我不确定这是否适用于您。

但我不确定您是否正在尝试解决“正确”的问题:如果这是一个配置文件,那么意味着它是数据相关的,对吧?不是代码相关的(您的 jar 文件)?当平面文件发生变化时,您的配置文件也需要相应更改,对吧?如果是这样,那么听起来配置文件应该存储在其他地方,甚至可以作为参数传递给您的 jar 文件。

但也许我还没有完全理解您的问题...


0

在您的配置文件中使用以下代码

InputStream in = Class.getClassLoader().getResourceAsStream(configFilePath);

注意:请用你的 Config 类名替换 classname。
演示完整代码:
导入:
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

代码:

    Properties properties = new Properties();
    InputStream in = MyCLassName.class.getClassLoader().getResourceAsStream(configFilePath); //pass the config.properties file path with file name
    try {
        properties.load(in);
        properties.getProperty("username"); //here put the key from config.properties
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

0
使用Apache Commons Configuration,您可以轻松读写XML,自动更新,查找路径或jar中的配置文件,而无需太多麻烦。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接