我无法从jar读取数据

时间:2013-09-12 13:53:40

标签: java jar

项目结构 structure of project

代码:

public class WriterXlsx {
    public WriterXlsx(String sfilename, List<RecordNameCode> records, List<Day> recordsDay, Integer fullTime) {
        String path = "res/" + sfilename + ".xlsx";
        URL resURL = getClass().getClassLoader().getResource(path);
        try (InputStream inputStream = resURL.openStream())
        {
            int lastUsedColumn = createListHead().size();
            XSSFWorkbook workBook = new XSSFWorkbook(inputStream);
            XSSFSheet sheet = workBook.getSheetAt(0);

            drawRecordHead(createListHead(),sheet);
            writeContent(2, records,sheet);
            createPlanForDay(recordsDay,fullTime,lastUsedColumn,sheet,workBook);

            try(FileOutputStream out = new FileOutputStream("C:\\Users\\student3\\"+sfilename+".xlsx"); ) {
            workBook.write(out);
            out.close();         }

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

程序将写入SfileName并从res\ IDE(Intellij IDEA)中的文件读取,但它不能独立工作。 我无法通过.jar archieve启动程序。 (也许找不到res目录)..

清单:

Manifest-Version: 1.0
Main-Class: workhere.Start

课程开始:

public class Start {
 public static void main(String[] args) {
        System.out.println("It's working");
        new Start().start(countDays);
        System.out.println("Work is finished");
    }
........

2 个答案:

答案 0 :(得分:0)

我认为因为您正在使用.getResource()尝试

getClass().getClassLoader().getResourceAsStream(path);

而不是

getClass().getClassLoader().getResource(path);

一旦将文件打包到jar中,它就不再是文件系统上的独立文件,它是独占的文件系统路径。只有一个文件,jar和你的文件就是它的内容。

答案 1 :(得分:0)

你可以用不同的方式进行测试,例如:

this.getClass().getResource(sfilename)

getResources找到相对于包的资源。

this.getClass().getResource("/"+sfilename)

getResources会将其视为绝对路径,只需调用类加载器即可。

this.getClass().getClassLoader().getResource(sfilename)

你不能在ClassLoader路径中使用/的原因是因为所有ClassLoader路径都是绝对的,因此/不是路径中有效的第一个字符。