Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.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 正在使用VM参数进行servlet配置';清洁';?_Java_Servlets - Fatal编程技术网

Java 正在使用VM参数进行servlet配置';清洁';?

Java 正在使用VM参数进行servlet配置';清洁';?,java,servlets,Java,Servlets,这与这个答案有关: 另一个独立于服务器的系统 属性,您可以将其设置为VM 争论 -Dconfig.location=/path/to/folder 对于Tomcat,您可以将其设置为 JAVA_选择环境变量,或 编辑catalina.bat启动文件或 编辑Windows服务设置 (当它作为Windows安装时) 服务),等等。其他服务器支持 类似的构造也是如此 这算是“干净”吗?我们已经做了很多年了,只是想知道这是可以接受的,还是有更好的方法来配置运行时环境。我的理解是,“更干净”应该使用we

这与这个答案有关:

另一个独立于服务器的系统 属性,您可以将其设置为VM 争论

-Dconfig.location=/path/to/folder

对于Tomcat,您可以将其设置为 JAVA_选择环境变量,或 编辑catalina.bat启动文件或 编辑Windows服务设置 (当它作为Windows安装时) 服务),等等。其他服务器支持 类似的构造也是如此


这算是“干净”吗?我们已经做了很多年了,只是想知道这是可以接受的,还是有更好的方法来配置运行时环境。

我的理解是,“更干净”应该使用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自定义对于应用程序的静态调整很好