【问题标题】:NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;J)VNoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;J)V
【发布时间】:2017-12-28 01:38:12
【问题描述】:

哪些 Google Maven 依赖项可以修复此错误:

java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;J)V
    at com.google.cloud.storage.spi.v1.HttpStorageRpc.read(HttpStorageRpc.java:487)
    at com.google.cloud.storage.BlobReadChannel$1.call(BlobReadChannel.java:127)
    at com.google.cloud.storage.BlobReadChannel$1.call(BlobReadChannel.java:124)
    at com.google.api.gax.retrying.DirectRetryingExecutor.submit(DirectRetryingExecutor.java:94)
    at com.google.cloud.RetryHelper.runWithRetries(RetryHelper.java:54)
    at com.google.cloud.storage.BlobReadChannel.read(BlobReadChannel.java:124)
    at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:65)
    at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:109)
    at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:103)
    at java.io.InputStream.read(InputStream.java:101)

代码:

Blob blob = storage.get(blobId);
if(blob.exists()) {
    return true;
}

【问题讨论】:

  • 你的类路径中有多个版本的 Guava。找出哪些依赖项依赖于 Guava,并确保只保留一个版本。

标签: java maven google-cloud-platform google-cloud-storage


【解决方案1】:

您的 Google guava 版本太旧(

使用

mvn dependency:tree | less

寻找番石榴版本。

【讨论】:

  • @Karl Richter,如果我们认为库之间存在冲突,应该如何以及在哪里定义 guava?可以覆盖番石榴只使用一个版本吗?
【解决方案2】:

请在项目的 POM 中添加以下依赖项:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>23.6-jre</version>
</dependency> 
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpcore</artifactId>
    <version>4.4.8</version>
</dependency>

【讨论】:

    【解决方案3】:

    我在我的 Java/Kotlin 应用程序中遇到了同样的问题。当应用程序通过 IntelliJ 运行时,没有任何问题。然而,当 .Jar 运行时,上面的错误信息被抛出。

    我找不到针对上述@Laurent Perez 定义的 Guava 问题的直接操作项,因此我执行了以下操作,解决了我的 .Jar 文件运行的问题:

    • 从 IntelliJ 中删除了 .Jar IntelliJ 配置和文件。然后在此部署指南中的 Step 3 之后重新添加 .Jar。

    如果上述方法不起作用,请尝试其他操作:

    • 重建项目。
    • 使 IntelliJ 缓存无效并重新启动。
    • 重新启动计算机。

    【讨论】:

    • 请不要让您的答案依赖于外部链接 - 复制相关部分,因为链接随时可能中断。
    【解决方案4】:

    尝试在包含项目的 pom.xml 中的依赖项顶部插入一个包含较新版本 guava 的依赖项。

    例如

      <dependency>
          <groupId>com.google.guava</groupId>
          <artifactId>guava</artifactId>
          <version>24.1.1-jre</version>
      </dependency>
    

    【讨论】:

    • 谢谢你,这真的很重要,我认为它不会:)
    【解决方案5】:

    就我而言,我碰巧包括了两者

        <dependency>
          <groupId>com.google.collections</groupId>
          <artifactId>google-collections</artifactId>
          <version>1.0</version>
        </dependency>
    

    和

        <dependency>
          <groupId>com.google.guava</groupId>
          <artifactId>guava</artifactId>
          <version>28.0-jre</version>
        </dependency>
    

    事实证明,我不能同时使用这两个库。删除 google-collections 为我解决了这个问题。

    【讨论】:

      【解决方案6】:

      对于遇到类似情况的任何人,我有以下 pom:

      <dependency>
          <groupId>org.apache.hadoop</groupId>
          <artifactId>hadoop-client</artifactId>
          <version>3.2.1</version>
      </dependency>
      <dependency>
          <groupId>org.json</groupId>
          <artifactId>json</artifactId>
          <version>20190722</version>
      </dependency>
      <dependency>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-shade-plugin</artifactId>
          <version>3.2.2</version>
      </dependency>
      

      并注释掉 maven-shade 插件为我修复了它...

      【讨论】:

        【解决方案7】:

        当您从依赖项中缺少番石榴库时会发生这种情况。在您的 pom.xml 中使用以下内容添加它

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>24.0-jre</version>
        </dependency>
        

        另一个原因可能是有多个版本的 google guava/collection 库,你不能同时拥有这两个版本,正如 @sabbir 在他的 comment 中提到的那样,你应该删除其中一个。

        最后可能是其他一些依赖项依赖于以前版本的 google guava/collections。转到 Dependency Hierarchy 并搜索 google 并查看所有依赖项都依赖于以前的版本。就我而言,它是由 version-maven-plugin 版本 2.7

        这里是version-maven-plugin,2.7版使用google collections 1.0,我需要guava 24.0 两者不能同时工作。

        我像这样在我的 pom.xml 中排除了它,然后添加了一个新的番石榴依赖项

            <dependency>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>versions-maven-plugin</artifactId>
                <version>2.7</version>
                <exclusions>
                    <exclusion>
                        <groupId>com.google.collections</groupId>
                        <artifactId>google-collections</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        
            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>24.0-jre</version>
            </dependency>
        

        结果:现在 google-collections 不见了。

        【讨论】:

          猜你喜欢
          • 2020-09-06
          • 1970-01-01
          • 2020-03-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-22
          相关资源
          最近更新 更多