java - 如何将动态生成的文件添加到我的耳朵存档中?

标签 java maven gradle groovy build

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

  • 构建时间戳
  • 内部版本号(来自 CI 服务器)
  • 组ID
  • Artifact ID
  • 版本

对于我们的 CI 服务器构建的单个 Artifact 来说,这应该已经是可能的,而且这也不是我真正遇到的问题。

<小时/>

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

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 的某些选项?或者一般来说,您将如何解决我在这里面临的具体问题?

最佳答案

为什么不使用 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请参阅存档条目。

CI 解决方案(例如 Jenkins)的内部版本号有一个环境变量 BUILD_NUMBER,您也可以使用它...

公司 pom 的完整示例 take a look here .

更新:

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

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

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

... src/主/资源 真的

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

除此之外,还可以在包含上述信息的归档 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} 当然是对包含此类信息的 bass 变量的引用。

关于java - 如何将动态生成的文件添加到我的耳朵存档中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36036525/

相关文章:

java - 调用 renderURL 后 renderRequest 属性始终为 null

grails - 运行Maven-grails测试案例时遇到问题

android - 如何判断 gradle 何时从 Android Studio 运行?

java - Intellij 无法运行项目

java - 如何以编程方式从 pom.xml 执行特定的插件/Mojo?

android - 排除我的版本 .apk 的文件

java - Java 网络应用程序的静态 Assets 管理器

java - Spring MVC 绑定(bind)嵌套对象

java - 如果位数不固定,如何限制小数点后的位数

java - Eclipse IDE 中未读取 SystemPropertyVariables