如何针对特定Web应用在Jetty类路径中排除lib/ext目录?
Jetty 9单应用屏蔽lib/ext依赖冲突解决方案
单应用维度控制lib/ext加载的实现方法
Jetty 9原生支持按单个Web应用自定义类加载逻辑,无需修改全局配置,也不会影响服务器上其他应用,操作如下:
- 在你的Web应用源码的
WEB-INF目录下新增jetty-web.xml配置文件,文件内容如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd"> <Configure class="org.eclipse.jetty.webapp.WebAppContext"> <!-- 配置当前应用优先加载自身WEB-INF下的类,优先级高于Jetty全局类路径(含lib/ext) --> <Set name="parentLoaderPriority">false</Set> <!-- 如需完全屏蔽全局lib/ext的所有类,追加以下配置 --> <Call name="addServerClass"> <Arg>-</Arg> </Call> <!-- 如需屏蔽指定包的全局类,按以下格式配置,前缀-代表排除 --> <!-- <Call name="addSystemClass"> <Arg>-com.example.conflict.package.</Arg> </Call> --> </Configure>
- 重新打包应用部署即可,该配置仅对当前应用生效,其他应用仍会正常加载
$JETTY_HOME/lib/ext下的依赖。
其他可行替代方案
如果不想修改Jetty应用配置,可选择以下方案解决冲突:
- 调整Maven依赖范围:确认你的应用兼容
$JETTY_HOME/lib/ext下的冲突依赖版本后,在pom.xml中将对应冲突依赖的<scope>设为provided,打包时排除该依赖,直接使用服务器侧提供的版本。 - 依赖shade重命名:使用
maven-shade-plugin打包应用,将冲突的依赖包重命名(包名前缀增加自定义标识),从类名层面完全规避冲突,无需修改任何服务器侧配置,兼容性最高。 - 独立上下文配置:如果服务器权限足够,可为你的应用单独配置独立的Jetty上下文,指定专属的ext目录,完全隔离全局lib/ext路径。
内容的提问来源于stack exchange,提问作者pbuchheit
相关产品推荐
相关产品推荐

