【问题标题】:Why does Maven want to use javax.persistence instead of the alternative hibernate version为什么 Maven 要使用 javax.persistence 而不是替代的 hibernate 版本
【发布时间】:2020-09-26 11:42:55
【问题描述】:

我有一些代码使用:

import javax.persistence.*;

我在 pom.xml 中有以下依赖项:

<dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.4.15.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.1-api</artifactId>
            <version>1.0.2.Final</version>
        </dependency>

我可以使用“mvn compile”进行编译,但是当我尝试“mvn package”时,出现以下错误:

[WARNING] Used undeclared dependencies found:
[WARNING]    javax.persistence:javax.persistence-api:jar:2.2:compile
[WARNING] Unused declared dependencies found:
[WARNING]    org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.2.Final:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------

我从 hibernate-jpa-2.1-api 检查了 jar,它确实包含 javax.persistence.* 类。

那么,为什么 Maven 不接受这是要使用的 jar 并坚持要使用 javax.persistence-api 呢?

如果我尝试切换到 javax.persistence:javax.persistence-api:jar:2.2 而不是 hibernate 的,我会从“mvn package”中得到很多错误,如下所示:

[WARNING] Found duplicate (but equal) classes in [jakarta.xml.bind:jakarta.xml.bind-api:2.3.3, javax.xml.bind:jaxb-api:2.3.1]:
[WARNING]   javax.xml.bind.DatatypeConverterInterface
[WARNING]   javax.xml.bind.Element
[WARNING]   javax.xml.bind.JAXBContextFactory
[WARNING]   javax.xml.bind.Marshaller
[WARNING]   javax.xml.bind.NotIdentifiableEvent
[WARNING]   javax.xml.bind.ParseConversionEvent
[WARNING]   javax.xml.bind.PrintConversionEvent
[WARNING]   javax.xml.bind.Unmarshaller
[WARNING]   javax.xml.bind.UnmarshallerHandler
[WARNING]   javax.xml.bind.ValidationEvent
[WARNING]   javax.xml.bind.ValidationEventHandler
[WARNING]   javax.xml.bind.ValidationEventLocator
[WARNING]   javax.xml.bind.Validator
[WARNING]   javax.xml.bind.annotation.DomHandler
[WARNING]   javax.xml.bind.annotation.XmlAccessorOrder
[WARNING]   javax.xml.bind.annotation.XmlAccessorType
[WARNING]   javax.xml.bind.annotation.XmlAnyAttribute
[WARNING]   javax.xml.bind.annotation.XmlAnyElement
[WARNING]   javax.xml.bind.annotation.XmlAttachmentRef
[WARNING]   javax.xml.bind.annotation.XmlAttribute
[WARNING]   javax.xml.bind.annotation.XmlElement
[WARNING]   javax.xml.bind.annotation.XmlElementDecl
[WARNING]   javax.xml.bind.annotation.XmlElementRef
[WARNING]   javax.xml.bind.annotation.XmlElementRefs
[WARNING]   javax.xml.bind.annotation.XmlElementWrapper
<...lots more lines like this>

有什么想法吗?

【问题讨论】:

    标签: java hibernate maven jpa


    【解决方案1】:

    这真的很简单:org.hibernate:hibernate-core:5.4.15.Final 依赖于来自javax.persistence:javax.persistence-api:2.2javax.persistence.* 类(这是在其自己的 POM 中声明的依赖项),因此,通过包含 hibernate-core,您可以获得额外的传递依赖项javax.persistence-api拉进来。这就是为什么您会收到“发现已使用未声明的依赖项”警告的原因。

    出于同样的原因,不使用org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.2.Final。请注意,Maven没有知道hibernate-jpa-2.1-apijavax.persistence-api 应该可以互换。

    如果出于某种奇怪的原因,您想强制使用 hibernate-jpa-2.1-api,则需要明确排除 javax.persistence-api 作为传递依赖项,如下所示:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.4.15.Final</version>
        <exclusions>
            <exclusion>
                <groupId>javax.persistence</groupId>
                <artifactId>javax.persistence-api</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    

    【讨论】:

      【解决方案2】:
      1. 1.0.2.Final - 这个声明说:允许任何版本,但更喜欢 1.0.2.FINAL。 如果要指定 exact 版本,请将其声明为 &lt;version&gt;[1.0.2.Final]&lt;/version&gt;

      2. 通常在解决传递依赖(或冲突,在这种情况下不是这种情况)时,Maven 会选择最近的依赖。在这种情况下,javax.persistence:javax.persistence-api:jar:2.2:compile 更接近于org.hibernate:hibernate-core:jar:5.4.15.Final:compile

        mvn dependency:tree
         [INFO] Scanning for projects...
         [INFO] 
         [INFO] -----------------------< org.example:so-answers >-----------------------
         [INFO] Building so-answers 1.0-SNAPSHOT
         [INFO] --------------------------------[ jar ]---------------------------------
         [INFO] 
         [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ so-answers ---
         [INFO] org.example:so-answers:jar:1.0-SNAPSHOT
         [INFO] +- org.hibernate:hibernate-core:jar:5.4.15.Final:compile
         [INFO] |  +- org.jboss.logging:jboss-logging:jar:3.3.2.Final:compile
         [INFO] |  +- javax.persistence:javax.persistence-api:jar:2.2:compile
         [INFO] |  +- org.javassist:javassist:jar:3.24.0-GA:compile
         [INFO] |  +- net.bytebuddy:byte-buddy:jar:1.10.10:compile
         [INFO] |  +- antlr:antlr:jar:2.7.7:compile
         [INFO] |  +- org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:jar:1.1.1.Final:compile
         [INFO] |  +- org.jboss:jandex:jar:2.1.3.Final:compile
         [INFO] |  +- com.fasterxml:classmate:jar:1.5.1:compile
         [INFO] |  +- javax.activation:javax.activation-api:jar:1.2.0:compile
         [INFO] |  +- org.dom4j:dom4j:jar:2.1.3:compile
         [INFO] |  +- org.hibernate.common:hibernate-commons-annotations:jar:5.1.0.Final:compile
         [INFO] |  +- javax.xml.bind:jaxb-api:jar:2.3.1:compile
         [INFO] |  \- org.glassfish.jaxb:jaxb-runtime:jar:2.3.1:compile
         [INFO] |     +- org.glassfish.jaxb:txw2:jar:2.3.1:compile
         [INFO] |     +- com.sun.istack:istack-commons-runtime:jar:3.0.7:compile
         [INFO] |     +- org.jvnet.staxex:stax-ex:jar:1.8:compile
         [INFO] |     \- com.sun.xml.fastinfoset:FastInfoset:jar:1.2.15:compile
         [INFO] \- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.2.Final:compile
         [INFO] ------------------------------------------------------------------------
         [INFO] BUILD SUCCESS
         [INFO] ------------------------------------------------------------------------
         [INFO] Total time: 0.790 s
         [INFO] Finished at: 2020-09-26T10:02:50-04:00
         [INFO] ------------------------------------------------------------------------
        

      让我们添加排除以影响分辨率。

      <dependencies>
              <dependency>
                  <groupId>org.hibernate</groupId>
                  <artifactId>hibernate-core</artifactId>
                  <version>5.4.15.Final</version>
                  <exclusions>
                      <exclusion>
                          <groupId>javax.persistence</groupId>
                          <artifactId>javax.persistence-api</artifactId>
                      </exclusion>
                  </exclusions>
              </dependency>
              <dependency>
                  <groupId>org.hibernate.javax.persistence</groupId>
                  <artifactId>hibernate-jpa-2.1-api</artifactId>
                  <version>1.0.2.Final</version>
              </dependency>
          </dependencies>
      

      然后再次检查依赖树

        mvn dependency:tree
          [INFO] Scanning for projects...
          [INFO] 
          [INFO] -----------------------< org.example:so-answers >-----------------------
          [INFO] Building so-answers 1.0-SNAPSHOT
          [INFO] --------------------------------[ jar ]---------------------------------
          [INFO] 
          [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ so-answers ---
          [INFO] org.example:so-answers:jar:1.0-SNAPSHOT
          [INFO] +- org.hibernate:hibernate-core:jar:5.4.15.Final:compile
          [INFO] |  +- org.jboss.logging:jboss-logging:jar:3.3.2.Final:compile
          [INFO] |  +- org.javassist:javassist:jar:3.24.0-GA:compile
          [INFO] |  +- net.bytebuddy:byte-buddy:jar:1.10.10:compile
          [INFO] |  +- antlr:antlr:jar:2.7.7:compile
          [INFO] |  +- org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:jar:1.1.1.Final:compile
          [INFO] |  +- org.jboss:jandex:jar:2.1.3.Final:compile
          [INFO] |  +- com.fasterxml:classmate:jar:1.5.1:compile
          [INFO] |  +- javax.activation:javax.activation-api:jar:1.2.0:compile
          [INFO] |  +- org.dom4j:dom4j:jar:2.1.3:compile
          [INFO] |  +- org.hibernate.common:hibernate-commons-annotations:jar:5.1.0.Final:compile
          [INFO] |  +- javax.xml.bind:jaxb-api:jar:2.3.1:compile
          [INFO] |  \- org.glassfish.jaxb:jaxb-runtime:jar:2.3.1:compile
          [INFO] |     +- org.glassfish.jaxb:txw2:jar:2.3.1:compile
          [INFO] |     +- com.sun.istack:istack-commons-runtime:jar:3.0.7:compile
          [INFO] |     +- org.jvnet.staxex:stax-ex:jar:1.8:compile
          [INFO] |     \- com.sun.xml.fastinfoset:FastInfoset:jar:1.2.15:compile
          [INFO] \- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.2.Final:compile
          [INFO] ------------------------------------------------------------------------
          [INFO] BUILD SUCCESS
          [INFO] ------------------------------------------------------------------------
          [INFO] Total time: 0.927 s
          [INFO] Finished at: 2020-09-26T10:23:46-04:00
          [INFO] ------------------------------------------------------------------------
      

      现在 [INFO] | +- javax.persistence:javax.persistence-api:jar:2.2:compile 行不存在 - 实际上我们要求 Maven 使用 org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.2.Final:compile

      【讨论】:

      • “解决传递依赖冲突时”非常具有误导性。这里没有依赖冲突。就 Maven 而言,javax.persistence-apihibernate-jpa-2.1-api 没有任何关系
      • 我同意,这不适用于这里,我提供了一般信息,将更正。谢谢。
      猜你喜欢
      • 2014-06-09
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 2015-09-02
      • 2013-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多