【问题标题】:Load resource from class's own JAR file从类自己的 JAR 文件中加载资源
【发布时间】:2012-05-08 13:28:13
【问题描述】:

当使用Class.getResource() 并提供一个相当常见的资源名称(如"license.html")时,Java 可能会从前面在 CLASSPATH 中列出的另一个 JAR 文件中加载"license.html" 资源,但可能与我的应用程序完全无关。有没有办法强制 ClassLoader首先尝试从我的类所在的同一个 JAR 文件中加载资源,只有在没有找到的情况下,才查看 CLASSPATH 上的其他 JAR?

【问题讨论】:

  • '通用资源名称,例如"license.html"' 给它一个不常见路径的好理由,例如"com/our/app/license.html"
  • 您的资源应该以一种明确的方式命名 - 这意味着如果在另一个 ClassLoader 中存在匹配项,则应予以考虑。然后你会 getResources() 列出所有此类匹配项。
  • +1 给安德鲁;将其视为与包命名相同的方式。
  • 如果您需要将文件保留在默认包中,您可以尝试询问该 jar 文件中的类的类加载器。
  • @Juan 是的,我有这门课。无论如何,MyClass.class.getResource() 可能会加载错误的资源。

标签: java resources classpath


【解决方案1】:

如果您知道文件所在的确切 jar,您也可以使用 JarURLConnection

jar:<url>!/{entry}

【讨论】:

  • 我想我应该能够找出当有类文件?
  • @mstrap 如果您知道 license.html 文件所在的确切 jar 文件,这应该可以工作,否则,回到第一格。
  • URL urlToClass = obj.getClass().getProtectionDomain().getCodeSource().getLocation(); 注意:需要信任/无安全管理器,对于小程序和 JWS,即使缓存也会指向服务器。
  • ..但请注意对该评论的编辑。 ;) 我仍然觉得你应该选择“根据包名的特定路径”。
【解决方案2】:

..通用资源名称,如“license.html”'

一个很好的理由给它一个不常见的路径,例如根据package名称。
例如。 "/com/our/app/license.html" 不太可能与任何其他 license.html 发生冲突

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 2012-03-10
    • 2015-11-16
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    相关资源
    最近更新 更多