0

我从 maven 开始,我有一个关于为部署选择资源的问题。我有一个本地和生产属性目录,当我部署时,我希望选择其中一个并将其放在适当的位置。我的项目结构是这样的

-
| -/src
|  | -/main
|  |  | -/java
|  |  | -/resources
|  |  | -/webapp
|  |  |  | -/WEB-INF
| -/config
|  | -/local
|  |  | -/properties
|  |  |  | -config.properties
|  | -/prod
|  |  | -/properties
|  |  |  | -config.properties
| -/WEB-INF

因此,当我部署它时,应该选择适当的属性文件夹并将其放入/WEB-INF/. 我怎样才能做到这一点?

附带说明,但也相关,config目录应该在里面src/main/resources吗?

4

2 回答 2

1

您可以执行以下操作(您已经这样做了):

.
|-- pom.xml
`-- src
    |-- main
    |   |-- java
    |   |-- resources
    |   |-- environment
    |   |   |-- test
    |   |   |   `-- database.properties
    |   |   |-- qa
    |   |   |   `-- database.properties
    |   |   `-- production
    |   |       `-- database.properties
    |   `-- webapp

除了上述之外,每个环境都需要一个 maven-assembly-descriptor,如下所示:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">

  <id>test</id>
  <formats>
    <format>war</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <unpack>true</unpack>
      <useProjectArtifact>true</useProjectArtifact>
    </dependencySet>
  </dependencySets>
  <fileSets>
    <fileSet>
      <outputDirectory>WEB-INF</outputDirectory>
      <directory>${basedir}/src/main/environment/test/</directory>
      <includes>
        <include>**</include>
      </includes>
    </fileSet>
  </fileSets>
</assembly>

您需要根据您的位置更改文件夹,最后您需要执行 maven-assembly-plugin 以生成适当的工件,如下所示:

 <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <executions>
      <execution>
        <id>test</id>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
        <configuration>
          <descriptors>
            <descriptor>${project.basedir}/src/main/assembly/test.xml</descriptor>
          </descriptors>
        </configuration>
      </execution>
      <execution>
        <id>qa</id>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
        <configuration>
          <descriptors>
            <descriptor>${project.basedir}/src/main/assembly/qa.xml</descriptor>
          </descriptors>
        </configuration>
      </execution>
      <execution>
        <id>production</id>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
        <configuration>
          <descriptors>
            <descriptor>${project.basedir}/src/main/assembly/production.xml</descriptor>
          </descriptors>
        </configuration>
      </execution>
    </executions>
  </plugin>

结果将有一个像

  1. xyz-1.0-SNAPSHOT-test.war
  2. xyz-1.0-SNAPSHOT-qa.war
  3. xyz-1.0-SNAPSHOT-production.war

这将通过一次调用 maven 来创建mvn clean package。而已。但是您应该知道,这种方法正在进入部署方向,而这并不是 Maven 真正的工作。

于 2013-05-21T15:23:09.943 回答
0

我建议保持简单。正如@khmarbaise 建议的那样,尽量不要混合使用 Maven 和部署。

使用默认的 war 插件结构和配置,并在部署时处理您的 *.properties 文件(例如让它们保留令牌并用与环境相关的值替换它们)

像您一样进行拆分将要求您在不同文件中维护相同的更改。这是迷失在大型项目中的一条滑坡。

我希望这有帮助。

于 2013-05-21T17:02:09.437 回答