【问题标题】:Load resources in Java from absolute path within jar从jar中的绝对路径加载Java中的资源
【发布时间】:2017-07-04 03:26:29
【问题描述】:

暂时不要标记为重复!

听我说;我见过的所有解决方案都很好,但我不明白加载资源时类路径是如何工作的:

ClassLoader classLoader = getClass().getClassLoader()

我想设置一个资源加载器(命名为ResourceLoader),它可以从 jar 包内的任何地方加载。

所以如果加载器放在com.spikespaz.engine.loader.ResourceLoader,我不想卡在com.spikespaz.engine.loader的相对路径中。

我希望能够从com.spikespaz.game.resources.texturescom.spikespaz.game.resources.models 加载,而无需将阅读器放在父目录中。

我发现是这样的:https://stackoverflow.com/a/3862115/2512078

但据我了解,他回答中的所有这些选项必须与加载它们的类相关。 (getClass()) 有没有办法解决这个问题,还是我误解了?

如果我理解错了,谁能解释得更好?

任何解决方案都必须相对于开发环境的 jar 包或源的确切根,并且我必须不需要在该根中放置任何东西。

谢谢。

【问题讨论】:

    标签: java resources package classloader


    【解决方案1】:

    我认为你误解或误读了他的回答https://stackoverflow.com/a/3862115/2512078

    普通类加载器和上下文类加载器都能够以绝对路径加载资源。

    要使用普通类加载器执行此操作,请确保资源路径前面有一个前导 /,否则它会加载相对于加载它的类的包的资源。

    this.getClass().getResource("/foo/bar.txt")` 
    

    上下文类加载器从不加载相对于类的资源,路径总是被解释为绝对路径。

    Thread.currentThread().getContextClassLoader().getResource("foo/bar.txt")
    

    注意:不要在上下文类加载器中使用前导斜杠。

    【讨论】:

    • 如果您想知道为什么我没有接受答案,它看起来不错。我会的,一旦我有机会测试它。我目前正在重写我的其余代码,所以可能会有点。
    • 为什么你说不要在上下文类加载器中使用前导斜杠?
    • 实际上我发现至少一些非上下文类类加载器根本无法使用前导斜杠,所以看起来stackoverflow.com/q/32215693 是正确的。
    猜你喜欢
    • 1970-01-01
    • 2020-09-02
    • 2010-10-26
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 2010-12-26
    • 2014-02-09
    • 2016-09-26
    相关资源
    最近更新 更多