`
elvis4139
  • 浏览: 146183 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

maven打包将SVN版本号打入系统。

阅读更多
一、实现目标:
目标一、生成的war包名称根据[项目名称]_[系统版本号]_[SVN版本号]_[打包日期]格式自动生成war包。
目标二、系统主页可以展示当前系统的最新版本信息(以上格式的版本信息)。

二、实现思路:
对于目标一:[项目名称]、[系统版本号]根据pom.xml文件中参数配置;
            [SVN版本号]从SVN服务器获取;
            [打包日期]时间戳;
根据以上信息,自动生成自定格式的war包文件。

对于目标二:将目标一生成的最终版本号以自定义属性的方式追加到META-INF/MANIFEST.MF文件下;并在系统启动的时候加载META-INF/MANIFEST.MF文件,取出并显示到指定页面文件。

三、实现过程:
1、pom.xml文件配置:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.sinowel</groupId>
	<artifactId>UFM</artifactId>
	<version>1.0.20</version>
	<packaging>war</packaging>
	<name>Unified Flow Management</name>
	<url>http://http://10.180.50.30:8099/scpnf</url>

	<properties>
		<maven.build.timestamp.format>yyyyMMdd</maven.build.timestamp.format>
	</properties>


	<scm>
		<connection>scm:svn:https://192.168.22.34/svn/UMPlatform4J/SCPNF/banches/UFM</connection>
		<tag>HEAD</tag>
		<url>https://192.168.22.34/svn/UMPlatform4J/SCPNF/banches/UFM</url>
	</scm>

	<dependencies>
		<!-- 略 -->
	</dependencies>


	<build>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.1</version>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>


			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>buildnumber-maven-plugin</artifactId>
				<version>1.4</version>
				<executions>
					<execution>
						<phase>validate</phase>
						<goals>
							<goal>create</goal>
						</goals>
					</execution>
				</executions>
				<configuration>
					<doCheck>false</doCheck>
					<doUpdate>true</doUpdate>
				</configuration>
				<dependencies>
					<dependency>
						<groupId>com.google.code.maven-scm-provider-svnjava</groupId>
						<artifactId>maven-scm-provider-svnjava</artifactId>
						<version>2.1.1</version>
					</dependency>
					<dependency>
						<groupId>org.tmatesoft.svnkit</groupId>
						<artifactId>svnkit</artifactId>
						<version>1.8.10</version>
					</dependency>
				</dependencies>
			</plugin>


			<plugin>
				<artifactId>maven-war-plugin</artifactId>
				<version>2.4</version>
				<configuration>
					<failOnMissingWebXml>false</failOnMissingWebXml>
					<encoding>UTF-8</encoding>
					<warName>${project.artifactId}_v${project.version}r${buildNumber}b${maven.build.timestamp}</warName>
					<archive>
						<manifest>
							<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
						</manifest>
						<manifestEntries>
							<svn-version>${buildNumber}</svn-version>
							<deploy-version>${project.artifactId}_v${project.version}r${buildNumber}b${maven.build.timestamp}</deploy-version>
						</manifestEntries>
					</archive>
				</configuration>
			</plugin>

		</plugins>
	</build>

</project>


2、创建ManifestUtils.java文件,用来读取META-INF/MANIFEST.MF文件。
public class ManifestUtils {

	private static final String MANIFEST_DIRECTORY_LOCATION = "META-INF" + File.separator + "MANIFEST.MF";

	private static final String MANIFEST_ENTRY = "META-INF/MANIFEST.MF";

	/**
	 * 
	 * Creates a {@link Reader} for the manifest in the supplied exploded JAR
	 * directory.
	 * 
	 * 
	 * 
	 * @param directory
	 *            the exploded JAR directory.
	 * 
	 * @return the <code>Reader</code> or <code>null</code> if the manifest
	 *         cannot be found.
	 */
	public static final Reader manifestReaderFromExplodedDirectory(File directory) {
		if (directory == null || !directory.isDirectory()) {
			throw new IllegalArgumentException("Must supply a valid directory");
		}
		try {
			File manifestFile = new File(directory.getAbsolutePath() + File.separator + MANIFEST_DIRECTORY_LOCATION);
			if (manifestFile.exists()) {
				return new FileReader(manifestFile);
			} else {
				return null;
			}
		} catch (IOException e) {
			throw new RuntimeException(
					"Unable to read MANIFEST for exploded directory '" + directory.getAbsolutePath() + "'.", e);
		}
	}

	/**
	 * 
	 * Creates a {@link Reader} for the manifest in the supplied JAR file.
	 * 
	 * 
	 * 
	 * @param file
	 *            the JAR file.
	 * 
	 * @return the <code>Reader</code> or <code>null</code> if the manifest
	 *         cannot be found.
	 */
	public static final Reader manifestReaderFromJar(File file) {
		JarFile jar = null;
		try {
			jar = new JarFile(file);
			JarEntry entry = jar.getJarEntry(MANIFEST_ENTRY);
			if (entry != null) {
				StringWriter writer = new StringWriter();
				FileCopyUtils.copy(new InputStreamReader(jar.getInputStream(entry)), writer);
				jar.close();
				return new StringReader(writer.toString());
			} else {
				return null;
			}
		} catch (Exception e) {
			throw new RuntimeException("Cannot read MANIFEST.MF from jar '" + file.getAbsolutePath() + "'.", e);
		} finally {
			if (jar != null) {
				try {
					jar.close();
				} catch (IOException ioe) {
					throw new RuntimeException("Failed to close jar '" + file.getAbsolutePath() + "'.", ioe);
				}
			}
		}
	}

	/**
	 * 从META-INF/MANIFEST.MF文件中读取“deploy-version”发布版本号信息。
	 * 
	 * @param realPath
	 *            web发布真实路径
	 * @return
	 */
	public static String getDeployVersion(String realPath) {
		File file = new File(realPath);
		Reader reader = manifestReaderFromExplodedDirectory(file);
		BufferedReader bufferedReader = new BufferedReader(reader);
		String lineTxt = null;
		String deployVersion = "";
		try {
			while ((lineTxt = bufferedReader.readLine()) != null) {
				if (lineTxt.startsWith("deploy-version:")) {
					deployVersion = lineTxt.replace("deploy-version:", "");
					return deployVersion;
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (null != bufferedReader) {
				try {
					bufferedReader.close();
				} catch (IOException e) {
				}
			}
			if (null != reader) {
				try {
					reader.close();
				} catch (IOException e) {
				}
			}
		}
		return deployVersion;
	}

}


3、在系统启动位置如ContextLoaderListener中调用ManifestUtils.getDeployVersion方法取得发布版本,并存放。例如:
String deployVersion = "";
		deployVersion = ManifestUtils.getDeployVersion(servletContext.getRealPath(""));
		servletContext.setAttribute("deployVersion", deployVersion);


4、在指定页面获取存入版本号:
<div id="deployVersion ">版本:${deployVersion }</div>
分享到:
评论

相关推荐

    maven 简单实用的配置,打包,获取svn版本号

    maven 简单实用的配置,打包,获取svn版本号、仓库等等实用

    Maven自动升级版本号并打包上传的脚本

    本文将详细介绍如何通过编写脚本实现Maven项目的版本号自动升级以及打包上传的过程。 首先,我们要理解Maven的版本管理。在Maven的`pom.xml`文件中,定义了项目的版本号,如`&lt;version&gt;1.0.0-SNAPSHOT&lt;/version&gt;`。...

    基于Maven+SVN自动打包

    本文将深入探讨如何结合Maven和SVN实现项目的自动打包流程,帮助开发者更有效地管理和部署代码。 【Maven】:Maven是一个强大的Java项目管理工具,它能够帮助开发者构建、管理和部署项目。Maven通过使用一个统一的...

    Eclipse Maven插件,SVN插件

    SVN(Subversion)是一种版本控制系统,用于跟踪文件和目录的修改。在Eclipse中,SVN插件允许开发者在IDE内部进行版本控制操作,如提交、更新、合并、回滚等。这极大地提高了团队协作的效率,因为开发者可以在不离开...

    jenkins+maven+svn+springboot实现一件打包发布

    ### Jenkins + Maven + SVN + SpringBoot 实现一键打包发布 #### 安装 Jenkins 1. **下载 Jenkins** 首先前往 Jenkins 官网下载 Jenkins,官网上提供了两个下载选项: - 如果用于公司环境,建议选择左侧的企业...

    maven打包 maven打jar包详细步骤

    本文将详细讲解如何使用Maven来打包一个Java项目,并创建JAR文件。 首先,Maven有三个主要生命周期阶段:`clean`、`default`(也称为`compile`)和`install`。每个阶段包含一系列的阶段(或者称为目标,如`compile`...

    maven打包出错解决办法,亲测绝对可以!

    本篇文章将详细阐述如何解决Maven打包出错的问题,并分享一些关于搭建Maven私服的知识。 一、Maven打包出错常见原因及解决办法 1. **依赖冲突**:当项目中的多个库引用了不同版本的同一个依赖时,可能导致冲突。...

    maven 工程升级版本步骤

    下面将详细介绍如何通过一系列步骤完成Maven项目的版本升级。 #### 步骤一:更新Parent POM中的版本号 1. **定位Parent POM**: - 首先,需要找到项目的根目录下的`pom.xml`文件,这通常被称为Parent POM。 2. ...

    Maven打包,指定classes路径

    然而,如果我们希望在打包过程中直接将类文件放入`WebContent/WEB-INF/classes`,我们需要自定义Maven的配置。 要实现这一目标,我们需要修改项目的`pom.xml`文件,具体操作如下: 1. **配置`&lt;build&gt;`部分**:在`...

    Windows下git拉取/推送,SVN更新/提交,maven自动编译打包,angular打包的bat脚本

    本主题将详细讲解如何利用Git进行拉取与推送,SVN进行更新和提交,Maven实现自动化编译,以及Angular项目的打包发布,这一切都将通过批处理(BAT)脚本来实现,以提高工作效率。 首先,我们来看Git的拉取(pull)和...

    Maven配置SVN的方法和SVN包全套

    在软件开发过程中,版本控制系统是不可或缺的工具,Subversion(简称SVN)就是其中的一种,它用于管理项目源代码的历史版本,确保团队协作时代码的一致性和可追踪性。Maven作为Java项目管理和构建工具,同样支持与...

    sprintboot maven 打包分离lib jar 资源文件 properties xml yml

    sprintboot maven 打包分离lib jar 资源文件 properties xml yml 详细信息查看我的博客 https://mp.csdn.net/postedit/80274087 java -jar -cp 启动

    springboot+maven打包demo【将依赖与配置文件打包到jar包外部】

    在本文中,我们将深入探讨如何使用Spring Boot和Maven来构建一个项目,使得依赖和配置文件被打包到jar包外部,以实现更加灵活的项目管理。这个方法对于那些需要根据不同环境进行定制配置或者频繁更新配置的应用来说...

    maven 过滤文件夹打包

    例如,如果在开发环境中执行`NODE_ENV=dev mvn package`,Maven会找到`src/main/resources/application-dev.properties`并将其包含在打包结果中。同样,测试环境和生产环境也以此类推。 至于压缩包子文件的文件名称...

    如何用IntelliJ IDEA新建web项目,用maven打包成.jar

    idea新建maven web项目.zip Jetbrains IntelliJ IDEA创建基于maven打包工具的WEB网站项目 本项目使用的是SSM框架spring mvc,spring, mybatis.用maven打包成jar

    Maven SVN Revision Number Plugin官方英文文档

    而Maven SVN Revision Number Plugin提供了这个功能,它能够将SVN的修订版本号插入到构建输出、资源文件或者POM属性中。这样,当项目部署时,用户可以通过查看这些信息了解到项目的具体版本,便于追踪和管理。 使用...

    hudson+maven+svn自动化部署

    5. **打包**: 使用 `mvn package` 命令将编译后的类文件打包成 JAR 或 WAR 文件。 6. **部署**: 将打包好的文件部署到应用服务器上,如使用 `mvn tomcat:deploy` 命令。 #### 三、Hudson (Jenkins) 对 Java 项目...

    Maven打包实战.zip

    本压缩包文件“Maven打包实战.zip”提供了关于Maven打包的实战教程,配合文章《Maven打包实战》(链接已提供)学习,将有助于深入理解Maven的打包流程。 首先,我们需要理解Maven的生命周期。Maven生命周期包括三个...

    intellij+maven+svn环境的搭建

    在Java开发中,IntelliJ IDEA是一款备受推崇的集成开发环境(IDE),Maven是一个强大的项目管理和构建工具,而SVN则是常用的版本控制系统。本指南将详细介绍如何在Windows环境下搭建IntelliJ IDEA、Maven和SVN的开发...

    Jenkins+Maven+SVN+Tomcat 持续集成环境快捷部署

    SVN(Subversion)是一个开源的版本控制系统,用于管理代码的修订版本。Tomcat是一个开源的Web应用服务器,用于部署Java EE应用程序。 搭建Jenkins+Maven+SVN+Tomcat的持续集成环境,需要按照以下步骤: 1. 环境...

Global site tag (gtag.js) - Google Analytics