gpt4 book ai didi

java - 使用资源导出 jar

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:12:22 24 4
gpt4 key购买 nike

我正在尝试通过构建许多小型模块化项目来构建大型 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 文件夹处于同一级别,它将包含我的所有资源,与源代码分开。这就是在尝试链接项目/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;
}
}

我的包结构是这样的:

My package structure for above code

引用资料:

关于java - 使用资源导出 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12029412/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com