【问题标题】:Myclass.class.getProtectionDomain().getCodeSource() return empty pathMyclass.class.getProtectionDomain().getCodeSource() 返回空路径
【发布时间】:2015-08-17 12:16:39
【问题描述】:

我正在尝试使用以下方法查找正在运行的jar文件的位置:

File jarFile = new File(JarPath.class.getProtectionDomain().getCodeSource().getLocation().toURI());

当我在 IDE (eclipse) 上运行它时,它会返回正确的路径。 但是当我将 jar 作为可执行文件运行时,返回的代码源是

rsrc:./

关于如何获得正确路径的想法?

【问题讨论】:

  • 我有同样的问题,到目前为止我发现当你在Eclipse中生成jar时使用“将所需的库打包到生成的JAR”选项时会发生这种情况。
  • NetBeans 中没有 repo

标签: java eclipse path jvm executable-jar


【解决方案1】:

尝试不同的方法来获取位置。

String jarFilePath = ClassLoader.getSystemClassLoader().getResource(".")
        .toURI()
        .getPath()
        .replaceFirst("/", "");

这使您可以访问 jar 文件的父位置。

C:/Users/Roshana Pitigala/Desktop/

您仍然需要添加文件名和扩展名 (jarFileName.jar)。

【讨论】:

  • 在查找类的资源时不要使用类加载器。一旦涉及模块,这可能会中断,因为缺少该信息。您可以使用JarPath.class.getResource("JarPath.class"),它比JarPath.class.getClassLoader().getResource(JarPath.class.getName().replace('.', '/') + ".class") 更简单,并且可以在模块化环境中工作,因为仍然拥有Class 意味着知道相关的模块。
  • 这不起作用。 getPath() 抛出 NullPointerExceptiontoURI() 给出完全限定的类名,而不是 jar 的路径!
  • @user7291698 立即尝试。我已经按照 Holger 的建议更新了答案。顺便说一句,直到 getPath() 它应该返回类的路径而不是 jar。这个想法是获取类的路径并删除不必要的部分。
  • 只有当您使用 Eclipse 选项“将所需库提取到生成的 JAR”中创建 jar 时,您的解决方案才有效。但我需要一个与“将所需库打包到生成的 JAR”选项一起使用的解决方案!
  • @user7291698 现在检查答案。它已经过测试并且可以正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2014-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多