启动报Duplicate fragment name: spring_web for jar
博客专区 > Wilsonp 的博客 > 博客详情
启动报Duplicate fragment name: spring_web for jar
Wilsonp 发表于8个月前
启动报Duplicate fragment name: spring_web for jar
  • 发表于 8个月前
  • 阅读 43
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】如何购买服务器最划算?>>>   

摘要: 项目采用jetty-run-jetty插件启动报错Duplicate fragment name: spring_web for jar

web项目采用jetty-run-jetty插件启动,报错如下:

java.lang.IllegalStateException: Duplicate fragment name: spring_web for jar:file:///Users/xxx/Downloads/apache-maven-3.3.9/repository/org/springframework/spring-web/4.2.5.RELEASE/spring-web-4.2.5.RELEASE.jar!/META-INF/web-fragment.xml and jar:file:///Users/xxx/Downloads/apache-maven-3.3.9/repository/org/springframework/spring-web/4.3.2.RELEASE/spring-web-4.3.2.RELEASE.jar!/META-INF/web-fragment.xml
	at org.eclipse.jetty.webapp.MetaData.addFragment(MetaData.java:279)
	at org.eclipse.jetty.webapp.FragmentConfiguration.findWebFragments(FragmentConfiguration.java:75)
	at org.eclipse.jetty.webapp.FragmentConfiguration.preConfigure(FragmentConfiguration.java:42)
	at org.eclipse.jetty.webapp.WebAppContext.preConfigure(WebAppContext.java:480)
	at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:516)
	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
	at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132)
	at org.eclipse.jetty.server.Server.start(Server.java:405)
	at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:106)
	at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)
	at org.eclipse.jetty.server.Server.doStart(Server.java:372)
	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
	at runjettyrun.Bootstrap.main(Bootstrap.java:79)

按照提示来看,是jar依赖重复了,导致找到了两个web_fragment段文件,直接被误导了,根本原因在于servlet3.0的新特性之一:可插性支持

那什么是“可插性支持”呢?

如果说 3.0 版本新增的注解支持是为了简化 Servlet/ 过滤器 / 监听器的声明,从而使得 web.xml 变为可选配置, 那么新增的可插性 (pluggability) 支持则将 Servlet 配置的灵活性提升到了新的高度。熟悉 Struts2 的开发者都知道,Struts2 通过插件的形式提供了对包括 Spring 在内的各种开发框架的支持,开发者甚至可以自己为 Struts2 开发插件,而 Servlet 的可插性支持正是基于这样的理念而产生的。使用该特性,现在我们可以在不修改已有 Web 应用的前提下,只需将按照一定格式打成的 JAR 包放到 WEB-INF/lib 目录下,即可实现新功能的扩充,不需要额外的配置。(https://www.ibm.com/developerworks/cn/java/j-lo-servlet30/#_%20%E5%8F%AF%E6%8F%92%E6%80%A7%E6%94%AF%E6%8C%81)

解决问题:

在web.xml文件的<web-app>中增加“metadata-complete=true”配置,该属性指定当前的部署描述文件是否是完全的。如果设置为 true,则容器在部署时将只依赖部署描述文件,忽略所有的注解(同时也会跳过 web-fragment.xml 的扫描,亦即禁用可插性支持,具体请看后文关于 可插性支持的讲解);如果不配置该属性,或者将其设置为 false,则表示启用注解支持(和可插性支持)

共有 人打赏支持
粉丝 0
博文 18
码字总数 6679
×
Wilsonp
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: