Java 为什么我的罐子没有';除非我解压缩文件,否则无法运行?
每次我运行导出的Java 为什么我的罐子没有';除非我解压缩文件,否则无法运行?,java,image,swing,jar,export,Java,Image,Swing,Jar,Export,每次我运行导出的.jar文件时,该文件包含一个JFrame,图标为图像,除非我提取该文件,否则该文件不会运行。在编译器中,它正在运行。我不想让启动器同时保存资源包和jar文件在一个目录中 “为什么我的Jar不运行,除非我提取文件?” 这似乎是对您的资源使用文件的行为。例如 File file = new File("resources/image.png"); Image image = ImagIO.read(file); 并且您可以创建项目结构(注意,resources实际上应该在src中
.jar
文件时,该文件包含一个JFrame
,图标为图像,除非我提取该文件,否则该文件不会运行。在编译器中,它正在运行。我不想让启动器同时保存资源包和jar文件在一个目录中
“为什么我的Jar不运行,除非我提取文件?”
这似乎是对您的资源使用文件
的行为。例如
File file = new File("resources/image.png");
Image image = ImagIO.read(file);
并且您可以创建项目结构(注意,resources
实际上应该在src
中,这样它就会自动构建到jar中,除非您以不同的方式配置它。但是为了这个参数,假设您在构建到jar中的resources
的位置配置它)
一些检查:
- 从IDE运行-工作!为什么?使用
查找文件系统中的文件。使用相对路径,搜索将从“工作目录”开始,对于IDE,它通常位于项目根目录中。因此,File
是相对于“resources/image.png”
ProjectRoot
- 构建jar,假设它最终位于项目中的
dir中。这就是它看起来的样子dist
现在为了这个参数(实际上是正确的方法),让我们尝试打印资源输入输出程序的URL,这样当您运行jar时,它会打印出文件的URLProjectRoot dist ProjectRoot.jar
当我们运行jarURL url = Test.class.getResource("/resources/image.png"); System.out.println(url.toString());
时,我们将看到打印出来的C:\ProjectRoot\dist>java-jarprojectroot.jar
。很明显,即使当前工作目录是jar的位置,但是路径不再匹配,添加了jarC:\ProjectRoot\dist\ProjectRoot.jar\参考资料\image.png
ProjectRoot.jar代码>位置
- 那么,当我们提取它时,它为什么会起作用呢。当你提取它时,路径是正确的
从C:\ProjectRoot dist resources/image.png // from extracted jar ProjectRoot.jar
运行时,C:\ProjectRoot\dist>
目录是应该在的位置资源
URL url = getClass().getResource("/resources/image.png");
请注意/
。这将把我们带到类路径的根目录,resources
dir将在这里URL
可以传递给许多构造函数,比如ImageIcon(URL)
或`ImageI.read(URL)InputStream is = getClass().getResourceAsStream("/resources/image.png");
将在引擎盖下使用URL。您还可以对许多构造函数使用InputStream
/
URL url = getClass().getClassLoader().getResource("resources/image.png");
文件
从来都不是一个好主意。动态获取路径是可能的,因此您可以使用文件
,但您仍然需要使用上述技术之一,除非您确实需要文件
,否则这将是毫无意义的,因为您可以使用输入流
或URL
长话短说 这会管用的
ProjectRoot
src\resources\image.png
URL url = getClass().getResource("/resources/image.png");
Image image = ImageIO.read(url);
“为什么我的Jar不运行,除非我提取文件?”
这似乎是对您的资源使用文件
的行为。例如
File file = new File("resources/image.png");
Image image = ImagIO.read(file);
并且您可以创建项目结构(注意,resources
实际上应该在src
中,这样它就会自动构建到jar中,除非您以不同的方式配置它。但是为了这个参数,假设您在构建到jar中的resources
的位置配置它)
一些检查:
- 从IDE运行-工作!为什么?使用
查找文件系统中的文件。使用相对路径,搜索将从“工作目录”开始,对于IDE,它通常位于项目根目录中。因此,File
是相对于“resources/image.png”
ProjectRoot
- 构建jar,假设它最终位于项目中的
dir中。这就是它看起来的样子dist
现在为了这个参数(实际上是正确的方法),让我们尝试打印资源输入输出程序的URL,这样当您运行jar时,它会打印出文件的URLProjectRoot dist ProjectRoot.jar
当我们运行jarURL url = Test.class.getResource("/resources/image.png"); System.out.println(url.toString());
时,我们将看到打印出来的C:\ProjectRoot\dist>java-jarprojectroot.jar
。很明显,即使当前工作目录是jar的位置,但是路径不再匹配,添加了jarC:\ProjectRoot\dist\ProjectRoot.jar\参考资料\image.png
ProjectRoot.jar代码>位置
- 那么,当我们提取它时,它为什么会起作用呢。当你提取它时,路径是正确的
从C:\ProjectRoot dist resources/image.png // from extracted jar ProjectRoot.jar
运行时,C:\ProjectRoot\dist>
目录是应该在的位置资源
URL url = getClass().getResource("/resources/image.png");
请注意/
。这将把我们带到类路径的根目录,resources
dir将在这里URL
可以传递给许多构造函数,比如ImageIcon(URL)
或`ImageI.read(URL)InputStream is = getClass().getResourceAsStream("/resources/image.png");
将在引擎盖下使用URL。您还可以对许多构造函数使用InputStream