为什么Maven希望使用javax.persistence而不是替代的Hibernate版本?

huangapple go评论94阅读模式
英文:

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

问题

我有一些使用以下代码的代码:

  1. import javax.persistence.*;

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

  1. <dependency>
  2. <groupId>org.hibernate</groupId>
  3. <artifactId>hibernate-core</artifactId>
  4. <version>5.4.15.Final</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.hibernate.javax.persistence</groupId>
  8. <artifactId>hibernate-jpa-2.1-api</artifactId>
  9. <version>1.0.2.Final</version>
  10. </dependency>

我可以使用“mvn compile”编译,但是当我尝试“mvn package”时,我会收到以下错误:

  1. [WARNING] 发现未声明的依赖项:
  2. [WARNING] javax.persistence:javax.persistence-api:jar:2.2:compile
  3. [WARNING] 发现未使用的声明依赖项:
  4. [WARNING] org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.2.Final:compile
  5. [INFO] ------------------------------------------------------------------------
  6. [INFO] BUILD FAILURE
  7. [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”中收到很多错误,看起来像是这样:

  1. [WARNING] 在[jakarta.xml.bind:jakarta.xml.bind-api:2.3.3javax.xml.bind:jaxb-api:2.3.1]中发现了重复(但相等)的类:
  2. [WARNING] javax.xml.bind.DatatypeConverterInterface
  3. [WARNING] javax.xml.bind.Element
  4. [WARNING] javax.xml.bind.JAXBContextFactory
  5. [WARNING] javax.xml.bind.Marshaller
  6. [WARNING] ...

有什么想法出了什么问题吗?

英文:

I have some code that uses:

  1. import javax.persistence.*;

I have the following dependencies in pom.xml:

  1. &lt;dependency&gt;
  2. &lt;groupId&gt;org.hibernate&lt;/groupId&gt;
  3. &lt;artifactId&gt;hibernate-core&lt;/artifactId&gt;
  4. &lt;version&gt;5.4.15.Final&lt;/version&gt;
  5. &lt;/dependency&gt;
  6. &lt;dependency&gt;
  7. &lt;groupId&gt;org.hibernate.javax.persistence&lt;/groupId&gt;
  8. &lt;artifactId&gt;hibernate-jpa-2.1-api&lt;/artifactId&gt;
  9. &lt;version&gt;1.0.2.Final&lt;/version&gt;
  10. &lt;/dependency&gt;

I can compile ok using "mvn compile" but when I try to "mvn package" I get the following error:

  1. [WARNING] Used undeclared dependencies found:
  2. [WARNING] javax.persistence:javax.persistence-api:jar:2.2:compile
  3. [WARNING] Unused declared dependencies found:
  4. [WARNING] org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.2.Final:compile
  5. [INFO] ------------------------------------------------------------------------
  6. [INFO] BUILD FAILURE
  7. [INFO] ------------------------------------------------------------------------

I checked the jar from hibernate-jpa-2.1-api and it does contain the javax.persistence.* classes.

So why won't Maven accept that this is the jar to use and insists it wants the javax.persistence-api instead?

If I try to switch to the javax.persistence:javax.persistence-api:jar:2.2 instead of the hibernate one I get a lot of errors from 'mvn package' that look like this:

  1. [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]:
  2. [WARNING] javax.xml.bind.DatatypeConverterInterface
  3. [WARNING] javax.xml.bind.Element
  4. [WARNING] javax.xml.bind.JAXBContextFactory
  5. [WARNING] javax.xml.bind.Marshaller
  6. [WARNING] javax.xml.bind.NotIdentifiableEvent
  7. [WARNING] javax.xml.bind.ParseConversionEvent
  8. [WARNING] javax.xml.bind.PrintConversionEvent
  9. [WARNING] javax.xml.bind.Unmarshaller
  10. [WARNING] javax.xml.bind.UnmarshallerHandler
  11. [WARNING] javax.xml.bind.ValidationEvent
  12. [WARNING] javax.xml.bind.ValidationEventHandler
  13. [WARNING] javax.xml.bind.ValidationEventLocator
  14. [WARNING] javax.xml.bind.Validator
  15. [WARNING] javax.xml.bind.annotation.DomHandler
  16. [WARNING] javax.xml.bind.annotation.XmlAccessorOrder
  17. [WARNING] javax.xml.bind.annotation.XmlAccessorType
  18. [WARNING] javax.xml.bind.annotation.XmlAnyAttribute
  19. [WARNING] javax.xml.bind.annotation.XmlAnyElement
  20. [WARNING] javax.xml.bind.annotation.XmlAttachmentRef
  21. [WARNING] javax.xml.bind.annotation.XmlAttribute
  22. [WARNING] javax.xml.bind.annotation.XmlElement
  23. [WARNING] javax.xml.bind.annotation.XmlElementDecl
  24. [WARNING] javax.xml.bind.annotation.XmlElementRef
  25. [WARNING] javax.xml.bind.annotation.XmlElementRefs
  26. [WARNING] javax.xml.bind.annotation.XmlElementWrapper
  27. &lt;...lots more lines like this&gt;

Any ideas what is going wrong?

答案1

得分: 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 作为传递性依赖项,如下所示:

  1. <dependency>
  2. <groupId>org.hibernate</groupId>
  3. <artifactId>hibernate-core</artifactId>
  4. <version>5.4.15.Final</version>
  5. <exclusions>
  6. <exclusion>
  7. <groupId>javax.persistence</groupId>
  8. <artifactId>javax.persistence-api</artifactId>
  9. </exclusion>
  10. </exclusions>
  11. </dependency>
英文:

It's really quite simple: org.hibernate:hibernate-core:5.4.15.Final depends on javax.persistence.* classes from javax.persistence:javax.persistence-api:2.2 (that's the dependency declared in its own POM) and so, by including hibernate-core, you get an additional, transitive dependency javax.persistence-api pulled in. This is why you're getting the 'Used undeclared dependencies found' warning.

For the very same reason, org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.2.Final is not used. Note that Maven does not have a way of knowing hibernate-jpa-2.1-api and javax.persistence-api are supposed to be interchangeable.

If, for some strange reason, you want to force hibernate-jpa-2.1-api to be used instead, you need to explicitly exclude javax.persistence-api as a transitive dependency like so:

  1. &lt;dependency&gt;
  2. &lt;groupId&gt;org.hibernate&lt;/groupId&gt;
  3. &lt;artifactId&gt;hibernate-core&lt;/artifactId&gt;
  4. &lt;version&gt;5.4.15.Final&lt;/version&gt;
  5. &lt;exclusions&gt;
  6. &lt;exclusion&gt;
  7. &lt;groupId&gt;javax.persistence&lt;/groupId&gt;
  8. &lt;artifactId&gt;javax.persistence-api&lt;/artifactId&gt;
  9. &lt;/exclusion&gt;
  10. &lt;/exclusions&gt;
  11. &lt;/dependency&gt;

答案2

得分: 0

  1. <version>1.0.2.Final</version> - 此声明表示:允许任何版本,但首选 1.0.2.FINAL。如果要指定精确版本,请将其声明为 &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

    1. mvn dependency:tree
    2. [INFO] 正在扫描项目...
    3. [INFO]
    4. [INFO] -----------------------&lt; org.example:so-answers &gt;-----------------------
    5. [INFO] 正在构建 so-answers 1.0-SNAPSHOT
    6. [INFO] --------------------------------[ jar ]---------------------------------
    7. [INFO]
    8. [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ so-answers ---
    9. [INFO] org.example:so-answers:jar:1.0-SNAPSHOT
    10. [INFO] +- org.hibernate:hibernate-core:jar:5.4.15.Final:compile
    11. [INFO] | +- org.jboss.logging:jboss-logging:jar:3.3.2.Final:compile
    12. [INFO] | +- javax.persistence:javax.persistence-api:jar:2.2:compile
    13. [INFO] | +- org.javassist:javassist:jar:3.24.0-GA:compile
    14. [INFO] | +- net.bytebuddy:byte-buddy:jar:1.10.10:compile
    15. [INFO] | +- antlr:antlr:jar:2.7.7:compile
    16. [INFO] | +- org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:jar:1.1.1.Final:compile
    17. [INFO] | +- org.jboss:jandex:jar:2.1.3.Final:compile
    18. [INFO] | +- com.fasterxml:classmate:jar:1.5.1:compile
    19. [INFO] | +- javax.activation:javax.activation-api:jar:1.2.0:compile
    20. [INFO] | +- org.dom4j:dom4j:jar:2.1.3:compile
    21. [INFO] | +- org.hibernate.common:hibernate-commons-annotations:jar:5.1.0.Final:compile
    22. [INFO] | +- javax.xml.bind:jaxb-api:jar:2.3.1:compile
    23. [INFO] | \- org.glassfish.jaxb:jaxb-runtime:jar:2.3.1:compile
    24. [INFO] | +- org.glassfish.jaxb:txw2:jar:2.3.1:compile
    25. [INFO] | +- com.sun.istack:istack-commons-runtime:jar:3.0.7:compile
    26. [INFO] | +- org.jvnet.staxex:stax-ex:jar:1.8:compile
    27. [INFO] | \- com.sun.xml.fastinfoset:FastInfoset:jar:1.2.15:compile
    28. [INFO] \- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.2.Final:compile
    29. [INFO] -----------------------------------------------------------------------
    30. [INFO] 构建成功
    31. [INFO] -----------------------------------------------------------------------
    32. [INFO] 总时间: 0.790
    33. [INFO] 完成于: 2020-09-26T10:02:50-04:00
    34. [INFO] -----------------------------------------------------------------------

让我们添加排除来影响解析。

  1. &lt;dependencies&gt;
  2. &lt;dependency&gt;
  3. &lt;groupId&gt;org.hibernate&lt;/groupId&gt;
  4. &lt;artifactId&gt;hibernate-core&lt;/artifactId&gt;
  5. &lt;version&gt;5.4.15.Final&lt;/version&gt;
  6. &lt;exclusions&gt;
  7. &lt;exclusion&gt;
  8. &lt;groupId&gt;javax.persistence&lt;/groupId&gt;
  9. &lt;artifactId&gt;javax.persistence-api&lt;/artifactId&gt;
  10. &lt;/exclusion&gt;
  11. &lt;/exclusions&gt;
  12. &lt;/dependency&gt;
  13. &lt;dependency&gt;
  14. &lt;groupId&gt;org.hibernate.javax.persistence&lt;/groupId&gt;
  15. &lt;artifactId&gt;hibernate-jpa-2.1-api&lt;/artifactId&gt;
  16. &lt;version&gt;1.0.2.Final&lt;/version&gt;
  17. &lt;/dependency&gt;
  18. &lt;/dependencies&gt;

然后再次检查依赖树

  1. mvn dependency:tree
  2. [INFO] 正在扫描项目...
  3. [INFO]
  4. [INFO] -----------------------&lt; org.example:so-answers &gt;-----------------------
  5. [INFO] 正在构建 so-answers 1.0-SNAPSHOT
  6. [INFO] --------------------------------[ jar ]---------------------------------
  7. [INFO]
  8. [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ so-answers ---
  9. [INFO] org.example:so-answers:jar:1.0-SNAPSHOT
  10. [INFO] +- org.hibernate:hibernate-core:jar:5.4.15.Final:compile
  11. [INFO] | +- org.jboss.logging:jboss-logging:jar:3.3.2.Final:compile
  12. [INFO] | +- org.javassist:javassist:jar:3.24.0-GA:compile
  13. [INFO] | +- net.bytebuddy:byte-buddy:jar:1.10.10:compile
  14. [INFO] | +- antlr:antlr:jar:2.7.7:compile
  15. [INFO] | +- org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:jar:1.1.1.Final:compile
  16. [INFO] | +- org.jboss:jandex:jar:2.1.3.Final:compile
  17. [INFO] | +- com.fasterxml:classmate:jar:1.5.1:compile
  18. [INFO] | +- javax.activation:javax.activation-api:jar:1.2.0:compile
  19. [INFO] | +- org.dom4j:dom4j:jar:2.1.3:compile
  20. [INFO] | +- org.hibernate.common:hibernate-commons
英文:
  1. <version>1.0.2.Final</version> - This declaration says : allow any version, but prefer 1.0.2.FINAL.
    If you want to specify exact version declare it as &lt;version&gt;[1.0.2.Final]&lt;/version&gt;

  2. Generally while resolving a transitive dependency (or on conflict, which is not the case in this case) Maven will choose the nearest dependency. In this case javax.persistence:javax.persistence-api:jar:2.2:compile is closer to org.hibernate:hibernate-core:jar:5.4.15.Final:compile.

    1. mvn dependency:tree
    2. [INFO] Scanning for projects...
    3. [INFO]
    4. [INFO] -----------------------&lt; org.example:so-answers &gt;-----------------------
    5. [INFO] Building so-answers 1.0-SNAPSHOT
    6. [INFO] --------------------------------[ jar ]---------------------------------
    7. [INFO]
    8. [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ so-answers ---
    9. [INFO] org.example:so-answers:jar:1.0-SNAPSHOT
    10. [INFO] +- org.hibernate:hibernate-core:jar:5.4.15.Final:compile
    11. [INFO] | +- org.jboss.logging:jboss-logging:jar:3.3.2.Final:compile
    12. [INFO] | +- javax.persistence:javax.persistence-api:jar:2.2:compile
    13. [INFO] | +- org.javassist:javassist:jar:3.24.0-GA:compile
    14. [INFO] | +- net.bytebuddy:byte-buddy:jar:1.10.10:compile
    15. [INFO] | +- antlr:antlr:jar:2.7.7:compile
    16. [INFO] | +- org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:jar:1.1.1.Final:compile
    17. [INFO] | +- org.jboss:jandex:jar:2.1.3.Final:compile
    18. [INFO] | +- com.fasterxml:classmate:jar:1.5.1:compile
    19. [INFO] | +- javax.activation:javax.activation-api:jar:1.2.0:compile
    20. [INFO] | +- org.dom4j:dom4j:jar:2.1.3:compile
    21. [INFO] | +- org.hibernate.common:hibernate-commons-annotations:jar:5.1.0.Final:compile
    22. [INFO] | +- javax.xml.bind:jaxb-api:jar:2.3.1:compile
    23. [INFO] | \- org.glassfish.jaxb:jaxb-runtime:jar:2.3.1:compile
    24. [INFO] | +- org.glassfish.jaxb:txw2:jar:2.3.1:compile
    25. [INFO] | +- com.sun.istack:istack-commons-runtime:jar:3.0.7:compile
    26. [INFO] | +- org.jvnet.staxex:stax-ex:jar:1.8:compile
    27. [INFO] | \- com.sun.xml.fastinfoset:FastInfoset:jar:1.2.15:compile
    28. [INFO] \- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.2.Final:compile
    29. [INFO] ------------------------------------------------------------------------
    30. [INFO] BUILD SUCCESS
    31. [INFO] ------------------------------------------------------------------------
    32. [INFO] Total time: 0.790 s
    33. [INFO] Finished at: 2020-09-26T10:02:50-04:00
    34. [INFO] ------------------------------------------------------------------------

Let's add exclusion to influence resolution.

  1. &lt;dependencies&gt;
  2. &lt;dependency&gt;
  3. &lt;groupId&gt;org.hibernate&lt;/groupId&gt;
  4. &lt;artifactId&gt;hibernate-core&lt;/artifactId&gt;
  5. &lt;version&gt;5.4.15.Final&lt;/version&gt;
  6. &lt;exclusions&gt;
  7. &lt;exclusion&gt;
  8. &lt;groupId&gt;javax.persistence&lt;/groupId&gt;
  9. &lt;artifactId&gt;javax.persistence-api&lt;/artifactId&gt;
  10. &lt;/exclusion&gt;
  11. &lt;/exclusions&gt;
  12. &lt;/dependency&gt;
  13. &lt;dependency&gt;
  14. &lt;groupId&gt;org.hibernate.javax.persistence&lt;/groupId&gt;
  15. &lt;artifactId&gt;hibernate-jpa-2.1-api&lt;/artifactId&gt;
  16. &lt;version&gt;1.0.2.Final&lt;/version&gt;
  17. &lt;/dependency&gt;
  18. &lt;/dependencies&gt;

And then check dependency tree again

  1. mvn dependency:tree
  2. [INFO] Scanning for projects...
  3. [INFO]
  4. [INFO] -----------------------&lt; org.example:so-answers &gt;-----------------------
  5. [INFO] Building so-answers 1.0-SNAPSHOT
  6. [INFO] --------------------------------[ jar ]---------------------------------
  7. [INFO]
  8. [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ so-answers ---
  9. [INFO] org.example:so-answers:jar:1.0-SNAPSHOT
  10. [INFO] +- org.hibernate:hibernate-core:jar:5.4.15.Final:compile
  11. [INFO] | +- org.jboss.logging:jboss-logging:jar:3.3.2.Final:compile
  12. [INFO] | +- org.javassist:javassist:jar:3.24.0-GA:compile
  13. [INFO] | +- net.bytebuddy:byte-buddy:jar:1.10.10:compile
  14. [INFO] | +- antlr:antlr:jar:2.7.7:compile
  15. [INFO] | +- org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:jar:1.1.1.Final:compile
  16. [INFO] | +- org.jboss:jandex:jar:2.1.3.Final:compile
  17. [INFO] | +- com.fasterxml:classmate:jar:1.5.1:compile
  18. [INFO] | +- javax.activation:javax.activation-api:jar:1.2.0:compile
  19. [INFO] | +- org.dom4j:dom4j:jar:2.1.3:compile
  20. [INFO] | +- org.hibernate.common:hibernate-commons-annotations:jar:5.1.0.Final:compile
  21. [INFO] | +- javax.xml.bind:jaxb-api:jar:2.3.1:compile
  22. [INFO] | \- org.glassfish.jaxb:jaxb-runtime:jar:2.3.1:compile
  23. [INFO] | +- org.glassfish.jaxb:txw2:jar:2.3.1:compile
  24. [INFO] | +- com.sun.istack:istack-commons-runtime:jar:3.0.7:compile
  25. [INFO] | +- org.jvnet.staxex:stax-ex:jar:1.8:compile
  26. [INFO] | \- com.sun.xml.fastinfoset:FastInfoset:jar:1.2.15:compile
  27. [INFO] \- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.2.Final:compile
  28. [INFO] ------------------------------------------------------------------------
  29. [INFO] BUILD SUCCESS
  30. [INFO] ------------------------------------------------------------------------
  31. [INFO] Total time: 0.927 s
  32. [INFO] Finished at: 2020-09-26T10:23:46-04:00
  33. [INFO] ------------------------------------------------------------------------

Now [INFO] | +- javax.persistence:javax.persistence-api:jar:2.2:compile line is absent - effectively we asked Maven to use org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.2.Final:compile.

huangapple
  • 本文由 发表于 2020年9月26日 19:42:55
  • 转载请务必保留本文链接:https://go.coder-hub.com/64077275.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定