我正在尝试通过构建许多小型的模块化项目来构建一个大型Java项目。我希望每个小项目是完全自包含的,拥有它的所有资源(如图像)。
我正在使用Eclipse。如果我将构建路径配置为添加一个模块化项目,则资源引用不起作用。系统找不到指定的文件。如果我导出一个jar并将其包含在configure build path的libraries选项卡中,也会发生同样的事情。
我已经做了一些实验,但还没能想出一种让它工作的方法。我尝试使用资源的源文件夹,并使用:
// 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中的单个项目中获取资源。当您开始链接多个项目或将它们作为jars包含时,有什么不同?
我的理想结构应该是有另一个文件夹,与项目根目录中的src文件夹处于同一级别,它将包含我所有的资源,独立于源代码。这就是在尝试链接项目/jars之前,它是如何设置的。
发布于 2012-08-20 04:03:45
这个解决方案对我很有效:
/**
*
* @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-20 04:00:06
要为您的资源添加另一个源文件夹,请首先创建该文件夹。在java透视图中,选择项目并从上下文菜单中选择"configure build path“。在源文件夹选项卡中,您可以将新创建的文件夹设置为项目的源文件夹。从那时起,该文件夹下的所有资源都可以与项目类一起导出到jar中。
顺便说一下,如果资源与类在同一个包中,则为getResourceAsStream指定的路径可以是资源文件名,也可以是正在使用的源文件夹中资源的相对路径名(以斜杠开头)。
发布于 2012-08-20 05:28:18
您有多个项目组成了一个应用程序吗?那么,如果您通过Eclipse运行此程序,一切都会正常工作吗?
如果是,那么就在你的主项目中执行Export as Runnable Jar。这应该也行得通
https://stackoverflow.com/questions/12029412
复制相似问题