【问题标题】:Configure Java EE 6 for dev/QA/prod为 dev/QA/prod 配置 Java EE 6
【发布时间】:2012-06-02 02:09:09
【问题描述】:

我有一个使用 Maven 构建的 Java EE 6 应用程序,在 NetBeans 7 中编写代码并部署在 GlassFish 3.1.2 上。当我接近完成时,我发现自己正在部署演示版本。

问题是我没有任何简单的方法来构建不同的环境,例如 dev、QA、demo、prod 等。对于某些东西,我一直在使用带有一堆静态的 Java 类根据环境常量的值返回值的 getter。但这对有条件地设置没有帮助

  • javax.faces.PROJECT_STAGE (web.xml)
  • 数据库凭据 (glassfish-resources.xml)
  • 邮件服务器 (glassfish-resources.xml)
  • JPA 日志记录级别 (persistence.xml)

可能还有一些我现在想不起来的东西分散在 XML 文件中。

有没有办法定义这些配置文件的多个版本,并在构建时设置一个标志来选择环境,而在没有指定环境时默认为 dev?在这种情况下,有没有办法让 Maven 为我工作?

【问题讨论】:

    标签: java maven configuration java-ee-6 properties-file


    【解决方案1】:

    您可以使用maven 来实现这一点。尤其是使用resource filtering

    首先,您可以定义配置文件列表:

      <profiles>
        <profile>
          <id>dev</id>
          <properties>
            <env>development</env>
          </properties>
          <activation>
            <activeByDefault>true</activeByDefault> <!-- use dev profile by default -->
          </activation>
        </profile>
        <profile>
          <id>prod</id>
          <properties>
            <env>production</env>
          </properties>
        </profile>
      </profiles>
    

    然后是你需要过滤的资源:

      <build>
        <outputDirectory>${basedir}/src/main/webapp/WEB-INF/classes</outputDirectory>
        <filters>
          <filter>src/main/filters/filter-${env}.properties</filter> <!-- ${env} default to "development" -->
        </filters>
        <resources>
          <resource>
            <directory>src/main/resources</directory>
            <includes>
              <include>**/*.xml</include>
              <include>**/*.properties</include>
            </includes>
            <filtering>true</filtering>
          </resource>
        </resources>
      </build>
    

    然后您的自定义属性基于src/main/filters 目录中的配置文件:

    filter-development.properties

    # profile for developer
    db.driver=org.hsqldb.jdbcDriver
    db.url=jdbc:hsqldb:mem:web
    

    filter-production.properties

    # profile for production
    db.driver=com.mysql.jdbc.Driver
    db.url=jdbc:mysql://localhost:3306/web?createDatabaseIfNotExist=true
    

    要使用生产配置文件,您可以使用mvn clean package -Pprod 命令打包war。

    Here你可以看到在maven中使用profile的示例项目。

    【讨论】:

    • 谢谢。这看起来很有希望。我现在看一下示例项目。
    • 这很可能是公认的答案。它似乎也适用于 JRebel。
    • 在一个多模块项目中,我想我需要在除父级之外的所有 pom 中复制它,对吧?
    【解决方案2】:

    这不是对问题的直接回应。这解释了管理环境属性的差异策略 管理 diff env 属性的另一种方法是使用数据库来存储属性。这样你只需要管理数据库的配置。根据您指向的数据库,您可以从该数据库加载属性。如果您使用的是 spring,那么 spring 会提供 PropertyPlaceholderConfigurer,它可以从 DB 初始化属性。这种方法允许您在不进行构建的情况下更改属性值。

    如果您想推广由 QA\Testing 团队测试的工件,这种方法很有用。在这种情况下,数据库配置不会成为构建过程生成的工件的一部分。

    【讨论】:

    • 这对于某些配置项来说是可以的,但对于那些只能在部署时定义的配置项来说就不够了。不过还是谢谢。
    • 你能举个例子吗?如果您只谈论属性,那么它可以是部署期间执行的数据库脚本的一部分。
    • 它不适用于我的问题中的示例。但是,它适用于我已经定义为常量的那些属性。
    【解决方案3】:

    如果您需要配置 web.xml,请查看以下方法: https://community.jboss.org/docs/DOC-19076

    它使用与另一个答案中描述的相同的方法(资源过滤)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-25
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 2018-05-06
      • 1970-01-01
      相关资源
      最近更新 更多