gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:13:30 26 4
gpt4 key购买 nike

基本上,我们有一个具有多个依赖项的耳朵存档。在这些依赖项中,我们计划使用多个属性填充 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com