私はEclipseでTomcatを使用しています。
tomcat のドキュメントによると
、Web アプリケーションの観点から、クラスまたはリソースの読み込みは、次のリポジトリをこの順序で検索します。
- JVM システム クラス ローダー クラスのブートストラップ クラス (上記で説明)
- Web アプリケーションの /WEB-INF/classes
- Web アプリケーションの /WEB-INF/lib/*.jar
- 共通クラス・ローダー・クラス (上記で説明)
したがって、クラスをロードするとき、Tomcat はWEB-INF/lib の前にWEB- INF/classesを検索します。また、WEB-INF/lib の jar ファイルの一部のクラスを上書きできます。Tomcat は上書きされたものを取得します。
しかし、「Serve modules with out publish」をチェックしてTomcatサーバーオプションを変更すると、上書きされたクラスはロードされなくなります。
それを再び機能させるための解決策はありますか?
編集:
何か役に立つかもしれないことがわかりました。このフォルダーf:\eclipse_projects\.metadata.plugins\org.eclipse.wst.server.core\tmp0\conf
には、そのようなコンテンツを含む server.xml があります。
<Resources className="org.eclipse.jst.server.tomcat.loader.WtpDirContext"
extraResourcePaths=""
virtualClasspath="F:\eclipse_projects\ALS7C3\bin"/>
<Loader className="org.eclipse.jst.server.tomcat.loader.WtpWebappLoader"
useSystemClassLoaderAsParent="false"
virtualClasspath="F:\eclipse_projects\ALS7C3\bin"/>
「公開せずにモジュールを提供する」オプションをオンにして tomcat を実行すると、Eclipse は独自のローダーを使用するようです。このローダーは、f:\eclipse_projects\.metadata.plugins\org.eclipse にコピーされる jar ファイルに含まれています。 wst.server.core\tmp0\lib** Eclipse で tomcat を起動したとき。**org.eclipse.jst.server.tomcat.loader.WtpDirContext のソース コードの一部を次に示します。
public Object lookup(String name) throws NamingException {
if (name.startsWith("/WEB-INF/") && name.endsWith(".tld")) {
String tldName = name.substring(name.lastIndexOf("/") + 1);
if (virtualMappings != null && virtualMappings.containsKey(tldName)) {
return new FileResource(virtualMappings.get(tldName));
}
} else if (tagfileMappings != null && name.startsWith("/META-INF/tags")
&& (name.endsWith(".tag") || name.endsWith(".tagx"))) {
// already loaded tag file
return new FileResource(tagfileMappings.get(name));
}
Object retSuper;
NamingException superEx;
try {
retSuper = super.lookup(name);
return retSuper;
} catch (NamingException ex) {
retSuper = null;
superEx = ex;
}
if (mappedResourcePaths != null) {
// Perform lookup using the extra resource paths
for (Map.Entry<String, List<String>> mapping : mappedResourcePaths.entrySet()) {
String path = mapping.getKey();
List<String> dirList = mapping.getValue();
if (name.equals(path)) {
for (String resourcesDir : dirList) {
File f = new File(resourcesDir);
if (f.exists() && f.canRead()) {
if (f.isFile()) {
return new FileResource(f);
}
else {
// TODO Handle directory
}
}
}
}
path += "/";
if (name.startsWith(path)) {
String res = name.substring(path.length());
for (String resourcesDir : dirList) {
File f = new File (resourcesDir + "/" + res);
if (f.exists() && f.canRead()) {
if (f.isFile()) {
return new FileResource(f);
}
else {
// TODO Handle directory
}
}
}
}
}
}
throw superEx;
}
最初にjspタグライブラリを処理してから super.lookup を呼び出す場合、 super.lookupで見つからない場合、virtualClasspath、「F:\eclipse_projects\ALS7C3\bin」にリソースをロードしようとするようです私の例では、パブリッシュせずにモジュールを提供するときにEclipseがクラスファイルを出力する場所です。
ということで、 org.eclipse.jst.server.tomcat.loader.WtpDirContextのlookupメソッドを上書きできれば欲しいものは手に入ると思いますが、この jar ファイルはorg.eclipse.jst.server.tomcat に含まれています。 core.jar、両方とも署名されています。
そのようなjarファイルを上書きする方法がわかりません。
誰でも助けることができますか?