【发布时间】:2018-12-17 14:40:45
【问题描述】:
升级一些 Glassfish/Grizzly 依赖项后(为了与最新版本的 Azure SDK IOT 设备客户端兼容),我开始收到错误消息,因为 com.google.common.EventBus 不再存在。添加依赖:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>15.0</version>
</dependency>
修复了这个问题,它能够在 IntelliJ 中本地运行。但是,当我部署编译到 Raspberry Pi 的 .deb 文件时,它开始产生错误:
java.lang.NoClassDefFoundError: javax/inject/Provider 在 com.google.inject.internal.MoreTypes.canonicalizeForKey(MoreTypes.jav 答: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>
应该解决这个问题(我已经有引用 here 的 guice 和 javax-servlet-api 依赖项),但它没有效果。当我这样做时,结果是两个 javax.inject jar(另一个正在生成的 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 提供程序。将本地代码中的每个“com.google.inject”导入替换为“java.inject”会导致完全相同的行为,因此它必须是引用 google 代码的依赖项,而这反过来又找不到 javax。
【问题讨论】:
标签: java dependency-injection guice grizzly