导出带有资源的 jar

2023-12-07

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

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

我做了一些实验,但没能找到让它发挥作用的方法。我尝试使用资源的源文件夹并使用:

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

or

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

参考:

  • 与位置无关的资源访问
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

导出带有资源的 jar 的相关文章

随机推荐

  • 如何在 React Native 中将一个组件的状态传递给另一个组件?

    我正在研究 React Native 我首先运行有两个文件geolocation函数获取坐标并将其分配给状态 现在我想在我的第二个文件中访问这个状态 我尝试使用props但当我控制台日志时它显示未定义 请帮助我是新手 export defa
  • TextBaseline 的字母和表意枚举在 Flutter 中不起作用

    我想我明白这些枚举是如何基于此工作的post 当我使用以下代码尝试它时 它似乎不起作用 Row mainAxisAlignment MainAxisAlignment center crossAxisAlignment CrossAxisA
  • 使用 Python 合并 Excel 工作表中的特定单元格

    我一直在尝试通过循环将符合特定条件的单元格与其旁边的单元格合并 但我不太确定如何进行 例如 从第 7 行开始 如果单元格中包含 Sample 一词 我希望它与旁边列中的单元格合并 并且我想继续这样做 直到到达该行的末尾 我目前正在为此使用
  • 当前由 Service Worker 'fetch' 事件提供服务的页面的 URL

    如何获取 Service Worker 的 fetch 事件所服务的页面的完整 URL self location 属性似乎仅指网站的根 URL 例如 如果页面https example com folder pagename html正在
  • 如何找到 Log4j 的深层用法

    我想找到当前版本 2 15 0 之前log4j的所有用法 我尝试使用maven的 mvn dependency tree 使用了几个工具 依赖性检查 grype 对我不起作用 syft 对我不起作用 log4j detector 但它们只列
  • OpenCV中如何计算凸性缺陷?

    OpenCV函数使用的算法是什么convexityDefects 计算轮廓的凸度缺陷 请描述并说明该算法的高级操作及其输入和输出 基于文档 输入是两个坐标列表 contour定义原始轮廓 下图中的红色 convexhull定义与该轮廓相对应
  • 将 Android 搜索栏与拇指对齐

    我试图将搜索栏与视图顶部对齐 但无法用拇指将其居中 是否有某种带有RelativeLayout 子项的 alignCenter 这是我的 xml 代码示例
  • 由于 SunCertPathBuilderException:找不到证书,无法在 Eclipse 中连接到 GitHub

    我已经使用 Eclipse EE Luna 设置了我的 mac 一切似乎都工作正常 来自 Windows 我安装了 EGit 和 Github Mylin 插件 但是 我似乎无法在 Eclipse 中克隆 github 项目 当通过 EGi
  • 在Java Maven项目中通过Spark查询Cassandra中的数据

    我正在尝试编写一个简单的代码 在其中创建一个架构 插入一些表 然后提取一些信息并将其打印出来 但是 我收到错误 我正在使用 Datastax cassandra Spark 连接器 我一直在使用这两个例子来帮助我尝试实现这一目标 https
  • 根据变量范围过滤数据透视表

    我的目标是使用另一张工作表中的范围来过滤数据透视表 该范围从第三张表中提取数据 这是启动大量公式并在每次使用时发生变化的数据转储 我有下面的代码 但我可以看到它所做的是运行每个数据透视表字段 将其与范围进行比较 然后删除过滤器 我有 32
  • 如何使用固定点旋转 UIIMageVIew?

    我想按角度旋转图像 但是我想用固定点旋转图像 如何设置这个固定点 设置视图图层的锚点 该锚点位于视图局部坐标中 范围为 0 到 1 即左上角为 0 0 右下角为 1 1 例如 默认是绕中心旋转 imageView layer anchorP
  • 错误:运行 docker 容器时无法访问 jarfile

    尝试运行 docker 容器时出现以下错误 Error Unable to access jarfile 我的 Dockerfile 是这样的 FROM ubuntu 16 04 Install Updates RUN apt get up
  • 如何缓存 IQueryable 对象?

    我有这个方法 它返回 UserStatus 表中所有行的 Linq to SQL 查询 public IQueryable
  • 确定 ABAP 中的活动格式设置

    As the 格式化设置的ABAP文档解释 格式设置设置如下 在内部会议开始时 他们是由相关默认设置决定当前用户的用户主记录中的固定值 使用语句 SET COUNTRY 这是当前内部会话的默认设置可以使用特定于国家 地区的格式进行覆盖 但作
  • R - 当我绘制 xts 和 Zoo 对象时如何更改日期格式?

    我想知道如何更改日期格式 我正在处理的代码如下 library quantmod getSymbols AAPL price AAPL lt AAPL 6 plot price AAPL main The price of AAPL 这个结
  • 接收者未注册

    我有一个带有异步任务的程序和一个广播接收器来发送结果代码 以便 Asynctask 知道应用程序正在工作 但它崩溃了 说接收者在主要活动中未注册 我在主活动中注册了一个接收器 另一个接收器在 AsyncTask 活动中注册 所以这里是代码和
  • 从链接 Google Map API 中提取坐标

    有没有办法使用这种类型的谷歌地图链接检索纬度和经度 https goo gl maps 7jNqZtPa5Cjf333k7 在这个网址中7jNqZtPa5Cjf333k7不是指地点ID吗 我真的很难使用这种类型的链接来提取纬度和经度 如果有
  • 自 2022 年 10 月 VS-Code 更新(版本 1.73)起安装的新 isort 扩展出现问题

    我在 Windows 10 Pro Build 10 0 19045 上使用 VS Code 版本 1 73 1 带有 MS Python 扩展 v2022 18 2 安装 VS Code 2022 年 10 月更新后 在编写 Python
  • 将多行字符串中的指定列转换为单个逗号分隔行

    假设我有以下字符串 something1 12 0 some unnecessary trailing data this must go something2 15 5 some more unnecessary trailing dat
  • 导出带有资源的 jar

    我正在尝试通过构建许多小型模块化项目来构建大型 Java 项目 我希望每个小项目都是完全独立的 拥有其所有资源 例如图像 我正在使用 Eclipse 如果我配置构建路径来添加模块化项目之一 资源引用将不起作用 该系统找不到指定的文件 如果我