从jar根目录导入Java

从jar根目录导入Java,java,maven,guava,Java,Maven,Guava,我在我的库项目中使用了17个版本的Guava,并将其解压缩到jar中。其他项目使用我的库,但它也有一个更旧的版本的番石榴。当我尝试运行应用程序时,它会忽略新的Guava并导致如下错误 java.lang.NoSuchMethodError:com.google.common.cache.CacheBuilder.maximumSize(J)Lcom/google/common/cache/CacheBuilder 如何强制我的项目使用新的Guava和应用程序来使用旧的?我假设您的项目和应用程序是

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

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


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

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

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

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

对于您的应用程序,您可以将其作为JavaMyApp-cp“旧JAR的路径”启动。如果将应用程序打包为JAR,请确保打包的是较旧版本的Guava

希望这有帮助

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


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

为项目正确设置类路径。在类路径中将guava 17放在guava的其他版本之前。不完全是这样。主应用程序包含旧的guava,并且支持插件,我已经使用我的库为它制作了一个插件,该库也包含guava,但版本较新。@Terobalze那么你是否尝试过Natan Cox的建议,在类路径中将guava 17放在旧版本之前?没有,因为我没有使用类路径来运行应用程序。编译后的“主应用程序”中提取了所有依赖项,当我将我的库与插件中相同但较新的依赖项连接时,运行的应用程序将忽略本地番石榴,并使用应用程序所具有的依赖项。例如:
应用程序使用:[Guava old,GSON,etc..]插件使用:[MyLib using:[Guava new]]]
@teroblase这意味着您在项目中使用同一库的两个版本。检查此处提到的解决方案是否有助于您-。然后我会更新我的answer@TeroBlaZe根据这里的查询:,您已经进入了一个“JAR地狱”。建议的一种可能的方法是使用类似jar的工具:这将重命名包