由于Tomcat 9.0.19(包括@Luiz提到的那个版本)中都没有可行的选项,因此我们采用了代码方法,并用最小化的自定义实现替换了Tomcat StandardHost和HostConfig:
public class CustomTomcatHost extends StandardHost {
public CustomTomcatHost() {
super();
}
@Override
public void addLifecycleListener(LifecycleListener listener) {
if (listener instanceof HostConfig) {
listener = new OrderedHostConfig();
}
super.addLifecycleListener(listener);
}
}
deployApps 函数在 HostConfig 中必须被重写,以使排序适用于所有内容(包括 /webapps 文件夹中的 WAR 文件以及 configbase 文件夹中的描述符 XML 文件(例如 conf/Catalina/localhost)):
public class OrderedHostConfig extends HostConfig {
public OrderedHostConfig() {
super();
}
public String[] prioritySort(String[] paths) {
if (paths == null) return null;
Arrays.sort(paths, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return a.compareTo(b);
}
});
return paths;
}
@Override
protected void deployApps() {
File appBase = host.getAppBaseFile();
File configBase = host.getConfigBaseFile();
String[] apps = prioritySort(filterAppPaths(appBase.list()));
deployDescriptors(configBase, prioritySort(configBase.list()));
deployWARs(appBase, apps);
deployDirectories(appBase, apps);
}
}
然后我们将新类放置在Tomcat /lib目录下的一个新的jar文件中,并修改conf/server.xml文件以用我们自己的实现替换主机类:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" className="com.example.CustomTomcatHost" >
在启动Tomcat时,按照所需的顺序加载了所有组件。