在我们在评论中进行对话之后,我决定继续在本地构建一个简单的“hello world”,看看我是否可以重现这个问题。我不得不经历一些箍,但不是你描述的那个。我现在想知道您的类路径中是否有任何冲突版本的码头库。例如,请看这里的这个问题。为了以防万一,我不得不处理与 GWT 托管模式、类加载和 Hibernate 相关的其他一些问题(这里,更多,更多)。现在一切都清楚了,我的简单示例正在运行。
回到你的情况。查看修补过的 Jetty 启动器,我发现 GWT 对 Jetty 的日志记录子系统做了什么。看看JettyTreeLogger
内部类。它将所有INFO
及以下发送到SPAM
. 除非您使用日志级别运行 GWT 应用程序,否则您SPAM
不会看到诊断案例所需的“宝贵”Jetty 输出。因此,在运行配置(GWT 选项卡)中打开垃圾邮件日志级别,或者进一步修补已经修补的启动器,以免吞下 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
ASessionFactory
已成功实例化、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
. 不过这似乎无关紧要。
你能告诉我你说的到底是什么意思吗
@ 不同版本:项目类路径:WEB-INF/lib 中的 6.1.26 但 6.1.11
我想确保类路径不是问题,并且我们在运行时没有多个码头 JAR 冲突。请分享您的.classpath
项目文件以及WEB-INF/lib
.
更新 2我发现您的日志文件中的事件顺序与我的不同。我会切入正题。
在码头 6.1.11 中:
public void configureWebApp() throws Exception
{
//create a java:comp/env
createEnvContext();
//add java:comp/env entries for any globally defined EnvEntries
bindGlobalEnvEntries();
//set up java:comp/env as the Context in which to bind directly
//the entries in jetty-env.xml
NamingEntry.setScope(NamingEntry.SCOPE_LOCAL);
//check to see if an explicit file has been set, if not,
//look in WEB-INF/jetty-env.xml
....
}
在 Jetty 6.1.26 中:
public void configureWebApp() throws Exception
{
//check to see if an explicit file has been set, if not,
//look in WEB-INF/jetty-env.xml
...
}
并将创建上下文移至:
public void configureDefaults() throws Exception
{
//create a java:comp/env
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
.