在我们谈话后,我决定继续在本地建立一个简单的“你好世界”,看看我能否重现这个问题。我不得不经过一些环节,但不是你所描述的。 我现在想知道在你的类路径上是否有任何冲突版本的码头库。例如,看this question here。以防万一,我不得不处理与GWT托管模式,类加载和休眠相关的其他问题(here,more,some more)。 现在很清楚,我的简单例子是。
回到你的情况。通过修补的Jetty发射器,我想到了GWT为Jetty的日志子系统做了什么。看看JettyTreeLogger
内部类。它发送所有INFO
及以下至SPAM
。除非你运行的日志级别为SPAM
的GWT应用程序,否则您将看不到需要诊断您的案例的“宝贵”Jetty输出。因此,在运行配置(GWT选项卡)中打开SPAM日志级别,或者替换已修补的启动程序以进一步不吞入Jetty日志消息。
已经按照步骤来建立我自己的码头启动,并与日志级别的垃圾邮件,我能够在控制台看到以下运行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 [email protected]
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
希望与日志功能后,您会看到最终的方式是什么鬼。如果您需要进一步的帮助,请随时分享给我们。
UPDATE现在有您的日志文件来检查我会开始提出更多的建议。我注意到的第一件事是你的web.xml
似乎没有遵循元素的DTD顺序。您的resource-ref
应该跟在servlet
,servlet-mapping
和welcome-file-list
之后。这似乎并不重要。
能否请你告诉我,究竟你的意思是,当你说
@不同的版本:项目的类路径:6.1.26,但在6.1.11 WEB-INF/lib目录
我想确保类路径不是问题,并且我们没有多个jetty JAR在运行时发生冲突。请分享您的.classpath
项目文件以及WEB-INF/lib
中的完整列表。
UPDATE 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
....
}
而在码头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:[email protected]
InitialContextFactory.getInitialContext()
Created initial context delegate for local namespace:[email protected]
Looking up name="[email protected]/__/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:[email protected]
>>> 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
这就是说,挺直你的classpath并确保您是运行的6.1.11的或6.1.26,而不是混合两个。它应该这样做。还有一件事。确保你不带WEB-INF/classes
任何自定义的JNDI东西(如对象工厂)。
你在哪里尝试实例化PoolDataSource?客户端或服务器端? – Johanna
我不会尝试在我的代码中实例化MysqlConnectionPoolDataSource。据我了解这是如何工作的,我认为* Jetty应该在启动服务时实例化WebAppContext,Resource和MysqlConnectionPoolDataSource本身。我认为这是在服务器端完成的。 –
假设你遵循了启动教程的信件,并且在你的'WEB-INF/lib'中有'jetty-naming'和'jetty-plus' jar我想知道你的'jetty-env.xml'是否得到了“内置“ - 你可以验证它被复制到你的'bin'目录当项目建成并准备启动? –