【问题标题】:Maven using wrong version of javax.validationMaven 使用错误版本的 javax.validation
【发布时间】:2018-06-05 10:46:42
【问题描述】:

我有一个我一直在处理的动态 Web 项目,它使用 hibernate 作为 jpa 提供程序。直到上周,我都可以使用 hibernate 从我的数据库中插入、更新、查询和删除。最近,我开始研究验证,并引入了许多不同的 Maven 依赖项。在执行此操作的过程中,不知何故,我的项目使用了一个旧的、已弃用的 javax.validation jar 版本,它抛出了 no such method 异常。我在下面包含了堆栈跟踪的相关行:

Caused by: java.lang.NoSuchMethodError: javax.validation.BootstrapConfiguration.getClockProviderClassName()Ljava/lang/String;
at org.hibernate.validator.internal.xml.ValidationBootstrapParameters.<init>(ValidationBootstrapParameters.java:63)

但是,在我的 pom.xml 中,我有以下依赖项(当通过 javap 和 eclipse 检查时,它在指定的类中有 getClockProviderClassName() 方法):

<!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>2.0.0.Final</version>
    </dependency>   

我将以下排除标记放在我的 pom 中的多个依赖项中,以尝试确保它不会从其他来源拉取这个 jar:

            <exclusion>
                <artifactId>validation-api</artifactId>
                <groupId>javax.validation</groupId>
            </exclusion>

我还简化了构建路径,因此其中包含三个元素:一个属性文件夹,其中仅包含我的 log4j 配置、JRE 系统库(版本 1.8)和 maven 依赖项。有什么方法可以告诉不推荐使用的 javax.validation jar 来自哪里?我可以强制程序使用我通过 maven 引入的 2.0.0 版本吗?感谢您的帮助。

其他信息:
full stack trace

persistence.xml source

working datasource properties

Java Build Path

Line where root exception occurs (in my code)

look inside the included jar to see it contains the method

using javap to examine artifact in maven (m2) directory

dependency overview from maven

来自 pom.xml 的依赖项

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>5.0.2.RELEASE</version>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.2.2.Final</version>
        <exclusions>
            <exclusion>
                <artifactId>jboss-logging</artifactId>
                <groupId>org.jboss.logging</groupId>
            </exclusion>
            <exclusion>
                <artifactId>validation-api</artifactId>
                <groupId>javax.validation</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>6.0.3</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.10.0</version>
    </dependency>
    <!-- https://stackoverflow.com/questions/20859379/cannot-import-javax-ejb-packages -->
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>7.0</version>
    </dependency>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>6.0</version>
        <scope>provided</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.jboss.logging/jboss-logging -->
    <dependency>
        <groupId>org.jboss.logging</groupId>
        <artifactId>jboss-logging</artifactId>
        <version>3.3.0.Final</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.ejb/ejb-api -->
    <dependency>
        <groupId>javax.ejb</groupId>
        <artifactId>ejb-api</artifactId>
        <version>3.0</version>
        <scope>provided</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.0.2.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>3.0-alpha-1</version>
        <scope>provided</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/junit/junit -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.3</version>
    </dependency>
    <!-- ********************************************************************************************************** -->
    <!-- THE FOLLOWING ARE SEPERATE FROM HIBERNATE THAT IS USED TO CONNECT 
        TO DB, THESE ARE FOR USE WITH VALIDATION -->
    <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>6.0.7.Final</version>
        <exclusions>
            <exclusion>
                <artifactId>validation-api</artifactId>
                <groupId>javax.validation</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator-annotation-processor -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator-annotation-processor</artifactId>
        <version>6.0.7.Final</version>
                    <exclusions>
            <exclusion>
                <artifactId>validation-api</artifactId>
                <groupId>javax.validation</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator-cdi</artifactId>
        <version>6.0.7.Final</version>
                    <exclusions>
            <exclusion>
                <artifactId>validation-api</artifactId>
                <groupId>javax.validation</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>2.0.0.Final</version>
    </dependency>       
    <!-- ********************************************************************************************************** -->
    <!-- API and reference implementation of expression language {a.b} in html 
        code -->
    <!-- https://mvnrepository.com/artifact/javax.el/javax.el-api -->
    <dependency>
        <groupId>javax.el</groupId>
        <artifactId>javax.el-api</artifactId>
        <version>3.0.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.glassfish.web/javax.el -->
    <dependency>
        <groupId>org.glassfish.web</groupId>
        <artifactId>javax.el</artifactId>
        <version>2.2.6</version>
    </dependency>
</dependencies>

【问题讨论】:

  • 你执行mvn dependency:tree检查没有其他验证jar了吗?
  • 嗨 Ivan,我已经编辑了我的帖子以包含我的 maven 依赖树的图片(使用 eclipse 插件)。由此看来, javax.validation 不是传递依赖。知道可能出了什么问题吗?

标签: eclipse hibernate maven persistence.xml


【解决方案1】:

尝试将此依赖项添加到您的 pom.xml 中

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>

【讨论】:

  • 在 spring boot 2.0.3.RELEASE 中为我的项目修复了我的问题(与 OP 相同的错误消息)。
  • 我会添加,“并在 javaee-api 依赖项之前添加它”
【解决方案2】:

这种情况是由 javaee-web-api 7.0 作为依赖引起的:

<dependency>
  <groupId>javax</groupId>
  <artifactId>javaee-web-api</artifactId>
  <version>7.0</version>
  <scope>provided</scope>
</dependency>

您的 servlet 或应用程序容器在运行时提供的这种依赖关系为您提供了用于 javax.validation 的旧 api。

你有两件事要尝试:

javaee-web-api的版本改为8.0

如果您将 Web 应用程序部署到支持 Java EE 8.0 的 servlet 或应用程序容器,这是最快的解决方案(例如:它似乎在 Tomcat 8.5.X 中工作,但阅读文档,只有 Tomcat 9 支持Java EE 8)。

保持javaee-web-api为7.0并降级hibernate-validatorvalidation-api依赖:

<dependency>
  <groupId>javax.validation</groupId>
  <artifactId>validation-api</artifactId>
  <version>1.1.0.Final</version>
</dependency>

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-validator</artifactId>
  <version>5.4.2.Final</version>
</dependency>

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-validator-annotation-processor</artifactId>
  <version>5.4.2.Final</version>
</dependency>    

您还必须更改一些导入,例如 @Email@NotEmptyjavax.validation 包到 org.hibernate.validator.constraints(这些注释在 6.0.X hibernate-validator 版本中已弃用,因为它们包含在 javax.validation 中api)。

【讨论】:

    【解决方案3】:

    mvn dependency:tree,可能你有另一个使用hibernate-annotations的依赖,和你的spring版本冲突,你也可以找到它们并从类路径中排除,如下:

     <exclusions>
        <exclusion>
           <groupId>org.hibernate</groupId>
            <artifactId>hibernate-annotations</artifactId>
        </exclusion>
      </exclusions>
    

    希望能帮到你。

    【讨论】:

      【解决方案4】:

      Springboot 2.1.4.RELEASE 和一些 GeoTools 依赖项也有同样的问题。

      Validation-api 是从 javax.validation 和 javaee-api jar 中指定的。

      将它们作为依赖项,如下所示:

      <dependency>
          <groupId>javax.validation</groupId>
          <artifactId>validation-api</artifactId>
      </dependency>
      
      <dependency>
          <groupId>javax</groupId>
          <artifactId>javaee-api</artifactId>
          <version>7.0</version>
          <scope>provided</scope>
      </dependency>
      

      【讨论】:

        【解决方案5】:

        和jekho有同样的问题,但解决了:

        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-referencing</artifactId>
            <version>22.3</version>
            <exclusions>
                <exclusion>
                    <groupId>javax</groupId>
                    <artifactId>javaee-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        

        我通过在我的项目中使用 maven 的依赖项找到了哪个依赖项正在使用 javaee-api:树指出哪个依赖项正在使用哪些包。

        【讨论】:

        • 你是个传奇
        猜你喜欢
        • 2021-05-22
        • 2020-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多