Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Tomcat中区分配置和战争的优雅方法_Java_Spring_Configuration_Tomcat - Fatal编程技术网

Java Tomcat中区分配置和战争的优雅方法

Java Tomcat中区分配置和战争的优雅方法,java,spring,configuration,tomcat,Java,Spring,Configuration,Tomcat,我试图找到在Tomcat中运行的SpringWebApp中传递复杂配置的最佳方法。目前,我使用JNDI将数据源和字符串从Tomcat上下文传递到webapp,这很好 但是,假设我需要选择通知服务的实现。Spring无法有条件地选择要实例化的bean,尽管在过去我通过设置contextConfigLocation使用JNDI字符串导入预定义的bean配置 我还看到许多Web应用程序提供了一个配置工具,可以创建自定义WAR文件。在我看来,这是一种糟糕的形式,如果没有其他原因的话,那就是它阻止了从上游

我试图找到在Tomcat中运行的SpringWebApp中传递复杂配置的最佳方法。目前,我使用JNDI将数据源和字符串从Tomcat上下文传递到webapp,这很好

但是,假设我需要选择通知服务的实现。Spring无法有条件地选择要实例化的bean,尽管在过去我通过设置contextConfigLocation使用JNDI字符串导入预定义的bean配置

我还看到许多Web应用程序提供了一个配置工具,可以创建自定义WAR文件。在我看来,这是一种糟糕的形式,如果没有其他原因的话,那就是它阻止了从上游重新部署战争,而没有进行许多检查,以确保所有配置都已重新应用

理想情况下,我能够提供一个SpringXML文件,该文件存在于webapp之外的文件系统中。但是,spring导入指令似乎没有解析${}变量,因此无法提供定制


这里有没有什么技术可以用来正确地将复杂配置与webapp分开?

如果我有一组特定的bean要配置,并且此配置必须与WAR文件分开,我通常会执行以下操作:

在applicationContext.xml中:

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="location" value="file:#{contextParameters.myConfigDirectory + servletContext.contextPath}/config.properties" />
</bean>

您还需要使用-DconfigDir=/path/to/configuration/directory启动Tomcat

如果您想要在web容器之间完全可移植,您不能依赖WAR文件之外的任何东西。在Tomcat中,SecurityManager允许您发现磁盘上部署代码的物理位置,然后您可以使用该知识将磁盘导航到配置文件所在的位置


例如,请参见

如果您使用的是Spring 3,则可以利用Spring表达式语言。假设您有两个应用程序app1.war和app2.war,它们需要一个名为config.properties的属性文件。应用程序将使用上下文路径/app1和/app2进行部署

在公共目录中创建两个目录app1和app2,例如C:\myConfig\app1和C:\myConfig\app2

将config.properties放在app1中,将另一个config.properties放在app2中

然后创建一个文件${CATALINA_HOME}/conf/[engineame]/[hostname]/context.xml.default,其内容如下:

context.xml.default:

<Context>
  <Parameter name="myConfigDirectory" value="C:/myConfig" override="false"/>
</Context>
参数myConfigDirectory将可用于主机上的所有应用程序。最好在context.xml.default而不是server.xml中创建此参数,因为以后可以在不重新启动tomcat的情况下更改文件

在war内部的applicationContext.xml中,您可以使用SpEL表达式访问config.properties:{contextParameters.myConfigDirectory+servletContext.contextPath}/config.properties,例如,您可以编写:

applicationContext.xml:

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="location" value="file:#{contextParameters.myConfigDirectory + servletContext.contextPath}/config.properties" />
</bean>

对于使用contextPath/app1的应用程序,表达式将扩展为C:/myConfig/app1;对于使用contextPath/app2的应用程序,表达式将扩展为C:/myConfig/app2。这将使应用程序根据其上下文路径访问config.properties文件。

在属性文件中使用classpath:URI不是更优雅吗,这样您就可以将其放在类路径中的某个位置,避免篡改Tomcat启动参数,有没有一种方法可以在Tomcat类路径上获得一些东西,而不让它卷入战争?我知道有shared/lib或common/lib,有没有等价的类?self注意,在Tomcat6.0中,它是${catalina.home}/lib。谢谢你的帮助,我想我会成功的。
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="location" value="file:#{contextParameters.myConfigDirectory + servletContext.contextPath}/config.properties" />
</bean>