假設你正在開發一個圖書館和圖書館罐被放置到Web容器中的類路徑。
現在讓我們假設一個Web應用程序,使用這個庫,部署在容器中。
該webapp將有它自己的類加載器,使用WEB-INF/classes和WEB-INF/lib/*。jar作爲它的類路徑。並且容器,對於每個請求進入您的web應用程序,都會將當前線程類加載器設置爲類路徑的類加載器。
當您的庫代碼使用getClass().getResource()
時,它將使用用於加載庫類的類加載器加載資源。因此它將使用容器的類加載器,並因此將使用庫的jar和用於啓動容器的其他庫中的資源。
如果您的庫代碼使用Thread.currentThread().getContextClassLoader()
來代替加載資源,它將使用與當前線程關聯的類加載器,並因此從webapp的類加載器加載資源,在WEB-INF/classes中查找資源並在WEB-INF/lib的jar文件中。
後者可以是你想要的。例如,如果你正在設計一個日誌庫(請不要),記錄器將能夠爲每個webapp讀取一個不同的配置文件,而不是讓所有的webapps共享一個配置文件。
關於這兩種方法尋找資源的方式,它們最終都委託給一個ClassLoader來加載資源。但是通過Class加載它會將相對路徑視爲相對於被調用的類,而通過ClassLoader加載它需要一個從包樹根開始的路徑。假設你的類是在包com.foo
,然後
MyClass.class.getResource("hello.txt")
相當於
MyClass.class.getResource("/com/foo/hello.txt")
,相當於
MyClass.class.getClassLoader().getResource("com/foo/hello.txt");
那麼你看着上下文類加載器是什麼?你的資源在哪裏,你的背景是什麼? (Web應用程序?還有其他什麼?)目前我們還沒有足夠的信息來幫助您? –
更新了問題以提供更多信息 –
您是否按照它們返回的對象查看了'getClass()。getClassLoader()'和'Thread.currentThread()。getContextClassLoader()'的細節? –