代码之家  ›  专栏  ›  技术社区  ›  Steve McLeod

类加载器加载错误的文件

  •  3
  • Steve McLeod  · 技术社区  · 15 年前

    我使用此代码片段获取作为输入流的文件。文件version.txt打包在我的应用程序的jar中,位于最上面的文件夹中。

    InputStream resource = getClass().getClassLoader().getResourceAsStream("version.txt");
    

    这种方法几乎一直有效。但对于一个用户来说,它会选择另一个version.txt,这不在我的jar中。我如何才能确保这会加载我的jar中的特定version.txt文件?

    3 回复  |  直到 15 年前
        1
  •  9
  •   SteveD    15 年前

    当你说“最上面的文件夹”时,你是指默认的包?如果是这样的话,就必须确保jar在类路径上比贡献另一个jar的任何东西都更早 version.txt 当Java沿着类路径搜索文件时,直到找到第一个匹配为止。

    既然很难保证你的罐子永远是第一个,你真的应该把 版本控制程序 非默认包中的文件,例如:

    com.yourcompany.yourproject.version
    

    然后你需要修改代码来定位它:

    Stream resource = getClass().getClassLoader().getResourceAsStream("com/yourcompany/yourproject/version/version.txt");
    

    使用默认包是一种反模式。

        2
  •  3
  •   skaffman    15 年前

    这是把东西放在顶层包中的固有危险,你可以捡起你并不真正想要的东西。这可能是一个好处(例如,使用log4j配置),但这通常不是您想要的。

    我强烈建议你 version.txt 在应用程序的包结构中,例如在com.myapp(或任何包名)中,然后使用

    getClass().getClassLoader().getResourceAsStream("com/myapp/version.txt");
    
        3
  •  0
  •   Omry Yadan    15 年前

    代码段将使用加载该类的类加载器来查找version.txt文件。 如果文件存在于类加载器使用的类路径中的多个位置,则可能返回错误的文件(取决于类路径顺序)。