簡體   English   中英

為什么 Maven 要使用 javax.persistence 而不是替代的休眠版本

[英]Why does Maven want to use javax.persistence instead of the alternative hibernate version

我有一些代碼使用:

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>

任何想法出了什么問題?

這真的很簡單: org.hibernate:hibernate-core:5.4.15.Final依賴於javax.persistence.*類來自javax.persistence:javax.persistence-api:2.2 (這是在它自己的 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>
  1. 1.0.2.Final - 這個聲明說:允許任何版本,但更喜歡 1.0.2.FINAL。 如果要指定確切版本,請將其聲明為<version>[1.0.2.Final]</version>

  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 [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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM