用资源导出jar子

我正在尝试通过构建许多小型模块化项目来构建一个大型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中的单个项目中获得资源,而不会遇到任何麻烦。 当您开始链接多个项目或将它们包含为jar时,有什么不同?

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

这个解决方案对我有用:

 /** * * @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; } } 

我的包结构看起来像这样:

我上面代码的包结构

参考文献:

  • 独立于位置的资源访问

要为资源添加其他源文件夹,请首先创建该文件夹。 在java透视图中,选择项目,然后从上下文菜单中选择“configure build path”。 在源文件夹选项卡中,您可以将新创建​​的文件夹设置为项目的源文件夹。 从那时起,该文件夹下的所有资源都可以导出到具有项目类的jar。

顺便说一下,如果资源与类位于同一个包中,则为getResourceAsStream指定的路径或者只是资源文件名,或者是源文件夹中的资源的相对路径名(以斜杠开头)使用。

您有多个项目包含一个应用程序? 那么如果你通过Eclipse运行这一切都有效吗?
如果是,那么只需在您的主项目中执行Export as Runnable Jar 。 这也应该有效