Guice、Peaberry 和 ServletModule

Posted

技术标签:

【中文标题】Guice、Peaberry 和 ServletModule【英文标题】:Guice, Peaberry and ServletModule 【发布时间】:2012-08-16 19:13:08 【问题描述】:

我在将 Peaberry/Guice/OSGi/Servlets 放置好时遇到问题。首先,我一直在将基于 Jetty、WAR 部署的 webapp 迁移到 OSGi 以利用插件架构。我原来的应用程序到处都在使用 guice。

我已将所有内容分解为模块并使用 Maven 进行构建。除了 ServletModule 的烦人安装之外,一切似乎都在工作。

我在尝试安装 ServletModule 时收到以下异常:

java.lang.NoClassDefFoundError: com/google/inject/internal/util/$Preconditions
    at com.google.inject.servlet.ServletModule.configure(ServletModule.java:44)
at com.google.inject.AbstractModule.configure(AbstractModule.java:59)
at com.google.inject.spi.Elements$RecordingBinder.install(Elements.java:223)
at com.google.inject.AbstractModule.install(AbstractModule.java:118)
at com.payplum.CoreActivator$CoreImportModule.configure(CoreActivator.java:145)
at com.google.inject.AbstractModule.configure(AbstractModule.java:59)
at com.google.inject.spi.Elements$RecordingBinder.install(Elements.java:223)
at com.google.inject.spi.Elements.getElements(Elements.java:101)
at com.google.inject.internal.InjectorShell$Builder.build(InjectorShell.java:133)
at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:103)
at com.google.inject.Guice.createInjector(Guice.java:95)
at com.google.inject.Guice.createInjector(Guice.java:72)
at com.google.inject.Guice.createInjector(Guice.java:62)
at com.payplum.CoreActivator.start(CoreActivator.java:53)
at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:645)

所以我不太清楚为什么找不到这些捆绑包。我已经添加了 guice-servlet 依赖项,并验证了它是否正在我部署的包中。

我想另一个重要的部分是注册 GuiceFilter。我使用 ServiceTracker 来获取 ExtHttpService,因为我使用的是 Jetty。当该 Tracker 返回时,我使用典型调用添加注册它

service.registerFilter( this.guiceFilter, "/*", null, 0, null );

这似乎工作正常。我真的很难让这些东西正常工作,而且我有点夹在 Guice/OSGi/Peaberry 部分之间。非常感谢任何帮助。

谢谢!

【问题讨论】:

【参考方案1】:

异常意味着您的类路径中缺少一个类,因此您要么缺少一个 jar,要么其中一个 jar(令人惊讶)不包含其所需的类。检查最终战争文件中包含的 JAR,例如使用 'jar -tf thejar.jar' 判断它们是否包含 $Preconditions 类。

【讨论】:

所以我永远无法弄清楚这一点。基本上,我认为存在某种可见性问题。为了解决这个问题,我必须将 Guice lib 添加到 felix 根目录,方法是在 felix/conf 文件的 config.properties 文件中添加:org.osgi.framework.system.packages.extra=com.google.inject.servlet。它解决了这个问题,但我不太确定如何/为什么。

以上是关于Guice、Peaberry 和 ServletModule的主要内容,如果未能解决你的问题,请参考以下文章

使用 Guice 实现 Restlet

Guice、JDBC 和管理数据库连接

Guice 和 Servlet - 一般理解问题?

Guice绑定和FactoryModuleBuilder

Guice合成方法警告

玩 2.5 剪影 4 - 带有 guice 的 DI