我正在将Intellij和Maven用于我的GAE Java项目。在Google Cloud Storage中从GcsService调用createOrReplace
时遇到一些奇怪的问题,这取决于我在项目中编辑单个文件。这是发生了什么:
我在Github上有一个稳定的修订版。我签出该修订并使用intellij配置来部署该应用程序。我的部署如下所示:全新安装和构建后,将执行以下命令:/Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home/bin/java -Dfile.encoding=UTF-8 -classpath /Users/me/.m2/repository/com/google/appengine/appengine-java-sdk/1.9.15/appengine-java-sdk/appengine-java-sdk-1.9.15/lib/appengine-tools-api.jar com.google.appengine.tools.admin.AppCfg [email protected] --passin --no_cookies update /Users/me/git/blunka/harry-gcp/module-ear/target/module-ear-1.0
然后,我将注释添加到特定的源文件。我重新部署,发现/target
下的一堆输出文件已更改。我的应用程序现在因以下错误而损坏:
java.lang.NoSuchMethodError: com.google.common.base.Stopwatch.createUnstarted()Lcom/google/common/base/Stopwatch;
at com.google.appengine.tools.cloudstorage.RetryHelper.runWithRetries(RetryHelper.java:156)
at com.google.appengine.tools.cloudstorage.GcsServiceImpl.createOrReplace(GcsServiceImpl.java:70)
我现在删除该评论并再次部署。我执行了
git status
,并注意到/target
下的某些更改文件不再存在。我的应用程序再次正常运行。当我查看修改后的类的反编译.class文件时,它们是相同的。这是我抛出错误的模块的dep树:
[INFO] +- com.google.api-client:google-api-client-appengine:jar:1.19.0:compile
[INFO] | \- com.google.api-client:google-api-client:jar:1.19.0:compile
[INFO] | \- com.google.guava:guava-jdk5:jar:13.0:compile
[INFO] +- com.google.appengine.tools:appengine-gcs-client:jar:RELEASE:compile
[INFO] | \- (com.google.guava:guava:jar:18.0:compile - omitted for duplicate)
[INFO] +- com.google.guava:guava:jar:18.0:compile
[INFO] \- com.googlecode.objectify:objectify:jar:5.1.1:compile
[INFO] \- (com.google.guava:guava:jar:17.0:compile - omitted for conflict with 18.0)
我有几个问题:
为什么注释会导致我的输出文件更改?
即使已反编译的源代码相同,为什么注释中更改的输出文件也会导致应用程序行为发生变化?
如果番石榴(google.common.base)发生碰撞,该如何解决?
我怎样才能防止将来发生这种情况?
最佳答案
很抱歉“窃取”答案,但是@ ben-manes在他的评论中是正确的。我遇到了同样的问题,他的最后一条信息对我有所帮助。我只想以此作为答案,因为不是每个人都通过评论来寻找。
google-api-client取决于guava-jdk5,它与guava-18 +产生冲突,由appengine-gcs-client使用
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client-appengine</artifactId>
<version>1.20.0</version>
<exclusions>
<!-- creates conflicts with another guava version in appengine-gcs-client -->
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava-jdk5</artifactId>
</exclusion>
</exclusions>
</dependency>