【问题标题】:How to deliver properties files in addition to artifacts?除了工件之外,如何交付属性文件?
【发布时间】:2010-11-23 16:08:48
【问题描述】:

我正在使用 Maven2 构建一个 WAR 项目。 某些属性文件取决于发布的目标环境。

除了 WAR 之外,我还想提供一个名为 datasource.xml 的文件。此文件已存在于我的项目目录中,但包含将在构建期间过滤的属性(即一些 ${foo.bar})。

也就是说,运行命令mvn clean install后,我想在我的target/目录中看到两个文件,my-webapp.wardatasource.xml

请注意,datasource.xml 不得包含在 my-webapp.war 工件中!

我该怎么做?

【问题讨论】:

    标签: maven-2 build-process build-automation


    【解决方案1】:

    您可以使用build-helper-maven-plugin 附加其他工件。下面的配置将在 package 阶段附加 datasource.xml 作为附加工件。如果该工件是在 src/main/resources 和 src/main/webapp 之外定义的,它将不会包含在战争中。

    更新:为确保根据您的评论应用资源过滤,您可以指定执行 resource-plugin 的复制资源目标,指定要应用的过滤。然后,您仍然可以通过引用相应的目标目录,使用 build-helper-maven-plugin 附加该过滤后的工件。我更新了下面的例子来展示这种用法。

    <plugin>
      <artifactId>maven-resources-plugin</artifactId>
      <version>2.4</version>
      <executions>
        <execution>
          <id>copy-resources</id>
          <phase>validate</phase>
          <goals>
            <goal>copy-resources</goal>
          </goals>
          <configuration>
            <outputDirectory>${project.build.outputDirectory}/datasource</outputDirectory>
            <resources>          
              <resource>
                <directory>src/main/datasource</directory>
                <filtering>true</filtering>
              </resource>
            </resources>              
          </configuration>            
        </execution>
      </executions>
    </plugin>
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>build-helper-maven-plugin</artifactId>
      <version>1.3</version>
      <executions>
        <execution>
          <id>attach-artifacts</id>
          <phase>package</phase>
          <goals>
            <goal>attach-artifact</goal>
          </goals>
          <configuration>
            <artifacts>
              <artifact>
                <file>${project.build.outputDirectory}/datasource/datasource.xml</file>
                <type>xml </type>
                <classifier>datasource</classifier>
              </artifact>
            </artifacts>
          </configuration>
        </execution>
      </executions>
    </plugin>
    

    这不会出现在目标文件夹中,但会与战争一起部署/安装到存储库中。

    可以通过使用分类器“数据源”定义依赖项来引用附加的工件。例如:

    <dependency>
      <groupId>my.group.id</groupId>
      <artifactId>my-artifact-id/artifactId>
      <version>1.0.0</version>
      <classifier>datasource</classifier>
      <type>xml</type>
    </dependency>
    

    您可以使用依赖插件的copy goal 来检索工件并将其放置在部署过程中需要的任何位置。

    【讨论】:

    • 这不是我想要的(我只需要将 datasource.xml 放在目标/目录中,而不是安装在存储库中),但是这个解决方案非常有趣。
    • 这个解决方案也不能满足我的需要,因为在存储库中复制的 XML 文件是 not 过滤的(即我仍然有 ${foo.bar} )。
    • 所以要明确一点,您希望应用资源过滤,但工件不包含在战争中?
    • maven-resources-plugin 将过滤输出。您可能想检查过滤器是否在 build 下定义,而不是在 war-plugin 下。在 war-plugin 下定义的过滤器将仅应用于网络资源。
    猜你喜欢
    • 2012-01-19
    • 2018-03-10
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 2010-10-20
    • 1970-01-01
    相关资源
    最近更新 更多