在我们在评论中的交谈之后,我决定继续构建一个简单的“hello world”本地应用程序,以查看是否可以重现该问题。我必须经历一些麻烦,但不是你描述的那种。 我现在想知道您的类路径上是否有任何冲突版本的jetty库。例如,请参阅这里的问题。以防万一,我还必须处理与GWT托管模式、类加载和Hibernate相关的其他问题(这里,更多,更多)。现在一切都清楚了,我的简单示例正在运行。
回到您的情况。通过查看已修补的Jetty启动器,我弄清了GWT对Jetty日志子系统的影响。请看内部类JettyTreeLogger。它将所有INFO及以下级别的日志发送到SPAM。除非您使用SPAM日志级别运行GWT应用程序,否则您将无法看到需要诊断您的情况所需的“宝贵”Jetty输出。因此,请在运行配置(GWT选项卡)中打开SPAM日志级别,或者进一步修补已修补的启动器以不吞噬Jetty日志消息。
按照设置自己的Jetty Launcher并使用SPAM日志级别运行GWT的步骤后,我能够在控制台中看到以下内容:
...
Created java:comp/env for webapp /
Finding global env entries
...
parse: file:/.../JettyHibernateExample/war/WEB-INF/jetty-env.xml
...
loaded class com.mysql.jdbc.jdbc2.optional.MysqlDataSource from ContextLoader@null
XML new class com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource
...
XML new class org.mortbay.jetty.plus.naming.Resource
...
Looking up name="jdbc"
Looking up binding for jdbc for context=env
...
Subcontext jdbc created
Adding binding with key=nndb obj=Reference Class Name: com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource
它成功地解析了配置并正确地绑定了创建的对象。在日志中进一步查看:
May 30, 2012 5:27:33 PM org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: /hibernate.cfg.xml
...
DEBUG org.hibernate.cfg.Configuration -
hibernate.connection.datasource=java:comp/env/jdbc/nndb
...
DEBUG org.hibernate.internal.SessionImpl - Opened session at timestamp
DEBUG org.hibernate.internal.SessionImpl - Disconnecting session
DEBUG o.h.e.j.i.LogicalConnectionImpl - Releasing JDBC connection
成功实例化了一个SessionFactory
,打开并随后断开了Session
。我没有进一步测试它,因为我认为从这里开始一切都很好。
这是我在WEB-INF/lib
中拥有的依赖项列表:
antlr-2.7.7.jar
dom4j-1.6.1.jar
gwt-servlet.jar
hibernate-commons-annotations-4.0.1.Final.jar
hibernate-core-4.1.3.Final.jar
hibernate-jpa-2.0-api-1.0.1.Final.jar
hibernate-validator-4.1.0.Final.jar
javassist-3.15.0-GA.jar
jboss-logging-3.1.0.GA.jar
jboss-transaction-api_1.1_spec-1.0.0.Final.jar
jetty-naming-6.1.11.jar
jetty-plus-6.1.11.jar
logback-classic-1.0.1.jar
logback-core-1.0.1.jar
mysql-connector-java-5.1.20-bin.jar
report
slf4j-api-1.6.4.jar
validation-api-1.0.0.GA.jar
我希望你打开日志后能够看到问题所在。如果需要进一步的帮助,请随时分享它以供我们查看。
更新 现在有了您的日志文件进行检查,我将开始提出更多建议。我注意到的第一件事是,您的web.xml
似乎没有遵循元素的DTD顺序。您的resource-ref
应该在servlet
、servlet-mapping
和welcome-file-list
之后。不过这似乎并不重要。
当您说
@ different versions: project classpath: 6.1.26 but 6.1.11 in WEB-INF/lib
时,您能否告诉我确切的意思?我想确保类路径不是问题,并且我们在运行时没有多个Jetty JAR发生冲突。请与WEB-INF/lib
中的所有内容一起分享您的.classpath
项目文件。
更新2 我发现您的日志文件和我的事件顺序有所不同。我会直接切入主题。
在Jetty 6.1.11中:
public void configureWebApp() throws Exception
{
createEnvContext();
bindGlobalEnvEntries();
NamingEntry.setScope(NamingEntry.SCOPE_LOCAL);
....
}
在Jetty 6.1.26中:
public void configureWebApp() throws Exception
{
...
}
创建上下文已移至:
public void configureDefaults() throws Exception
{
createEnvContext();
}
它没有设置SCOPE_LOCAL
。没有SCOPE_LOCAL
,根上下文就不是应该是java:comp/env
。在6.1.26(plus
和naming
)中运行,我现在可以看到“有问题的”:
Looking up binding for __ for context=null
话虽如此,它仍然可以正常工作。那个“范围”逻辑现在必须存在于其他地方,只要您拥有6.1.26(并且没有来自早期版本的任何冲突类),它应该可以正常工作。您的代码中可能会出现以下内容:
Looking up name="__/jdbc/nndb"
Looking up binding for __ for context=null
InitialContextFactory.getInitialContext()
Created initial context delegate for local namespace:org.mortbay.naming.local.localContextRoot@237c8a9c
InitialContextFactory.getInitialContext()
Created initial context delegate for local namespace:org.mortbay.naming.local.localContextRoot@457019f7
Looking up name="Server@1c9e8392/__/javax.sql.DataSource/default"
我有:
Looking up name="__/jdbc/nndb"
Looking up binding for __ for context=null
Looking up name="jdbc/nndb"
Looking up binding for jdbc for context=__
Looking up name="nndb"
Looking up binding for nndb for context=jdbc
InitialContextFactory.getInitialContext()
Created initial context delegate for local namespace:org.mortbay.naming.local.localContextRoot@1830f66
>>> new root context requested
Looking up name="comp/env"
Looking up binding for comp for context=null
Using classloader of current org.mortbay.jetty.handler.ContextHandler
Looking up name="env"
Looking up binding for env for context=comp
Binding java:comp/env/jdbc/nndb to jdbc/nndb
话虽如此,整理一下您的类路径,并确保您正在运行6.1.11或6.1.26版本,而不是两个版本混合。这应该会解决问题。还有一件事,请确保您不要将任何自定义JNDI内容(例如对象工厂)带到WEB-INF/classes
中。
jetty-naming
和jetty-plus
的JAR文件放置在WEB-INF/lib
目录下,我想知道你的jetty-env.xml
是否被“构建”了 - 请验证它是否被复制到您的bin
目录中,以便项目可以成功启动? - Pavel Vellerorg.mortbay.jetty.plus.webapp.EnvConfiguration
。我希望能够获得您的项目代码以进行测试。也许您可以在Dropbox上上传一个简化版本? - Pavel Veller