将属性文件与 Maven 程序集合并

Posted

技术标签:

【中文标题】将属性文件与 Maven 程序集合并【英文标题】:Merge properties files with Maven assembly 【发布时间】:2011-08-01 16:23:29 【问题描述】:

maven 程序集插件有问题。

我有一个使用多个 jar 的 maven 项目。每个 jar 都包含配置文件。 在另一个项目中,我使用 maven 组装插件将所有配置组装到唯一的 jar 中。

一切正常,但不幸的是,两个文件同名,第二个文件覆盖了第一个文件。

我没有实现告诉 maven 合并两个文件而不是覆盖。

有人知道怎么做吗?

谢谢。

【问题讨论】:

【参考方案1】:

maven-shade-plugin 与 AppendingTransformer 结合使用应该可以满足您的需求。

我们使用它将来自两个 zip 项目的属性文件(定义为单独的 maven 模块)合并到一个 zip 文件中。这将创建来自两个模块的文件和目录的超集,并将指定的属性文件合并在一起。我们还将要合并的模块定义为执行合并的 maven 模块的依赖项。

这样的事情应该可以解决问题:

<plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <version>1.4</version>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
        <goal>shade</goal>
          </goals>
          <configuration>
        <filters>
          <filter>
            <artifact>groupname:artifactname</artifact>
            <includes>
              <include>**/*</include>
            </includes>
          </filter>
        </filters>
        <transformers>
          <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
            <resource>propertyfiletomerge.properties</resource>
          </transformer>
        </transformers>
          </configuration>
        </execution>
      </executions>
    </plugin>

【讨论】:

【参考方案2】:

这不是您要找的,但我会使用 http://maven.apache.org/plugins/maven-antrun-plugin/ 插件运行 ant concat task http://ant.apache.org/manual/Tasks/concat.html 来合并文件。我会在 prepare-package 阶段运行 maven-antrun。

【讨论】:

谢谢,这个插件很好用。我只想使用 maven 程序集,但这似乎是不可能的。【参考方案3】:

根据 Skarab 的回答,这是我使用 maven-antrun-plugin 解决此问题的代码:

<project>
...
<build>
    ...
    <plugins>
        ...
        <plugin> 
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <version>1.8</version>
            <executions>
                <execution>
                <phase>prepare-package</phase>
                <configuration>

                    <target>
                        <concat destfile="$project.build.directory/setup_db.sql">
                            <fileset file="$project.basedir/src/main/resources/db/sql_one/*.sql" />
                            <fileset file="$project.basedir/src/main/resources/db/sql_another/*.sql" />
                        </concat>
                    </target>

                </configuration>
                <goals>
                    <goal>run</goal>
                </goals>
              </execution>
            </executions>
        </plugin>
        ... 
    </plugins>
</build>

【讨论】:

【参考方案4】:

您可以尝试重命名第一个文件,然后合并这两个文件。

这是 *** 上的一个线程,其中记录了此类文件的重命名: Renaming resources in Maven

【讨论】:

好的,我可以重命名文件,但是之后如何合并呢?如果可能的话,使用汇编插件。

以上是关于将属性文件与 Maven 程序集合并的主要内容,如果未能解决你的问题,请参考以下文章

微软工具ILMerge

如何将非托管 dll 和托管程序集合并到一个文件中?

使用 maven 将版本号输出到文本文件

使用Maven程序集插件创建WAR文件

如何将“InternalsVisibleTo”属性与强命名程序集一起使用?

Maven 程序集插件未设置 MainClass 清单设置