执行jar文件以在类路径中加载文件

时间:2015-03-24 15:43:13

标签: java unix apache-poi java-io

我的MainClass.java有一个main方法,其中包含以下代码来读取excel文件

String xlsxFilename = args[0];
try (InputStream fis = MainClass.class.getClassLoader().getResourceAsStream(xlsxFilename);
    Workbook workbook = WorkbookFactory.create(fis);) {
    ...

这个类包含在一个jar文件中,放在名为lib的文件夹中,我正在使用shell脚本执行它

run.sh

#!/bin/sh
CP=lib/*:
java -cp "$CP" in.test.MainClass $1

现在我运行命令来执行sh文件

sh run.sh Sample.xlsx

但这引发了异常,

Exception in thread "main" java.lang.NullPointerException
at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:79)

我想这个异常是因为getResourceAsStream没有加载excel文件,而fis对象是null。 getResourceAsStream()是否看不到当前目录?如何读取MainClass.java中当前目录中的xls文件?

1 个答案:

答案 0 :(得分:1)

我认为问题出在这行代码中:

InputStream fis = MainClass.class.getClassLoader().getResourceAsStream(xlsxFilename)

当且仅当您的XLS在类路径中时,即在JVM的xlsxFilename选项指定的文件夹中或内部时,类加载器才能找到文件-classpath。 jar 存档。在第一种情况下,你的line命令应该是这样的:

java -classpath "your.jar:/path/to/xls/folder" in.test.MainClass $1

显然/path/to/xls/folder是您必须放置xls文件的文件夹。

在后一种情况下,XLS文件必须位于.class个文件的根文件夹中。

我建议您使用绝对文件路径加载XLS文件。