在 JAR 资源中上一级
Up one level in JAR resource
我有以下包层次结构:
base--images--img.png
|
--code--Foo.java
|
--Base.java
也就是说,我有一个包 base
,它有 2 个子包,base.images
和 base.code
,每个子包都有各自的文件。 Base.java
只是调用了 Foo
中的一个方法。
当我构建时,所有这些都被捆绑到 base.jar
中。
问题:Foo.java
如何加载 img.png
而不管 jar 位于何处或 运行 来自哪里?
我尝试过的一些事情:
new File("../images/img.png")
Foo.class.getResource("../images/img.png")
这些都不起作用,因为 "../images/img.png"
附加到 JAR 运行 来自的路径,而不是 class.
的路径
MWE:
在Foo.java中:
package base.code;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
public class Foo {
public static void main(String[] args) {
URL url = Foo.class.getResource("/graphs/1.png");
try {
BufferedImage img = ImageIO.read(url);
} catch (IOException e) {
System.err.println("Image not found!");
}
}
}
在Base.java中:
package base;
public class Base {
public static void main(String[] args)
Foo.main(args);
}
}
资源在 class 路径上,切勿使用文件。它们可能存储在 jar 中(zip 格式)。
解决办法就是使用绝对路径。这比 class 包的相对路径更清晰。
Foo.class.getResource("/base/images/img.png")
我有以下包层次结构:
base--images--img.png
|
--code--Foo.java
|
--Base.java
也就是说,我有一个包 base
,它有 2 个子包,base.images
和 base.code
,每个子包都有各自的文件。 Base.java
只是调用了 Foo
中的一个方法。
当我构建时,所有这些都被捆绑到 base.jar
中。
问题:Foo.java
如何加载 img.png
而不管 jar 位于何处或 运行 来自哪里?
我尝试过的一些事情:
new File("../images/img.png")
Foo.class.getResource("../images/img.png")
这些都不起作用,因为 "../images/img.png"
附加到 JAR 运行 来自的路径,而不是 class.
MWE:
在Foo.java中:
package base.code;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
public class Foo {
public static void main(String[] args) {
URL url = Foo.class.getResource("/graphs/1.png");
try {
BufferedImage img = ImageIO.read(url);
} catch (IOException e) {
System.err.println("Image not found!");
}
}
}
在Base.java中:
package base;
public class Base {
public static void main(String[] args)
Foo.main(args);
}
}
资源在 class 路径上,切勿使用文件。它们可能存储在 jar 中(zip 格式)。
解决办法就是使用绝对路径。这比 class 包的相对路径更清晰。
Foo.class.getResource("/base/images/img.png")