【问题标题】:How to include the project name when passing the path to getResourceAsStream()?将路径传递给 getResourceAsStream() 时如何包含项目名称?
【发布时间】:2017-07-27 00:54:01
【问题描述】:

如何在路径中指定项目以使用 getResourceAsStream() 访问正确的 .properties 文件?问题是子项目 A 和 B 中的文件夹和文件名相同(因此仅将文件夹/文件指定为路径是行不通的。
有没有类似的解决方案 .getResourceAsStream("/Subproject_B/someFolder/someResourceBundle.properties")?我是否需要实现自己的类加载器并只设置我想在其类路径上搜索的项目/文件夹?在加载 .getResourceAsStream("/someFolder/someResourceBundle.properties") 之类的文件时,这会导致唯一的地址吗?

我们的 Maven 项目如下所示:

SubProject_A
          |-src
            |-main
              |-resources
                |-someFolder                     //folder name is the same as in Subproject_B
                  |-someResourceBundle.properties

SubProject_B
      |-src
        |-main
          |-resources
            |-someFolder                   //folder name is the same as in Subproject_A
              |-someResourceBundle.properties

【问题讨论】:

  • getResource 系列方法在类路径中工作,而不是文件系统。所以不要考虑文件夹和文件,要考虑包和资源。类路径应该在类路径中有src/main/resources,因此getResource...() 调用访问someResourceBundle.properties 的参数将是/someFolder/someResourceBundle.properties
  • 这显示了一个问题,因为如果您将它们命名相同,则意味着属于同一模块或您的分离是错误的......

标签: java maven jar resources


【解决方案1】:

可以认为这两个资源属于两个 jar。 Class.getResource 特定于类:

ClassInJarA.class.getResourceAsStream("/...")

系统ClassLoader 使用指定的完整类路径,使用不带前导斜杠的路径。停在第一场比赛。

(还要注意使用.getClass().getResource 是危险的,因为继承。)

我会使用更具体的 Class.getResourceAsStream。

【讨论】:

  • “比什么更具体”,以什么方式?
  • @LewBloch 不在整个类路径上,而是在类的 jar 上。 ClassLoader 通常会使用类路径并在第一次匹配时停止。
  • Class#getResource... "委托给这个对象的类加载器",所以方法是一样的,是吗?
  • @LewBloch:对。通常有几个类加载器,然后搜索顺序变得有点模糊(对我来说),我会尝试一下。这个类的类加载器应该从它的 jar 开始。
【解决方案2】:

将每个项目的资源放在一个包中,根据需要区分资源。例如,/com/example/project_a/somePackage/someResourceBundle.properties/com/example/project_b/somePackage/someResourceBundle.properties。如果您以 Java 方式做事并通过使用包进行隔离,则无需自定义类加载器。

使用复杂的组合来解决故意偏离正常做事方式的做法通常是个坏主意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多