我有一个正确运行在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上进行更少的更改?
答案 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();