GWT Jetty JNDI查找失败。

4

我正在使用GWT和Jetty,但想要使用JNDI来获取数据源,因此按照Eclipse GWT Jetty JNDI的文档进行了以下操作来运行我的GWT应用程序:

在Eclipse中使用以下选项运行我的GWT应用程序:

 -noserver 
-remoteUI "${gwt_remote_ui_server_port}:${unique_id}"
-startupUrl myapp.html
-logLevel INFO 
-codeServerPort 9997
-war war\location 
-server com.myproject.MyCustomJettyLauncher 
com.my.apps.app

我的jetty-env.xml文件在WEB-INF下的配置

<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "
http://jetty.mortbay.org/configure.dtd">
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
 <New id="MSSQLDS" class="org.mortbay.jetty.plus.jndi.Resource">
    <Arg></Arg>
    <Arg>jdbc/MSSQLDS</Arg>
    <Arg>
     <New class="net.sourceforge.jtds.jdbcx.JtdsDataSource">
                 <Set name="User">dbuser</Set>
                 <Set name="Password">pwd</Set>
                 <Set name="DatabaseName">mydatabase</Set>
                 <Set name="ServerName">localhost</Set>
                 <Set name="PortNumber">1433</Set>

     </New>
    </Arg>
   </New>
</Configure>  

当我运行我的应用程序时,我会收到以下错误信息。
Starting Jetty on port 8888
   [WARN] Failed startup of context com.healthfortis.MyCustomJettyLauncher$WebAppContextWithReload@2ed7c530{/,C:\workspace\hf-src\src\main\webapp}
javax.naming.NameNotFoundException; 

剩余名称为'java:comp'。
    at org.mortbay.naming.NamingContext.lookup(NamingContext.java:578)
    at org.mortbay.naming.NamingContext.lookup(NamingContext.java:680)
    at org.mortbay.naming.local.localContextRoot.lookup(localContextRoot.java:164)
    at javax.naming.InitialContext.lookup(InitialContext.java:392)
    at org.mortbay.jetty.plus.webapp.EnvConfiguration.createEnvContext(EnvConfiguration.java:51)
    at org.mortbay.jetty.plus.webapp.EnvConfiguration.configureWebApp(EnvConfiguration.java:103)
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1217)
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:513)
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448)
    at com.healthfortis.MyCustomJettyLauncher$WebAppContextWithReload.doStart(MyCustomJettyLauncher.java:459)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39)
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
    at org.mortbay.jetty.Server.doStart(Server.java:222)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39)
    at com.healthfortis.MyCustomJettyLauncher.start(MyCustomJettyLauncher.java:660)
    at com.google.gwt.dev.DevMode.doStartUpServer(DevMode.java:494)
    at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:1058)
    at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:800)
    at com.google.gwt.dev.DevMode.main(DevMode.java:304)

看起来eclipse/jetty无法找到JNDI数据源..有任何建议吗?

请查看此处的另一个线程:https://dev59.com/qEvSa4cB1Zd3GeqPfIrU - Piyush Mattoo
设置JNDI并在嵌入式Jetty中使用数据源并不容易,但对我来说可行。 我在这个答案 中发布了一些概述,希望能对你有所帮助。 - Chris Lercher
谢谢您的评论。事实上,我正在遵循您提到的链接,如果您看到,我有自己的customjetty luancher,出现了上述错误。 - su jyo
1.) 你有 jndi.properties 文件吗?(或者,你可以添加命令行参数 -Djava.naming.factory.initial=org.mortbay.naming.InitialContextFactory) 2.) 你也在 web.xml 中定义了 <resource-ref> 吗? - Chris Lercher
我应该把jndi.properties放在哪里?是的,我用了-D vm选项,但没有改善。我在想可能是我缺少一些类路径设置,请问您有什么想法吗?我的类路径中已经包含jettyplus jars、jettynaming jar,还需要更多吗? - su jyo
1个回答

4
上述配置存在两个问题:
  • run选项中的-noserver是用来禁用Jetty运行的,它用于在外部服务器(如Tomcat等)上运行Web应用程序。在GWT开发模式下运行Web应用程序时,不需要使用此选项来在内嵌的Jetty服务器上运行。
  • 在jetty-web.xml文件中,将<Arg>jdbc/MSSQLDS</Arg>更改为<Arg>java:/comp/env/jdbc/MSSQLDS</Arg>
在GWT开发模式下设置JNDI数据源以在内嵌的Jetty服务器上运行的步骤如下(我以mysql数据源为例,但对于其他数据源步骤相同):
  • 如下截图所示,将jetty-naming-*.jar、jetty-plus-*.jar添加到项目构建路径中。Jetty lib可在/usr/share/jetty/lib中找到。在生产中可以使用其他Web服务器如Tomcat,它们没有添加到WEB-INF/lib目录中。如果Jetty也用于生产环境,则可以将它们添加到WEB-INF/lib目录中。
  • Add jetty-web.xml with following content to WEB-INF directory

    <Arg>java:/comp/env/jdbc/dev</Arg>
    <Arg>
        <New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
            <Set name="Url">jdbc:mysql://localhost:3306/dev?autoReconnect=true
            </Set>
            <Set name="User">dev</Set>
            <Set name="Password">dev</Set>
        </New>
    </Arg>
    

  • 将GWT项目作为Web应用程序运行时,您会遇到javax.naming.NoInitialContextException

  • 要纠正这个问题,请转到“Run Configurations”并打开应用程序的运行配置。选择“Arguments”选项卡,并在VM Arguments中添加以下行:

    -Djava.naming.factory.initial=org.mortbay.naming.InitialContextFactory

运行配置的屏幕截图


enter image description here


保存设置并在开发模式下启动Web应用程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接