我目前正在将Wicket项目从wicket 1.4.2升级到6.4.0。 wicket组件/页面的迁移进展顺利,但我遇到了projet依赖项的问题。
这是一个旧项目,依赖于旧技术和私有框架。我的公司框架无法升级(暂时),所以我必须处理它的特殊性。
当我将我的webapp部署到Glassfish时,出现以下错误:
ERROR - ContextLoader - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in URL [jar:file:/home/company/glassfish/domains/domain1/applications/j2ee-modules/mainProject-3.0.0-SNAPSHOT/WEB-INF/lib/daoProject-3.0.0-SNAPSHOT.jar!/dataContext.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V
这似乎是由于ASM,包括在Wicket和Spring中使用不同的版本。
我的poms中有<dependencies>
的部分内容:
主要项目:
<dependency>
<groupId>my.company</groupId>
<artifactId>privateFramework</artifactId>
<version>1.1.6</version>
</dependency>
<dependency>
<groupId>my.company</groupId>
<artifactId>daoProject</artifactId>
<version>3.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apach.wicket</groupId>
<artifactId>wicket-spring</artifactId>
<version>6.4.0</version>
</dependency>
DAO项目:
<dependency>
<groupId>my.company</groupId>
<artifactId>privateFramework</artifactId>
<version>1.1.6</version>
</dependency>
私人框架:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-hibernate3</artifactId>
<version>2.0.8</version>
</dependency>
有$ mvn dependency:tree -Dverbose -Dincludes=asm
输出:
[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ immatriculation ---
[INFO] my.company:mainProject:war:3.0.0-SNAPSHOT
[INFO] +- my.company:privateFramework:jar:1.1.6:compile
[INFO] | \- org.springframework:spring-hibernate3:jar:2.0.8:compile
[INFO] | \- org.hibernate:hibernate:jar:3.2.5.ga:compile
[INFO] | +- asm:asm-attrs:jar:1.5.3:compile
[INFO] | \- asm:asm:jar:1.5.3:compile
[INFO] \- org.apache.wicket:wicket-spring:jar:6.4.0:compile
[INFO] \- org.apache.wicket:wicket-ioc:jar:6.4.0:compile
[INFO] \- cglib:cglib:jar:2.2.2:compile
[INFO] \- (asm:asm:jar:3.3.1:compile - omitted for conflict with 1.5.3)
是否存在解决此类依赖冲突的“最佳做法”?我尝试了几件事(从asm
排除privateFramework
,使用dependencyManagement
强制asm到3.3.1,...)但是我无法使其正常工作。
谢谢
答案 0 :(得分:2)
您可以尝试将cglib:cglib
的范围设置为provided
(以便不会将其添加到WAR文件中),而是使用cglib:cglib-nodep
。 cglib的这种分布有一个阴影&#39;嵌入asm的版本(基础包已更改),排除冲突。
将此添加到您的POM:
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>2.2.2</version>
</dependency>