OpenLiberty NameNotFoundException:java:/ comp / env

时间:2018-03-15 15:05:14

标签: websphere websphere-liberty open-liberty

我有一个正确运行在Tomcat中的Web应用程序,我希望在新的OpenLiberty服务器上运行,该应用程序在OpenLiberty中正确启动,但在数据库连接启动时抛出以下异常:

[Default Executor-thread-15] 2018-03-15 15:02:30 ERROR TomcatConnectionManager:41 - Loading jdbc/mysql/myaap failure
javax.naming.NameNotFoundException: java:/comp/env
    at com.ibm.ws.jndi.url.contexts.javacolon.internal.JavaURLName.<init>(JavaURLName.java:83)
    at com.ibm.ws.jndi.url.contexts.javacolon.internal.JavaURLNameParser.parse(JavaURLNameParser.java:39)
    at com.ibm.ws.jndi.url.contexts.javacolon.internal.JavaURLNameParser.parse(JavaURLNameParser.java:60)
    at com.ibm.ws.jndi.url.contexts.javacolon.internal.JavaURLContext$NameUtil.<init>(JavaURLContext.java:474)
    at com.ibm.ws.jndi.url.contexts.javacolon.internal.JavaURLContext.lookup(JavaURLContext.java:321)
    at com.ibm.ws.jndi.url.contexts.javacolon.internal.JavaURLContext.lookup(JavaURLContext.java:370)
    at org.apache.aries.jndi.DelegateContext.lookup(DelegateContext.java:161)

在查找阶段抛出上述异常:

Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:/comp/env");

有没有什么方法可以让它在OpenLiberty上进行更少的更改?

2 个答案:

答案 0 :(得分:3)

在OpenLiberty上,等效查找将如下所示:

    Context initContext = new InitialContext();
    Context envContext = (Context) initContext.lookup("java:comp/env");

关键是您需要使用java:comp/...而不是java:/comp/...

Tomcat与Liberty不同的原因是因为Tomcat只是一个servlet容器而Liberty符合完整的Java EE规范。

根据EE.5.2.2 of the Java EE 7 spec部分:

  

应用程序组件的命名环境由四个逻辑组成   名称空间,表示具有不同范围的命名环境。四个   名称空间是:

     
      
  • java:comp - 此命名空间中的名称是每个组件(例如,每个企业   豆)。除了Web模块中的组件之外,每个组件都会获得   它自己的java:comp命名空间,不与任何其他组件共享。组件   在Web模块中没有自己的私有组件命名空间。   见下面的注释。
  •   
  • java:module - 此命名空间中的名称由a中的所有组件共享   模块(例如,单个EJB模块中的所有企业bean或所有组件   在网络模块中)。
  •   
  • java:app - 此命名空间中的名称由所有模块中的所有组件共享   在单个应用程序中,“单个应用程序”表示单个部署   单元,例如单个ear文件,单独部署的单个模块等。   例如,同一个ear文件中的war文件和EJB jar文件都有   访问java:app namespace中的资源。
  •   
  • java:global - 此命名空间中的名称由部署的所有应用程序共享   在应用程序服务器实例中。请注意,应用程序服务器实例   可以表示单个服务器,服务器群集,管理   域包含许多服务器,甚至更多。申请的范围   服务器实例依赖于产品,但必须可以部署多个   应用程序到单个应用程序服务器实例。
  •   

答案 1 :(得分:0)

WebSphere和Tomcat之间也有类似的问题。我正在Tomcat服务器上进行开发和测试,并且使用无法更改的实用程序来处理与DB2的数据库连接。在WebSphere上,当我配置Tomcat和Web.xml文件时,它使用设置为“ jdbc / COMPDB2”的常量来检索数据源,它将解析为“ java:comp / env / jdbc / SFCCDB2”

我的工作是在本地工作空间上添加侦听器,以将资源复制到InitialContext中的级别。我对服务器方面的经验不是很丰富,但是到目前为止,使用TomEE 7.0.81可以正常工作。

        InitialContext ctx = new InitialContext();
        DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/SFCCDB2");
        javax.naming.Context envCtx = (javax.naming.Context) ctx.lookup("java:comp/env");
        try{
            /*
            Added this because after redeploying code to the server it would error 
            connecting to the DB with an SQLException Datasource is closed
             */
            DataSource dataSource = (DataSource) ctx.lookup("jdbc/COMPDB2");
            ctx.destroySubcontext("jdbc");
        } catch (NamingException e){
            //Doesn't exist; safe to just add
        }
        ctx.createSubcontext("jdbc");
        ctx.bind("jdbc/COMPDB2", ds);
        ctx.close();