【问题标题】:Java import from root of jar从 jar 的根目录导入 Java
【发布时间】:2014-07-21 18:55:41
【问题描述】:

我为我的库项目使用了 17 版本的 Guava,并将其解压缩到 jar 中。其他项目使用我的库,但它也有一个更旧版本的 Guava。当我尝试运行应用程序时,它会忽略新的 Guava 并导致类似的错误

java.lang.NoSuchMethodError: com.google.common.cache.CacheBuilder.maximumSize(J)Lcom/google/common/cache/CacheBuilder;

如何强制我的项目使用新的 Guava 和应用程序使用旧的?

【问题讨论】:

  • 为项目正确设置类路径。
  • 将 guava 17 放在类路径中其他版本的 guava 之前。

标签: java maven guava


【解决方案1】:

我假设您的项目和应用程序是不同的实体。此外,按项目,我假设您指的是 Eclipse/IntelliJ/Netbeans 项目

您需要分别为项目和应用程序设置正确的类路径。

如果您使用 IDE 调试您的项目,您的项目需要包含您下载的新 JAR。每个 IDE 都有自己的机制来将依赖项添加到项目的类路径中,因此您需要参考与该 IDE 相关的文档。

对于您的应用程序,您可以使用 java MyApp -cp "path to the old JAR" 启动它。如果您将应用程序打包为 JAR,请确保您打包的是旧版本的 Guava。

希望这会有所帮助。

根据与问题所有者的讨论进行编辑

这里的查询类似于这个SO query。因此解决此问题的正确方法是安装自定义类加载器或使用 OSGi

【讨论】:

  • 不完全。主应用程序包含旧的番石榴,它支持插件,我使用我的库为它制作了一个插件,该库也包含番石榴但更新版本。
  • @TeroBlaZe 那么您是否尝试过 Natan Cox 将 Guava 17 放在类路径中旧版本之前的建议?
  • 不,因为我没有使用类路径来运行应用程序。编译后的“主应用程序”在内部提取了所有依赖项,当我将我的库与插件中相同但更新的依赖项连接时,正在运行的应用程序会忽略本地番石榴并使用应用程序具有的。例如:Application using: [Guava old, GSON, etc..] <=> Plugin using: [ MyLib using: [Guava new] ]
  • @TeroBlaZe 表示你在项目中使用了同一个库的两个版本。检查此处提到的解决方案是否对您有帮助 - stackoverflow.com/questions/1553567/…。然后我会更新我的答案
  • @TeroBlaZe 根据此处的查询:stackoverflow.com/questions/7240529/…,您已进入“JAR 地狱”。建议的一种可能方法是使用类似 jarjar 的工具:code.google.com/p/jarjar 重命名包
猜你喜欢
  • 2018-12-09
  • 2017-06-26
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
相关资源
最近更新 更多