3

我正在尝试通过构建许多小型模块化项目来构建一个大型 Java 项目。我希望每个小项目都是完全独立的,拥有它的所有资源(例如图像)。

我正在使用 Eclipse。如果我配置构建路径以添加模块化项目之一,则资源引用不起作用。该系统找不到指定的文件。如果我导出一个 jar 并将其包含在配置构建路径的库选项卡中,也会发生同样的事情。

我做了一些实验,但还没有找到让它工作的方法。我尝试使用源文件夹获取资源并使用:

// this works if resource is located in package alongside class file, 
// not where I want it
getClass().getResourceAsStream("resource.abc")

或者

new FileInputStream("path/to/resource.abc")

也许我错过了有关项目结构的一些信息。我总是能够毫无问题地从 IDE 中的单个项目中获取资源来工作。当您开始链接多个项目或将它们包含为 jar 时,有什么不同?

我的理想结构是在我的项目根目录中拥有另一个与 src 文件夹处于同一级别的文件夹,该文件夹将包含我的所有资源,与源代码分开。这就是在尝试链接项目/罐子的所有麻烦之前的设置方式。

4

3 回答 3

1

这个解决方案对我有用:

/**
 *
 * @author David
 */
public class JavaApplication60 {
/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    //http://img.viralpatel.net/java-cup-logo.png

    //located in a package not in the current one
    URL url = new JavaApplication60().getResource("/javaapplication60/newpackage/java-cup-logo.png");
    System.out.println(url.getPath());
    //located in same package
    url = new JavaApplication60().getResource("/javaapplication60/java-cup-logo.png");
    System.out.println(url.getPath());
}

public InputStream getResourceAsStream(String name) {
    name = resolveName(name, this.getClass());
    ClassLoader cl = getClass().getClassLoader();
    if (cl == null) {
        return ClassLoader.getSystemResourceAsStream(name); // A system class.
    }
    return cl.getResourceAsStream(name);
}

public java.net.URL getResource(String name) {
    name = resolveName(name, this.getClass());
    ClassLoader cl = getClass().getClassLoader();
    if (cl == null) {
        return ClassLoader.getSystemResource(name);  // A system class.
    }
    return cl.getResource(name);
}


/*
 * The resolveName method adds a package name prefix if the name is not
 * absolute, and removes any leading "/" if the name is absolute. It is
 * possible, though uncommon, to have classes in diffent packages sharing
 * the same resource.
 */
private String resolveName(String name, Object clazz) {
    if (name == null) {
        return name;
    }
    if (!name.startsWith("/")) {
        Class c = clazz.getClass();
        while (c.isArray()) {
            c = c.getComponentType();
        }
        String baseName = c.getName();
        int index = baseName.lastIndexOf('.');
        if (index != -1) {
            name = baseName.substring(0, index).replace('.', '/') + "/" + name;
        }
    } else {
        name = name.substring(1);
    }
    return name;
}
}

我的包结构如下所示:

我上面代码的包结构

参考:

于 2012-08-19T20:03:45.453 回答
0

要为您的资源添加另一个源文件夹,请首先创建该文件夹。在 java 透视图中,选择项目并从上下文菜单中选择“配置构建路径”。在源文件夹选项卡中,您可以使新创建的文件夹成为项目的源文件夹。从那时起,该文件夹下的所有资源都可以导出到带有项目类的 jar 中。

顺便说一句,如果资源与类在同一个包中,您为 getResourceAsStream 指定的路径要么只是资源文件名,要么是源文件夹中资源的相对路径名(以斜杠开头)使用。

于 2012-08-19T20:00:05.873 回答
0

您有多个项目包含一个应用程序?因此,如果您通过 Eclipse 运行它,一切正常吗?
如果是,那么就在你的主项目中做Export as Runnable Jar. 这也应该有效

于 2012-08-19T21:28:18.307 回答