基本上,我们有一个具有多个依赖关系的ear存档。在这些依赖项中,我们计划使用多个属性填充清单或某些属性文件:
对于我们的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的某些选项,我还没有发现?或者只是一般情况下,你将如何解决我在这里遇到的具体问题?
答案 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}
当然是对包含此类信息的竹子变量的参考。