【问题标题】:Error: com.google.common.cache.CacheBuilder.from(Lcom/google/common/cache/CacheBuilderSpec;)Lcom/google/common/cache/CacheBuilder; [duplicate]错误:com.google.common.cache.CacheBuilder.from(Lcom/google/common/cache/CacheBuilderSpec;)Lcom/google/common/cache/CacheBuilder; [复制]
【发布时间】:2017-12-08 15:20:22
【问题描述】:

使用 JPMML 库(使用 guava)时出现奇怪的运行时错误。

我在 pom.xml 中使用了 jpmml 相关的依赖项,如下所示

    <dependency>
        <groupId>org.jpmml</groupId>
        <artifactId>pmml-evaluator</artifactId>
        <version>1.3.6</version>
        </exclusions> 
    </dependency>

它开始抛出异常。然后我尝试如下。

    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>19.0</version>
    </dependency>
    <dependency>
        <groupId>org.jpmml</groupId>
        <artifactId>pmml-evaluator</artifactId>
        <version>1.3.6</version>
        <exclusions>
            <exclusion>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
            </exclusion>
        </exclusions> 
    </dependency>

我尝试使用 11.x/12.x/​​15.x/18.x/19.x/20.x 版本的 guava 但我仍然面临同样的异常。我浏览了谷歌,人们使用了 guava-19.0 版本,它对他们有用,但我无法做到这一点。谁能告诉我我错过了什么。

请在下面找到完整的堆栈跟踪。

java.lang.NoSuchMethodError: com.google.common.cache.CacheBuilder.from(Lcom/google/common/cache/CacheBuilderSpec;)Lcom/google/common/cache/CacheBuilder;
    at org.jpmml.evaluator.CacheUtil.newCacheBuilder(CacheUtil.java:97)
    at org.jpmml.evaluator.CacheUtil.buildLoadingCache(CacheUtil.java:90)
    at org.jpmml.evaluator.ModelEvaluator.<clinit>(ModelEvaluator.java:660)
    at org.jpmml.evaluator.ModelEvaluatorFactory.newModelEvaluator(ModelEvaluatorFactory.java:80)
    at org.jpmml.evaluator.ModelEvaluatorFactory.newModelEvaluator(ModelEvaluatorFactory.java:66)
.....
.....

【问题讨论】:

  • 你确定你没有在你的 POM 的其他地方引入一个非常旧的版本(12.0 之前)的 Guava?可能是某种传递依赖?
  • 我确认我没有使用任何其他版本的番石榴库。
  • 你试过mvn dependency:tree -Dverbose | grep guava之类的吗?
  • 得到这样的输出。 $ mvn 依赖:树 -Dverbose | grep guava [INFO] +- com.google.guava:guava:jar:19.0:compile [INFO] | +- (com.google.guava:guava:jar:11.0.2:provided - 因与 19.0 冲突而省略) [INFO] | | \- (com.google.guava:guava:jar:16.0.1:provided - 因与 19.0 冲突而省略) [INFO] | | \- (com.google.guava:guava:jar:16.0.1:provided - 因与 19.0 冲突而省略) [INFO] | | \- (com.google.guava:guava:jar:16.0.1:provided - 因与 19.0 冲突而省略) [INFO] | | +- (com.google.guava:guava:jar:11.0.2:provided - 因与 19.0 冲突而省略)
  • 看起来不错。您正在使用 11.0.2 版本,但它似乎被正确省略了,所以它应该可以工作。弄清楚是什么包将其拉入并尝试在那里添加excusion...

标签: java maven pom.xml pmml


【解决方案1】:

看起来你在 maven pom 中有正确的版本,但在运行时它会选择旧版本,请确保它在运行时选择正确的版本。检查数据节点上的类路径。

【讨论】:

  • 我正在使用 cloudera hadoop,class_path 由 cloudera 本身提供给数据节点。我认为我们应该在 pom 中做一些设置来选择代码需要使用哪个版本的 jar (guava)。
  • 在这种情况下,我将创建一个包含所有依赖项的 Uber jar。
  • 现在可以了。我使用了这段代码。 conf.setBoolean(MRJobConfig.MAPREDUCE_JOB_USER_CLASSPATH_FIRST, true);
猜你喜欢
  • 1970-01-01
  • 2018-02-12
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 2018-11-07
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多