我有一个可执行的JAR,其中有一个文件,我想从代码(不是InputStream或其他任何东西)中打开java.io.File实例…只是文件)。
这是一个maven项目,文件位于"src/main/resources/file.xxx"的根目录下。打包后,该文件位于jar的根目录(已确认在那里)。
我的第一次尝试:FileNotFoundException
java.io.File myFile = new java.io.File("file.xxx");
someMethodThatUsesTheFile(myFile); //I really need it to be a file!!!
其他尝试:FileNotFoundException
java.io.File myFile = new java.io.File("/file.xxx");
java.io.File myFile = new java.io.File("classpath:file.xxx");
java.io.File myFile = new java.io.File("classpath:/file.xxx");
我不确定到底发生了什么。Web应用程序可以很容易地从Web应用程序根目录加载所有内容,我很困惑为什么JAR应用程序的行为不同。
额外的信息:
- 使用Java8作为运行时/build
- 命令运行JAR: "java -jar myjar.jar" 应用程序代码和文件都位于同一个jar
简短的回答:它不是一个"文件",所以你不能这样做。
JAR文件是一个文件,但不是它的内容。
可选:
-
尝试该方法的其他重载版本,InputStreams是通常在你的选项中,你可以使用下面的代码来加载它:
InputStream is = getClass().getResourceAsStream("file.xxx");
-
将该文件移出JAR并放入与JAR相同的目录中(考虑安全风险)
试试这个可能对你有帮助:
URL url = this.getClass().getResource("src/main/resources/file.xxx");
File file= new File(url.toURI());