hibernate-core和hibernate-annotation - 冲突

San*_*dal 2 java hibernate verifyerror hibernate-annotations

我收到错误:

java.lang.VerifyError: (class: org/hibernate/type/BasicTypeRegistry, method:  signature: ()V) Incompatible argument to function     
at org.hibernate.type.TypeResolver.(TypeResolver.java:59)   
at com.gs.ctt.cb.types.usertypes.GenericEnumUserType.setParameterValues(GenericEnumUserType.java:46) 
at org.hibernate.type.TypeFactory.injectParameters(TypeFactory.java:339)
Run Code Online (Sandbox Code Playgroud)



由于可能的原因是冲突的库,我发现该类:org.hibernate.cfg.AnnotationConfiguration两者都可用:

  • hibernate-annotations-3.3.0
  • hibernate-core-3.6.4

我是否需要摆脱hibernate-annotations?为什么?

ug_*_*ug_ 8

Maven中的许多依赖项也依赖于其他库来运行.当包含类似依赖项时,hibernate-core它也会自动将其依赖项导入到项目中,其中一个是hibernate-annotations库.结果是2个具有不同版本的库,这是Maven中的常见问题,它们提供了一种很好的方法来查找从中导入这些依赖项的位置.

在这种情况下,只需hibernate-annotations从项目中删除依赖项,然后让它hibernate-core为您导入.

如何为自己找到这个重复的库冲突?一个很棒的方法是使用Maven提供给我们的依赖树插件:mvn dependency:tree -Dverbose -Dincludes=org.hibernate.*.这将显示项目中org.hibernate的组或子组中的所有库依赖项.还可以考虑通过附加> fileOutputName.txt到调用来输出到文件,以便更容易查看,尤其是在使用Windows命令行时.

这是我有一个hibernate的项目的示例输出:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>4.0.1.Final</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

mvn dependency:tree调用:

[INFO] +- org.hibernate:hibernate-core:jar:4.0.1.Final:compile
[INFO] |  +- (org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.1.Final:compile - omitted for duplicate)
[INFO] |  \- org.hibernate.common:hibernate-commons-annotations:jar:4.0.1.Final:compile
[INFO] +- org.hibernate.common:hibernate-commons-annotations:jar:tests:4.0.1.Final:compile
[INFO] +- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.1.Final:compile
[INFO] \- org.hibernate:hibernate-entitymanager:jar:4.0.1.Final:compile
[INFO]    +- (org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.1.Final:compile - omitted for duplicate)
[INFO]    \- (org.hibernate.common:hibernate-commons-annotations:jar:4.0.1.Final:compile - omitted for duplicate)
Run Code Online (Sandbox Code Playgroud)

如您所见,hibernate-core自动导入hibernate-commons-annotations.如果该版本与您在pom中包含的版本不同,Maven将包括它们都会导致问题.除非你有充分的理由更改注释版本,否则最好不要让核心导入来做它的事情.


如果您真的想从核心库中删除依赖项,可以通过添加<exclusions>标记来实现.但请注意,因为hibernate套件的其他部分将尝试导入注释包,您最终可能会从很多依赖项中排除注释.

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>4.0.1.Final</version>
    <exclusions>
        <exclusion>  <!-- remove annotations inclusion -->
            <groupId>org.hibernate.common</groupId>
            <artifactId>hibernate-commons-annotations</artifactId>
        </exclusion>
    </exclusions> 
</dependency>
Run Code Online (Sandbox Code Playgroud)