如何将动态生成的文件添加到我的ear存档中?

时间:2016-03-16 13:04:04

标签: java maven gradle groovy build

基本上,我们有一个具有多个依赖关系的ear存档。在这些依赖项中,我们计划使用多个属性填充清单或某些属性文件:

  • 构建时间戳
  • buildnumber(来自CI服务器)
  • 的groupId
  • 的artifactId
  • 版本

对于我们的CI服务器构建的单个工件,这应该是可能的,这也不是我遇到的问题。

现在我使用maven来构建我的 ear 存档,使用maven-ear-plugin。我的想法是只使用一个groovy脚本(由gmaven-plus执行),它将读取所有jar档案,并获取清单。然后我可以重写ear存档的清单,或者编写我自己的属性文件,其中包含我想要的信息。

import org.apache.commons.io.FileUtils
import java.util.jar.JarFile

def path = "target/${project.name}-${project.version}"
def artifactDir = new File(path)
def output = new File("$path/META-INF/build-info.properties")

def lines = []

artifactDir.listFiles().each { file->
    if (file.isFile() && (file.name.endsWith(".war") || file.name.endsWith(".jar"))) {
        def jar = new JarFile(file)
        def manifest = jar.manifest
        println "processing: $file.name"
        println manifest.mainAttributes
        println jar.properties
        manifest.mainAttributes.keySet().each { attrKey->
            def val = manifest.mainAttributes.getValue(attrKey.toString())
            lines << "$file.name.$attrKey=$val"
        }
    }
}

FileUtils.writeLines(output, lines as Collection<?>

这个脚本运行正常,并会写出build-info.properties文件,其中包含我想要的所有信息。

这是插件配置:

<plugin>
    <groupId>org.codehaus.gmavenplus</groupId>
    <artifactId>gmavenplus-plugin</artifactId>
    <version>1.5</version>
    <executions>
        <execution>
            <id>create-manifest</id>
            <phase>package</phase>
            <goals>
                <goal>execute</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <scripts>
            <script>file:///${project.basedir}/src/main/gmaven/create-manifest.groovy</script>
        </scripts>
    </configuration>
</plugin>

当然,你已经注意到这有什么问题了:package阶段太晚了,prepare-package太早了,因为ear插件还没有复制我正在扫描的依赖项

结论

嗯,显而易见的事情是解压缩产生的耳朵,然后手动添加文件,然后再拉链。但这对我来说似乎很脏,我想知道是否有更清洁的方法来做到这一点?

也许通过利用gradle,或maven-ear-plugin的某些选项,我还没有发现?或者只是一般情况下,你将如何解决我在这里遇到的具体问题?

1 个答案:

答案 0 :(得分:1)

为什么不使用maven的可能性......就像the archiver的配置一样,这意味着你可以为maven-jar-plugin使用这样的配置:

   <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-jar-plugin</artifactId>
          <version>${maven-jar-plugin.version}</version>
          <configuration>
            <archive>
              <addMavenDescriptor>true</addMavenDescriptor>
              <index>true</index>
              <manifest>
                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
              </manifest>
              <manifestEntries>
                <artifactId>${project.artifactId}</artifactId>
                <groupId>${project.groupId}</groupId>
                <version>${project.version}</version>
              </manifestEntries>
            </archive>
          </configuration>
        </plugin>

这也可用于maven-war-plugin,maven-ejb-plugin以及maven-ear-plugin ......请参阅docs for maven-ear-plugin参见archive条目。

CI解决方案的构建编号(例如Jenkins)有一个env变量BUILD_NUMBER,你可以使用它......

完整示例企业pom如何看起来像take a look here

<强>更新

我错过的是您可以使用过滤来创建此类文件。将文件放入src/main/resources,其中包含以下内容:

groupId=${project.groupId}
artifactId=${project.artifactId}
version=${project.version}

将以下内容定义为pom文件的一部分:

...                的src / main /资源         真正       

此外,这会将上述文件打包到ear / war / jar文件中。

除此之外,可以在包含上述内容的earchive META-INF/groupId/artifactId/pom.properties中找到已包含上述信息的文件。不是内部版本号和构建时间......

可以使用以下内容来使用构建时间:

 <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-ear-plugin</artifactId>
      <version>2.6</version>
      <configuration>
          <archive>
            <manifestEntries>
              <buildTime>${maven.build.timestamp}</buildTime>
              <buildNumber>${env.BUILDNUMBER}</buildNumber>
            </manifestEntries>
          </archive>
      </configuration>
    </plugin>

${env.BUILDNUMBER}当然是对包含此类信息的竹子变量的参考。