“ NoClassDefFoundError:javax / inject / Provider”即使包含javax.inject依赖项,

时间:2018-07-09 20:31:43

标签: java dependency-injection guice grizzly

升级了某些Glassfish / Grizzly依赖关系(为了与Azure的SDK IOT设备客户端的最新版本兼容)之后,由于com.google.common.EventBus不再存在,我开始收到错误消息。添加依赖项:

<dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>15.0</version>
</dependency>

解决了该问题,它能够在IntelliJ中本地运行。但是,当我将已编译为.asp的.deb文件部署到Raspberry Pi时,它开始产生错误:

  

java.lang.NoClassDefFoundError:javax / inject / Provider           在com.google.inject.internal.MoreTypes.canonicalizeForKey(MoreTypes.jav   a:81)           com.google.inject.Key。(Key.java:119)           在com.google.inject.Key.get(Key.java:212)           在com.google.inject.spi.Elements $ RecordingBinder.bind(Elements.java:262   )           在com.google.inject.internal.InjectorShell $ RootModule.configure(InjectorShell.java:276)           在com.google.inject.spi.Elements $ RecordingBinder.install(Elements.java:223)           在com.google.inject.spi.Elements.getElements(Elements.java:101)           在com.google.inject.internal.InjectorShell $ Builder.build(InjectorShell.java:133)           在com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:103)           在com.google.inject.Guice.createInjector(Guice.java:95)           在com.google.inject.Guice.createInjector(Guice.java:72)           在com.google.inject.Guice.createInjector(Guice.java:62)           com.infusion.empm.Main.main(Main.java:32)上的原因:java.lang.ClassNotFoundException:javax.inject.Provider           在java.net.URLClassLoader $ 1.run(URLClassLoader.java:366)

我在很多地方都读到了添加依赖项

<dependency>
            <groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
            <version>1</version>
</dependency>

应该解决此问题(我已经将guice和javax-servlet-api依赖项引用为here),但没有任何效果。当我这样做时,结果是两个javax.inject jars(另一个生成的jar似乎可以解释为什么我不需要显式添加版本1使其在本地运行):

  

javax.inject-2.5.0-b42.jar

     

javax.inject-1.jar

Someone else here在有两个jar时使用了排除项,但是即使我相应地更改了hk2依赖关系,两个jar仍然存在。我还听说添加javax.ws.rs-api应该会有所帮助,但这已经存在。 Java代码中的导入直接引用com.google.inject.Provider,因此我认为不需要调用guicify将JSR-330提供程序转换为Guice提供商。用“ java.inject”替换本地代码中的每个“ com.google.inject”导入都会导致相同的确切行为,因此它必须是引用Google代码的依赖项,从而导致无法找到javax。

1 个答案:

答案 0 :(得分:0)

事实证明,原因是Pi上的脚本将类路径中的jar硬编码。