Java 在JAR资源中升级一级

Java 在JAR资源中升级一级,java,jar,path,classpath,Java,Jar,Path,Classpath,我有以下包层次结构: base--images--img.png | --code--Foo.java | --Base.java 也就是说,我有一个包base,它有2个子包base.images和base.code,每个包中都有各自的文件。java只是在Foo中调用一个方法 当我构建时,所有这些都被捆绑到base.jar中 问题是:无论jar位于何处或从何处运行,Foo.java如何加载img.png 我尝试过的一些事情: new File("../image

我有以下包层次结构:

base--images--img.png
    |
    --code--Foo.java
    |
    --Base.java
也就是说,我有一个包base,它有2个子包base.images和base.code,每个包中都有各自的文件。java只是在Foo中调用一个方法

当我构建时,所有这些都被捆绑到base.jar中

问题是:无论jar位于何处或从何处运行,Foo.java如何加载img.png

我尝试过的一些事情:

new File("../images/img.png")
Foo.class.getResource("../images/img.png")
因为../images/img.png被附加到运行JAR的路径,而不是类的路径,所以这两种方法都不起作用

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);
    }
}

资源位于类路径上,切勿使用文件。它们可能以jar-zip格式存储

解决方案就是使用绝对路径。这比类包的相对路径更清楚

Foo.class.getResource("/base/images/img.png")

谢谢,我没有意识到以/开头是从JAR开始的绝对路径。