Class Loaderでget System Resourceとget Resourceの違い

1131 ワード

開発の過程でいくつかの環境があって、どうしても資源を読み込めません。しかし、ある環境ではいつも資源にロードされます。この問題をはっきりさせるために、コードの中に来て原因を調べたら、コードは以下の通りです。
URL url = ClassLoader.getSystemResource(folder);
ブレークポイント後のfolder=templatesは、どうしてもリソースがロードされないため、urlはいつもnullになります。コードの修正を試みました。それで、全部いいです。
URL url = TemplateUtils.class.getClassLoader().getResource("/" + folder);
いったい何の原因でこの違いがありますか?次に、Class Loader.get System ResourceがClass Loader.get System Class Loader()に相当することが分かりました。get Resource(「」)は、ブレークポイントでClass Loader.gets System Class Loader()をApClass Loaderでロードしました。だから同じクラスのLoaderで正常にロードすることができます。AppClass LoaderでロードするSystemClass Loaderでは、同じresourceをロードすることができません。簡単に言えば、Class Loader.gets SystemResourceはTemplateUtils.class.get Class Loaderと同じではないかもしれません。jarパッケージをロードする時は、getsSystemResourceを使わないようにしてください。
 
また、class.get Resourceとclassloader.get Resourceにも違いがあります。
class.get Resourceでは、あるクラスのクラスパスを直接見つけてリソースを検索することを表します。また、あるクラスのルートを見つけたルートディレクトリがリソースを検索し始めることを表します。
classloader.get Resource時には、直接プロジェクトのルートディレクトリを見つけて資源を検索し始めるという意味ではなく、classload.getsResource(「」)は class.get Resource(/)に加えて/を加えるとnullに戻ります。