Java 正在使用VM参数进行servlet配置';清洁';?
这与这个答案有关: 另一个独立于服务器的系统 属性,您可以将其设置为VM 争论 -Dconfig.location=/path/to/folder 对于Tomcat,您可以将其设置为 JAVA_选择环境变量,或 编辑catalina.bat启动文件或 编辑Windows服务设置 (当它作为Windows安装时) 服务),等等。其他服务器支持 类似的构造也是如此Java 正在使用VM参数进行servlet配置';清洁';?,java,servlets,Java,Servlets,这与这个答案有关: 另一个独立于服务器的系统 属性,您可以将其设置为VM 争论 -Dconfig.location=/path/to/folder 对于Tomcat,您可以将其设置为 JAVA_选择环境变量,或 编辑catalina.bat启动文件或 编辑Windows服务设置 (当它作为Windows安装时) 服务),等等。其他服务器支持 类似的构造也是如此 这算是“干净”吗?我们已经做了很多年了,只是想知道这是可以接受的,还是有更好的方法来配置运行时环境。我的理解是,“更干净”应该使用we
这算是“干净”吗?我们已经做了很多年了,只是想知道这是可以接受的,还是有更好的方法来配置运行时环境。我的理解是,“更干净”应该使用web.xml中的
或某种IoC解决方案,比如Spring。我的理解是“更干净”将使用web.xml中的
或某种IoC解决方案,如Spring。我觉得这不是实现您想要的最干净的方法。您可以使用web.xml init params或servlet params标记。
另一种方法是使用属性文件或XML配置文件。我觉得这不是实现所需的最干净的方法。您可以使用web.xml init params或servlet params标记。
另一种方法是使用属性文件或XML配置文件。使用系统属性的缺点是需要重新启动容器来修改系统参数
将其作为web.xml中的init param,只需重新启动web应用程序即可进行修改
拥有init参数是一种更好的方法。拥有系统属性的缺点是需要重新启动容器来修改系统参数
将其作为web.xml中的init param,只需重新启动web应用程序即可进行修改
拥有init参数是一种更好的方法。它可能感觉脏,但是除了将它放在类路径中之外,如果需要在任何时候更改外部配置文件的位置时不触碰WAR,实际上没有更好的方法
如果不接触WAR不是一个严格的要求,并且允许重建WAR(例如,您使用的是一个内部开发的应用程序,具有持续集成,并且serveradmins在同一行中,等等),那么您也可以使用web.xml
中的
config.location
/路径/到/文件
然后,可通过以下方式获得任何(或更好)版本:
它可能感觉很脏,但是除了把它放在类路径中之外,如果您想要更改外部配置文件的位置时要求不触碰WAR,实际上没有更好的方法
如果不接触WAR不是一个严格的要求,并且允许重建WAR(例如,您使用的是一个内部开发的应用程序,具有持续集成,并且serveradmins在同一行中,等等),那么您也可以使用web.xml
中的
config.location
/路径/到/文件
然后,可通过以下方式获得任何(或更好)版本:
我只是用稍微不同的方式解决了一个类似的问题。我们的客户希望在不重建war的情况下配置数据库连接详细信息、集成服务器位置和端口等。使用environment属性指向包含信息的外部文件可能没问题,也可能没问题,但感觉有点脏。不管怎样,这里有一个稍微有点进取的方法
对于数据库连接,我们使用JNDI查找,下面是集成服务器参数化的当前解决方案。现在,这些参数至少可以来自三个不同的来源:
属性文件,该文件可由Maven概要文件覆盖,并且需要spring配置中的单行xml才能访问。这显然在war文件中
web.xml上下文参数。当然,这也在war文件中
Tomcat服务器可以使用context.xml覆盖init参数,context.xml可以在war之外。这恰好是定义JNDI上下文的同一个文件,这很好
下面是配置访问器bean的实现。它可以在servlet上下文中运行,也可以不在servlet上下文中运行(对于一些单元测试来说,启动一个成熟的web服务器没有什么意义,但我们仍然需要满足springbean注入)
我不是说这是一个完美的解决方案,但它是一个。谷歌没有发现类似的东西
@Service
public class IntegrationConfigurationImpl implements
IntegrationConfiguration, InitializingBean,
ServletContextAware, ApplicationContextAware {
private static final String SERVER_HOST_PROPERTY = "integration.server.host";
private static final String SERVER_PORT_PROPERTY = "integration.server.port";
private static final String PROPERTY_BEAN_NAME = "integrationProperties";
private ServletContext servletContext;
private ApplicationContext applicationContext;
private static final Logger log = LoggerFactory.getLogger(IntegrationConfigurationImpl.class);
private String serverHost = "foo";
private int serverPort = 42;
@Override
public String getServerHost() {
return serverHost;
}
@Override
public int getServerPort() {
return serverPort;
}
@Override
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
@Override
public void afterPropertiesSet() throws Exception {
// konfiguraation validointi..
if (servletContext == null) {
log.info("servlet context not set, not running as a web application. Trying to get properties from application context");
if (applicationContext.containsBean(PROPERTY_BEAN_NAME)) {
Properties p = (Properties)applicationContext.getBean(PROPERTY_BEAN_NAME);
serverHost = p.getProperty(SERVER_HOST_PROPERTY);
serverPort = Integer.valueOf(p.getProperty(SERVER_PORT_PROPERTY)).intValue();
} else {
log.info("Property bean not found :" + PROPERTY_BEAN_NAME);
}
} else {
serverHost = servletContext.getInitParameter(SERVER_HOST_PROPERTY);
serverPort = Integer.valueOf(servletContext.getInitParameter(SERVER_PORT_PROPERTY)).intValue();
}
log.info("Using integration server " + getServerHost() + ", port " + getServerPort());
}
}我只是用稍微不同的方式解决了一个类似的问题。我们的客户希望在不重建war的情况下配置数据库连接详细信息、集成服务器位置和端口等。使用environment属性指向包含信息的外部文件可能没问题,也可能没问题,但感觉有点脏。不管怎样,这里有一个稍微有点进取的方法
对于数据库连接,我们使用JNDI查找,下面是集成服务器参数化的当前解决方案。现在,这些参数至少可以来自三个不同的来源:
属性文件,该文件可由Maven概要文件覆盖,并且需要spring配置中的单行xml才能访问。这显然在war文件中
web.xml上下文参数。当然,这也在war文件中
Tomcat服务器可以使用context.xml覆盖init参数,context.xml可以在war之外。这恰好是定义JNDI上下文的同一个文件,这很好
下面是配置访问器bean的实现。它可以在servlet上下文中运行,也可以不在servlet上下文中运行(对于一些单元测试来说,启动一个成熟的web服务器没有什么意义,但我们仍然需要满足springbean注入)
我不是说这是一个完美的解决方案,但它是一个。谷歌没有发现类似的东西
@Service
public class IntegrationConfigurationImpl implements
IntegrationConfiguration, InitializingBean,
ServletContextAware, ApplicationContextAware {
private static final String SERVER_HOST_PROPERTY = "integration.server.host";
private static final String SERVER_PORT_PROPERTY = "integration.server.port";
private static final String PROPERTY_BEAN_NAME = "integrationProperties";
private ServletContext servletContext;
private ApplicationContext applicationContext;
private static final Logger log = LoggerFactory.getLogger(IntegrationConfigurationImpl.class);
private String serverHost = "foo";
private int serverPort = 42;
@Override
public String getServerHost() {
return serverHost;
}
@Override
public int getServerPort() {
return serverPort;
}
@Override
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
@Override
public void afterPropertiesSet() throws Exception {
// konfiguraation validointi..
if (servletContext == null) {
log.info("servlet context not set, not running as a web application. Trying to get properties from application context");
if (applicationContext.containsBean(PROPERTY_BEAN_NAME)) {
Properties p = (Properties)applicationContext.getBean(PROPERTY_BEAN_NAME);
serverHost = p.getProperty(SERVER_HOST_PROPERTY);
serverPort = Integer.valueOf(p.getProperty(SERVER_PORT_PROPERTY)).intValue();
} else {
log.info("Property bean not found :" + PROPERTY_BEAN_NAME);
}
} else {
serverHost = servletContext.getInitParameter(SERVER_HOST_PROPERTY);
serverPort = Integer.valueOf(servletContext.getInitParameter(SERVER_PORT_PROPERTY)).intValue();
}
log.info("Using integration server " + getServerHost() + ", port " + getServerPort());
}
}web.xml自定义对于应用程序的静态调整很好