如何使用外部化的属性文件在 Tomcat 中执行 JNDI

Posted

技术标签:

【中文标题】如何使用外部化的属性文件在 Tomcat 中执行 JNDI【英文标题】:How to do JNDI in Tomcat by using externalized Property file 【发布时间】:2015-07-30 05:52:04 【问题描述】:

我只是使用外部化为 JNDI 配置 tomcat。我做错了什么,但没有任何线索。

在 Context.xml 中

<Resource name="jdbc/AppDB" auth="Container" type="javax.sql.DataSource"
                            driverClassName="org.postgresql.Driver"
                            factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
                            url="$app.env.database.url"
                            username="$app.env.database.user"
                            password="$app.env.database.password"
                            maxActive="100"
                            maxIdle="50"
                            minIdle="10"
                            suspectTimeout="60"
                            timeBetweenEvictionRunsMillis="30000"
                            minEvictableIdleTimeMillis="60000"
                            validationQuery="select 1"
                            validationInterval="30000"
                            testOnBorrow="true"
                            removeAbandoned="true"
                            removeAbandonedTimeout="60"
                            abandonWhenPercentageFull="10"
                            maxWait="10000"
                            jdbcInterceptors="ResetAbandonedTimer;StatementFinalizer"
            />

在运行 Tomcat 时,我正在设置它

-DappProperties=c:/user/abc/app.properties

在启动服务器时,出现以下错误。

Caused by: javax.naming.NamingException: Driver:org.postgresql.Driver@d8cf794 returned null for URL:$app.env.database.url
    at org.apache.naming.NamingContext.lookup(NamingContext.java:858)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:152)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:829)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:152)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:829)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:152)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:829)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:166)
    at org.apache.naming.SelectorContext.lookup(SelectorContext.java:157)
    at javax.naming.InitialContext.lookup(InitialContext.java:411)
    at org.springframework.jndi.JndiTemplate$1.doInContext(JndiTemplate.java:155)
    at org.springframework.jndi.JndiTemplate.execute(JndiTemplate.java:87)
    at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:152)
    at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:179)
    at org.springframework.jndi.JndiLocatorSupport.lookup(JndiLocatorSupport.java:95)
    at org.springframework.jndi.JndiObjectLocator.lookup(JndiObjectLocator.java:106)
    at org.springframework.jndi.JndiObjectFactoryBean.lookupWithFallback(JndiObjectFactoryBean.java:231)
    at org.springframework.jndi.JndiObjectFactoryBean.afterPropertiesSet(JndiObjectFactoryBean.java:217)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1625)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1562)
    ... 31 more

谁能帮忙。 请注意:如果我用实际值更改 $app.env.,应用程序运行良好。

感谢您的帮助

【问题讨论】:

参考这个***.com/questions/15064260/… @Sasikumar Murugesan - 这不会解决我的问题。如果您查看我的问题,conext.xml 有 $app.env.url 等应该在启动时通过属性文件注入 我不知道 Tomcat 中有任何此类功能,也无法在文档中找到它。您是否有资料表明这应该是可能的? 【参考方案1】:

你在使用 Maven 吗?您需要使用资源过滤插件,以便 Maven 将您的属性文件值转换为实际值。比如:

<build>
...
<resources>
  <resource>
    <directory>src/main/resources</directory>
  </resource>
  ...
</resources>
...

包含您的 xml 文件的目录应该可以工作

【讨论】:

我认为 Maven 是构建工具,我正在寻找的是值的运行时分配。以及如何通过maven设置tomcat/conf/server.xml属性文件 这里有一个类似的问题可能对您有所帮助:***.com/questions/22118698/… 我的意思是,您需要使用某种构建工具将模板变量转换为真实变量。 Maven 可以为您做到这一点。 你说得对,我们可以这样做,但我需要这个用于生产用途。我无法使用 Maven tomcat 插件进行生产。 嗯,我不认为没有工具你可以做到这一点。

以上是关于如何使用外部化的属性文件在 Tomcat 中执行 JNDI的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring 的 Tomcat Web 服务器中外部化 application.properties?

外部化 Tomcat 配置

如何配置 Tomcat 以提供来自 webapps 外部文件夹的图像? [复制]

在 Tomcat 8 中将外部资源添加到类路径

如何使用java从linux环境中获取tomcat中当前目录的相对路径

Spring boot 1.4登录外部tomcat