使用 jar 外部的配置启动 .jar,但能够从任何当前目录执行此操作

2024-05-05

我一直在努力解决一个特定的问题。我在 .jar 文件中有一个 Java 程序,并且在 .jar 之外有一个 lib 目录和一个 config 目录,但与 jar 本身所在的目录位于同一目录中。

我正在尝试参考config/foo.config从代码中。如果我与 jar 位于同一目录中,则可以将其作为相对文件引用。我还尝试使用 getResourceAsStream 并确保配置位于类路径中。

到目前为止,一切都很好,但我还必须能够从任何目录启动 .jar。

所以,如果我的结构是这样的:

/prog/util/myprog/myprog.jar
/prog/util/myprog/config
/prog/util/myprog/config/foo.config
/prog/util/myprog/lib

(以及 lib 中的一大堆第 3 方 jar)

如何在清单文件中正确设置类路径以便可以引用配置?

我的清单中的类路径如下所示:Class-Path: config/ lib/jar1.jar lib/jar2.jar (etc)

我目前正在使用getResourceAsStream("/foo.config").

如果我位于 /prog/util/myprog 目录并运行:

java -jar myproj.jar

但是,我不能在 /prog 中运行:

java -jar util/myprog/myprog.jar

当我这样做时,找不到配置文件。

我该如何解决这个问题?

编辑:基于评论/建议的一些附加说明,尽管我不确定这是否可行:

1)我们不能使用文件系统的绝对路径,我们不知道程序将存储在哪里,只是config目录将与jar位于同一目录中。

2)我希望能够有一些东西既能在代码被 jar 化时工作,又能在非 jar 化时工作,例如当我在 Eclipse 中以调试模式运行时。此时,config 目录是src, bin, and lib目录。

编辑第 2 部分:好的,在我和一位同事之间,我们提出了以下建议: String configDirectory = new File(QueueMonitor.class.getProtectionDomain().getCodeSource().getLocation().getPath()).getParent() + "/config";

当我们在 Eclipse 中并以调试模式运行时,File 对象指向bin目录,因此获取父目录然后附加“/config”可以满足我们在开发/测试期间的需求。

同样,从 .jar 文件中,File 对象指向 jar 本身,因此获取父级并附加“/config”也可以满足我们的需要。

不过我有点犹豫。我想知道是否存在一些我在该解决方案中没有看到的潜在问题或意外后果。对此有什么想法吗?


您应该能够使用从 jar 中的 Class 找到它的路径? https://stackoverflow.com/a/8508874/823393找到罐子位置的技术。从那里开始,只需爬入/爬出文件夹即可。

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

使用 jar 外部的配置启动 .jar,但能够从任何当前目录执行此操作 的相关文章

随机推荐

  • 将案例类传递给函数参数

    抱歉问了一个简单的问题 我想将案例类传递给函数参数 并且想在函数内部进一步使用它 到目前为止我已经尝试过这个TypeTag and ClassTag但由于某种原因 我无法正确使用它 或者可能是我没有看到正确的位置 用例与此类似 case c
  • 如何使用电子表格中的第一行作为 Dataframe 列名称而不是 0 1 2...等?

    我希望我的数据框将第一行名称显示为数据框列名称 而不是从 0 等编号 我该如何执行此操作 我尝试使用 pandas 和 openpyxl 模块将我的 Excel 电子表格转换为数据框 import pandas as pd from ope
  • Android:如何获取小数点后的两位数?不想截断值

    如何获取小数点后仅两位数的双精度值 例如 如果 a 190253 80846153846 那么结果值应该像 a 190253 80 尝试 我尝试过这个 public static DecimalFormat twoDForm new Dec
  • Mac OS X 上的超时命令?

    Mac OSx 上的超时命令有替代方法吗 基本要求是我能够在指定的时间内运行命令 e g timeout 10 ping google com 该程序在 Linux 上运行 ping 10 秒 您可以使用 brew install core
  • 为什么turn服务器不支持tcp连接?

    我是 WebRTC 新手 我需要为我的 webrtc 应用程序配置我自己的 Turn 服务器 我使用以下命令安装了我的转弯服务器 apt get install coturn 我只需要通过 tcp 运行转变服务器 它不必使用 UDP 进行任
  • 如果 foreach 是一个结构数组,它会复制每个元素吗?

    我有一个结构数组 做foreach运算符在迭代数组时复制每个元素 据我所理解foreach只是底层的语法糖转换为for 所以看来答案是否定的 但我很想得到一些确认 PS 看来应该有人已经问过了 但我无法轻易找到任何东西 因此 请以提供的参考
  • “您的安全设置已阻止本地应用程序运行”Java 8

    我正在尝试在 Chrome 窗口中运行一个小小程序 但收到错误消息 我确实看到所有回复都告诉我将安全性更改为中级 但版本 8 中不存在该选项 到目前为止 几个小时的谷歌搜索和向同学寻求帮助没有带来任何进展 有人可以建议一下吗 Medium在
  • struts2中如何访问url参数

    我正在做一个struts2项目 我在项目中创建了 url 并使用标签传递了参数 我的问题是如何读取操作中的参数 另外 如果执行相同的操作 我将能够将参数视为查询字符串 我问是因为我无法做到 而且我在其中一个教程中看到了它 通常 您将通过使用
  • C 警告函数调用中缺少标记

    这是我的警告 Missing sentinel in function call 我怎样才能删除它 我正在使用 linux 和 gcc 编译器 看来您可能没有终止数组声明NULL 如果没有 null 您可能会遇到一些内存怪异 因为运行时将不
  • 捕获 System.Exception 总是不好的做法吗?

    请考虑下面的代码 它抛出三个不同的异常 即 System Configuration ConfigurationErrorsException System FormatException and System OverflowExcept
  • C/C++ 中的最小二乘回归

    如何在 C C 中实现因子分析的最小二乘回归 the黄金标准是LAPACK http www netlib org lapack lug node27 html 你特别想要xGELS
  • 如何注销多个非当前用户的会员用户?

    我正在使用属于 MVC2 默认项目一部分的 MembershipProvider 我希望能够获取用户名列表 注销用户 并在需要时销毁他们的会话 我能想到的最接近的是 foreach string userName in UserNames
  • 如何对表的选定列进行 mysql 转储

    我有一个要求 我必须仅对表的一列进行 mysql 转储 由于该表有太多列 我不想转储整个表 我必须将表的转储从一台服务器转移到另一台服务器 知道我该怎么做吗 如果您想获取包含架构的 mysql 转储 可以按照以下步骤完成 创建临时表 cre
  • PHP Money_format(); £ 符号不是 GBP

    我不知道如何获取货币符号 目前我正在使用 setlocale LC MONETARY en GB money format i 1000 这给了我输出 GBP1 000 但我想要 1 000 我已经查看了 PHP 手册 但没有多大帮助 有任
  • Pinterest 喜欢自定义 GridView

    我是 Android 新手 我正在寻找网格视图的逻辑 例如为 iPhone 构建的 pinterest homescreen 应用程序 一个大号 图像来自服务器 我需要以以下形式显示并具有分页效果 即在滚动上加载图像 如果可以的话请回复 我
  • 是否有将二进制数据打包成 UTF-16 字符串的标准技术?

    在 NET中 我有任意二进制数据存储在byte 例如图像 现在 我需要将该数据存储在string 旧 API 的 注释 字段 有没有标准技术packing将此二进制数据转换为string 我所说的 打包 是指对于任何相当大且随机的数据集 字
  • 给定列名称和替换的字符向量重命名多个列[重复]

    这个问题在这里已经有答案了 虽然这很容易用基本 R 或setnames in data table or rename in dplyr0 5 自从rename 已被弃用 我找不到一种简单的方法来做到这一点dplyr 0 6 0 下面是一个
  • Postgres 在转换时函数错误/失败时返回空值

    我正在尝试转换text价值观timestamp价值观 对于下表称为a id c1 1 03 03 2000 2 01 01 2000 3 12 4 1990 4 12 Sept 2011 5 12 1 1999 12 33 12 6 24
  • 如何在显示项目之前为 RecyclerView 高度设置动画

    我怎样才能 或者我应该说什么时候可以在显示项目之前对 recyclerView 高度进行动画处理 我可以在 onMeasure 中获得最终高度 但项目总是出现太快并且动画不起作用 关于如何让这个动画发挥作用有什么想法吗 None
  • 使用 jar 外部的配置启动 .jar,但能够从任何当前目录执行此操作

    我一直在努力解决一个特定的问题 我在 jar 文件中有一个 Java 程序 并且在 jar 之外有一个 lib 目录和一个 config 目录 但与 jar 本身所在的目录位于同一目录中 我正在尝试参考config foo config从代