san*_*anz 51 java maven-2 maven-assembly-plugin
我想生成一个zip文件,用maven更新应用程序.zip将托管在服务器上,我使用程序集插件生成zip.但是,我希望maven能够自动生成一个文本文件,该文件存储zip之外的当前版本号.这可能吗?
编辑:我成功地使用maven Assembly Plugin和两个描述符创建了两个自定义程序集.一个目录单一目标,它只是根据过滤创建一个带有更新版本.txt的文件夹.然后另一个具有单个目标的实际打包zip文件.这似乎非常不优雅,我想它不会正确地更新整个更新文件夹的maven repo.如果有更好的方法,请告诉我.
Sea*_*oyd 87
当然.在src/main/resources中的某处创建一个文本文件,调用它version.txt
(或其他)
文件内容:
${project.version}
Run Code Online (Sandbox Code Playgroud)
现在在您的pom.xml中,在构建元素内部,放置此块:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/version.txt</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<excludes>
<exclude>**/version.txt</exclude>
</excludes>
</resource>
...
</resources>
</build>
Run Code Online (Sandbox Code Playgroud)
在每次构建之后,文件(您可以在目标/类中找到)将包含当前版本.
现在,如果您想自动将文件移动到其他位置,您可能需要通过maven-antrun-plugin执行ant任务.
像这样的东西:
<build>
...
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<phase>process-resources</phase>
<configuration>
<tasks>
<copy file="${project.build.outputDirectory}/version.txt"
toFile="..." overwrite="true" />
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Run Code Online (Sandbox Code Playgroud)
Pau*_*est 16
使用标准META-INF\MANIFEST.MF
(然后你可以使用Java代码getClass().getPackage().getImplementationVersion()
来获取版本)
对于.war使用此配置:
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.1</version>
<configuration>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
</archive>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
这将在构建期间添加清单,或者您可以调用 mvn war:manifest
小智 9
对于 Spring Boot 应用程序,请按照上面接受的答案进行操作,但是替换
${project.version}
Run Code Online (Sandbox Code Playgroud)
和
@project.version@
Run Code Online (Sandbox Code Playgroud)
在Maven 3中,使用Sean的答案来创建你的version.txt
文件,(我的在这里显示,以及构建日期和活动配置文件):
${project.version}-${profileID}
${buildDate}
Run Code Online (Sandbox Code Playgroud)
profileID
为每个配置文件添加属性,例如:
<properties>
<profileID>profileName</profileID>
</properties>
Run Code Online (Sandbox Code Playgroud)
使用Maven copy-resources将文件复制到更容易访问的目录,例如:${basedir}
或${basedir}/target
:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}</outputDirectory>
<resources>
<resource>
<directory>${basedir}/target/.../[version.txt dir]/version.txt</directory>
<includes>
<include>version.txt</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
输出看起来像这样:
1.2.3-profileName
yymmdd_hhmm
Run Code Online (Sandbox Code Playgroud)
小智 6
您还可以使用Groovy脚本生成版本信息文件.我更喜欢这种方法,因为你不必在assembly-plugin的描述符中排除东西.您还可以使用此方法选择性地包含仅在从Jenkins/Hudson构建时可用的内容(例如,检查oug BUILD_ID等...).
所以你会在pom.xml中有一个文件生成的groovy脚本,如下所示:
<plugin>
<groupId>org.codehaus.mojo.groovy</groupId>
<artifactId>groovy-maven-plugin</artifactId>
<version>1.0-beta-3</version>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<source>
<![CDATA[
println("==== Creating version.txt ====");
File mainDir = new File("src/main");
if(mainDir.exists() && !mainDir.isDirectory()) {
println("Main dir does not exist, wont create version.txt!");
return;
}
File confDir = new File("src/main/conf");
if(confDir.exists() && !confDir.isDirectory()) {
println("Conf dir is not a directory, wont create version.txt!");
return;
}
if(!confDir.exists()) {
confDir.mkdir();
}
File versionFile = new File("src/main/conf/version.txt");
if(versionFile.exists() && versionFile.isDirectory()) {
println("Version file exists and is directory! Wont overwrite");
return;
}
if(versionFile.exists() && !versionFile.isDirectory()) {
println("Version file already exists, overwriting!");
}
println("Creating Version File");
BufferedWriter writer = new BufferedWriter(new FileWriter(versionFile));
writer.write("groupId = ${project.groupId}");
writer.newLine();
writer.write("artifactId = ${project.artifactId}");
writer.newLine();
writer.write("version = ${project.version}");
writer.newLine();
writer.write("timestamp = ${maven.build.timestamp}");
String buildTag = "";
String buildNumber = "";
String buildId = "";
try {
buildTag = "${BUILD_TAG}";
buildNumber = "${BUILD_NUMBER}";
buildId = "${BUILD_ID}";
writer.write("BUILD_TAG = " + buildTag + "\n");
writer.write("BUILD_NUMBER = " + buildNumber + "\n");
writer.write("BUILD_ID = " + buildId + "\n");
} catch (Exception e) {
println("============= Could not find BUILD_TAG probably this is not a Jenkins/Hudson build ===========");
}
writer.close();
]]>
</source>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
然后你的pom.xml中的程序集插件插件如下所示:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2.1</version>
<!-- Produce the all-dependencies-included jar for java classloaders -->
<executions>
<execution>
<id>all</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<finalName>${project.artifactId}</finalName>
<descriptors>
<descriptor>dist-all.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
最后你的程序集描述符dist-all.xml看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<assembly>
<id>all</id>
<formats>
<format>dir</format>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>target</directory>
<outputDirectory></outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
<fileSet>
<directory>src/main/conf</directory>
<outputDirectory></outputDirectory>
<includes>
<include>**</include>
</includes>
</fileSet>
</fileSets>
</assembly>
Run Code Online (Sandbox Code Playgroud)
小智 6
我只是用蚂蚁任务完成了这个。
<echo file="version.txt">${project.version}</echo>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
67062 次 |
最近记录: |