项目结构
代码:
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");
}
........
答案 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路径都是绝对的,因此/不是路径中有效的第一个字符。