4

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

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

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

可能还有一些我现在想不起来的其他事情,它们分散在 XML 文件中。

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

4

3 回答 3

11

您可以使用Maven来实现这一点。尤其是使用资源过滤

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

  <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

过滤器-development.properties

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

过滤器生产属性

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

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

在这里您可以看到在 maven 中使用 profile 的示例项目。

于 2012-05-27T07:17:39.883 回答
0

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

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

于 2012-05-27T07:32:17.803 回答
0

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

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

于 2012-08-01T15:08:20.647 回答