我需要在tomcat 7中部署我们的Web应用程序,但是我的应用程序使用JNDI数据源。如何在Tomcat 7中创建jndi数据源
您是否尝试过Tomcat手册:http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html
(提示:Google String是“ jndi数据源tomcat 7”)
[我可以显示如何在Tomcat 9中执行此操作。这在Tomcat 7中可能有效,也可能不起作用。FYI,Tomcat 7 seems to be中的maintenance-mode。
在我的情况下,我想存储Web应用程序的WAR文件之类的设置,例如数据库访问信息outside。这为我的每个开发,测试和生产服务器提供了灵活性,使其在文件系统中拥有自己的设置。与运行我的应用程序的客户一样。如果这些设置保存在外部,并且分别存在于每个服务器上,则无需编辑WAR文件或生成个性化的WAR文件。更改设置或到达新版本的WAR文件时,无需重新编辑WAR文件。
如果已指定,则在Tomcat“主”文件夹或Tomcat“基本”文件夹中,进入conf
文件夹以创建Catalina
文件夹。 “ Catalina”是Tomcat引擎的名称。在该新文件夹中嵌套一个名为localhost
的主机名称。在其中创建一个XML文件,命名为上下文名称。
[我发现app-name-goes-here.xml
方法是将这些设置存储在我的Web应用程序的WAR文件外部的简单位置,而不必弄乱Tomcat自己的文件。在[[Tomcat配置参考的The Context Container页面的[[定义上下文]]部分中,在“在单独的文件中”开头的中间项目符号中,这种方法相当晦涩难懂。例如,这是我的名为TickTock的应用的屏幕快照,使用Tomcat文件夹外部的“基本”文件夹。
在该XML文件中,您可以定义诸如环境变量之类的东西,例如“ DEV”对“ PROD”标志或feature toggle,以及诸如JDBC DataSource
单例之类的资源。这些项目由Tomcat自己的类似DataSource
的服务器的实现管理,可以通过LDAP访问。
[这是我的JNDI文件的几乎真实的示例。
注意每个属性的前几个属性;这些是Servlet规范定义的标准,在此为ticktock.xml
和此处为environment entries记录。
并且注意resource entries元素如何具有其他属性。这些是特定的特定资源。在这种情况下,特定资源为Resource
。
如何为此环境条目或资源条目获取对象?
首先,获得一个JNDI“上下文”,从中可以访问这些条目。
<Context>
<!-- Domain: DEV, TEST, PROD -->
<Environment
name = "work.basil.ticktock.deployment-mode"
description = "Signals whether to run this web-app with development, testing, or production settings."
type = "java.lang.String"
value = "DEV"
override = "false"
/>
<Resource
name = "jdbc/ticktockdb"
description = "Database used by the TickTock app."
type = "javax.sql.DataSource"
auth = "Container"
singleton = "true"
driverClassName = "org.postgresql.Driver"
url = "jdbc:postgresql://127.0.0.1:5432/ticktockdb"
username = "TickTockApp"
password = "pw"
maxTotal = "20"
maxIdle = "10"
maxWaitMillis = "-1"
/>
</Context>
您还将需要为Context ctx = new InitialContext ();
设置陷阱,但是我将省略该代码。
您可以使用此简单代码转储所有环境条目。我在这里使用lambda语法,但您也可以使用经典Java语法。
或获取特定的。
NamingException
要获得// Read all properties.
System.out.println ( "INFO - Dumping bindings for environment variables." );
ctx.listBindings ( "java:comp/env" ).asIterator ().forEachRemaining (
( Binding binding ) -> {
String msg = binding.getName () + " : " + binding.getObject ();
System.out.println ( msg );
this.add ( new Paragraph ( msg ) );
} );
对象,我们必须转换JNDI返回的String deployMode = ( String ) ctx.lookup( "java:comp/env/work.basil.ticktock.deployment-mode" );
。
DataSource
这就是我们所需要的!
您将看到有关其他配置的Servlet或Tomcat功能的其他配置的其他讨论,这些特性提供了另一层间接性,因此代码中的命名不需要与LDAP或JNDI访问的其他服务器中的名称匹配。虽然我不确定,但是我相信如果我们的Web应用程序项目不需要额外的间接层,那么如果我们指定整个JNDI查找字符串,则可以直接从命名服务器提供我们的环境或资源请求,如下所示,以Object
开头,而不只是结尾部分DataSource ds = ( DataSource ) ctx.lookup( "java:/comp/env/jdbc/ticktockdb" );
。如果有人想澄清这一点,请发表评论或编辑此答案。
JDBC驱动程序
java:/comp/env
在Servlet容器中有问题。长话短说,您应该
相反,您想在Common类加载器或可能的
Shared
类加载器上加载JDBC驱动程序。为了使Common类加载器自动检测您的JDBC驱动程序,请将其jdbc/ticktockdb
文件拖放到Tomcat的JDBC drivers文件夹中(或者,如果使用上面指定的“ base”文件夹,请创建一个JAR文件夹,如下所示:如上所示,然后在此处存放驾驶员的JAR)。