Java Maven在Jar中打包Excel文件

我在资源文件夹中有几个资源文件(excel文件),我想打包到我的jar文件中,这样当我组装我的项目时,它会将excel文件打包到jar文件中,用户不必提供额外的文件当运行jar子。

我的项目结构是这样的:

/MyApp |-src |---main |-----java |-------app |---------Main.java |-----resources |-------Something.xlsx 

这是我的maven pom:

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>groupId</groupId> <artifactId>artifactId</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.15</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.15</version> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.6.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>sample.Main</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> </plugin> </plugins> <resources> <!-- regular resource processsing for everything except logback.xml --> <resource> <directory>src/main/resources</directory> <includes> <include>*.*</include> </includes> </resource> </resources> </build> </project> 

以下是我如何组装我的jar:

 clean compile assembly:single 

这创build了我的jar,但是当我运行jar如java -jar myjar.jar我得到以下错误:

 java.io.FileNotFoundException: file:/Users/me/IdeaProjects/MyApp/target/myjar.jar!/Something.xlsx (No such file or directory) 

显然,excel文件并没有被打包到jar中。 这里是试图打开资源文件的java代码:

 URL file = getClass().getClassLoader().getResource("Something.xlsx"); 

有什么办法实现我想要的? 如果是的话,在这种情况下最好的办法是什么?

我想到了。 我需要使用InputStream而不是URL。 所以现在我的代码如下所示:

 InputStream file = getClass().getResourceAsStream("/Something.xlsx"); 

这工作完美。