使用maven打包后,在META-INF目录下会生成pom.properties文件(当然可以使其不生成)。这个文件包含了包的Id信息,此外它最开始有两行注释,看起来是这样的

#Generated by Maven

#Sat Jun 25 09:40:37 CST 2016

第一行 是固定的,第二行是打包时候的时间戳。

第二行的存在有一个严重的问题,就是我们完全不修改代码,然后两次打包由于时间戳不一样,导致生成的两个包不一样。如果你不在乎可能觉得没有什么,但是对于大型项目,代码没变包却不同导致不能进行增量部署。

这个代码的出现是由于java.util.Properties类的store(Writer writer, String comments)方法中有一行

bw.write("#" + new Date().toString());

这个问题在困扰大家的同时,也困扰着Maven的开发者。与之相关的有两个issue:

maven人员郁闷的说

Oracle's implementation of store() does write the stupid new Date().toString()

由于大家需求强烈,目前该特性据说已被修正。

在今年5月21号提交的代码中,时间这一行注释被移除了:移除方法是把生成后的文件对行迭代,看到是注释就删除。

Stupid hack: write the properties to a StringWriter,

iterate with a BufferedReader and drop all comments,

finall write real content to the target file.

我们看一下中心库中的版本和时间:

3.0.x版本最晚是4月份提交的,所以它不包含这个改动。3.1.x最早是6月份提交的,现在已经有两个小版本了,但是引用次数还是0.

我们对比一下3.0和3.1中的代码。首先是3.0.2中的:

75 private void createPropertiesFile( MavenSession session, Properties properties, File outputFile,

76 boolean forceCreation )

77 throws IOException

78 {

79 File outputDir = outputFile.getParentFile();

80 if ( outputDir != null && !outputDir.isDirectory() && !outputDir.mkdirs() )

81 {

82 throw new IOException( "Failed to create directory: " + outputDir );

83 }

84 if ( !forceCreation && sameContents( properties, outputFile ) )

85 {

86 return;

87 }

88 OutputStream os = new FileOutputStream( outputFile );

89 try

90 {

91 String createdBy = CREATED_BY_MAVEN;

92 if ( session != null ) // can be null due to API backwards compatibility

93 {

94 String mavenVersion = session.getSystemProperties().getProperty( "maven.version" );

95 if ( mavenVersion != null )

96 {

97 createdBy += " " + mavenVersion;

98 }

99 }

100

101 properties.store( os, createdBy );

102 os.close(); // stream is flushed but not closed by Properties.store()

103 os = null;

104 }

105 finally

106 {

107 IOUtil.close( os );

108 }

109 }

下面是3.1.1的(左边是在文件内的行号):

77 private void createPropertiesFile( MavenSession session, Properties properties, File outputFile,

78 boolean forceCreation )

79 throws IOException

80 {

81 File outputDir = outputFile.getParentFile();

82 if ( outputDir != null && !outputDir.isDirectory() && !outputDir.mkdirs() )

83 {

84 throw new IOException( "Failed to create directory: " + outputDir );

85 }

86 if ( !forceCreation && sameContents( properties, outputFile ) )

87 {

88 return;

89 }

90 PrintWriter pw = new PrintWriter( outputFile, "ISO-8859-1" );

91 try

92 {

93 String createdBy = CREATED_BY_MAVEN;

94 if ( session != null ) // can be null due to API backwards compatibility

95 {

96 String mavenVersion = session.getSystemProperties().getProperty( "maven.version" );

97 if ( mavenVersion != null )

98 {

99 createdBy += " " + mavenVersion;

100 }

101 }

102

103 StringWriter sw = new StringWriter();

104 properties.store( sw, null );

105

106 BufferedReader r = new BufferedReader( new StringReader( sw.toString() ) );

107

108 pw.println( "#" + createdBy );

109 String line;

110 while ( ( line = r.readLine() ) != null )

111 {

112 if ( !line.startsWith( "#" ) )

113 {

114 pw.println( line );

115 }

116 }

117

118 r.close();

119 r = null;

120 sw.close();

121 sw = null;

122 pw.close();

123 pw = null;

124 }

125 finally

126 {

127 IOUtil.close( pw );

128 }

129 }

这里主要是对注释的处理,正文内容的处理在方法public void createPomProperties()中。

下面版本比上面多了一个流程,就是临时变量sw写入后,再逐行读出来,不是注释就写入pw中(迭代前已经把maven信息写好了)。这样就把时间删掉了。

maven打包忽略注解_maven打包后pom.properties中的注释问题-阿里云开发者社区相关推荐

  1. maven引用公共包_Maven项目怎样引用其他项目/或者jar包-阿里云开发者社区

    惯例: 我是温浩然: 现在越来越多的项目都用Maven进行管理jar包,我这里说的是,Maven怎样引用本地Maven项目. 一个项目从SVN上下载下来,先在本地删除(只是在工作环境中删除,不要删除文 ...

  2. maven打包忽略注解_maven打包包含注释

    maven打包之后为什么class文件中没有注释了 目标 1. 将依赖第三方jar包都打进去2. 将工程java 目录下所有文件夹和配置文件,包括资源文件都打入jar包,根据目录来3. 打出jar文件 ...

  3. maven打包忽略注解_Maven打包时遇到的一些坑和解决方案

    背景: 最近将部分代码集成至Jekins中进行CICD发布,编译执行的时候出现以下错误.解决过程中将方案记录保证后续不会出现同样的错误. 一.编译之后target中classes文件夹中没有class ...

  4. 年薪50万的程序员_毕业之后,这些年薪50万+的90后程序员经历了什么?-阿里云开发者社区...

    如果说薪资是检验一家公司对你认可的标准,那么年纪轻轻就能达到年薪 50 万+,一定程度上说明了公司对他创造的价值的认可. 小编深访了10+ 名这样的程序员,把他们最常见的三种成长途径梳理了出来 在一家 ...

  5. python创建虚拟环境打包_用虚拟环境保存库文件--Python打包-阿里云开发者社区

    用虚拟环境保存库文件 如果你同时负责多个 Python 项目,或者想要轻松打包某个项目及其关联的库文件,再 或者你担心已安装的库之间可能有冲突,那么你可以安装一个 Python 虚拟环境来分而 治之. ...

  6. centos mysql 设置_CentOS下MySQL安装后配置和设置-阿里云开发者社区

    CentOS下MySQL安装后配置和设置: 1:安装完成路径: 1.数据库目录 /var/lib/mysql/ 2.配置文件 /usr/share/mysql(mysql.server命令及配置文件) ...

  7. r语言中残差与回归值的残差图_独家 | 手把手教你用R语言做回归后的残差分析(附代码)-阿里云开发者社区...

    作者:Abhijit Telang 翻译:张睿毅 校对:丁楠雅 文章来源:微信公众号 数据派THU 本文介绍了做残差分析的方法及其重要性,以及利用R语言实现残差分析. 在这篇文章中,我们通过探索残差分 ...

  8. 误删阿里云mysql恢复数据恢复_mysql数据库误删除后的数据恢复操作说明-阿里云开发者社区...

    在日常运维工作中,对于mysql数据库的备份是至关重要的!数据库对于网站的重要性使得我们对mysql数据的管理不容有失! 然后,是人总难免会犯错误,说不定哪天大脑短路了来个误操作把数据库给删除了,怎么 ...

  9. python2卸载后yum不可用_centos7误删除python2导致的python和yum不可用处理-阿里云开发者社区...

    centos7查看版本 cat /etc/redhat-release // 我这边是 CentOS Linux release 7.6.1810 (Core) 强制删除已安装程序及其关联 rpm - ...

最新文章

  1. Oracle+jsp+Servlet的员工表的简单增删改查
  2. 04、数据绑定控件 ListBox 的一个 Bug
  3. hdu5492(2015合肥网络赛I题)
  4. 03.openssl-获得支持加密算法
  5. php获取跳转后url,php获取跳转后真实url的方法
  6. 第六章 应用层[练习题+课后习题]
  7. machine learning (7)---normal equation相对于gradient descent而言求解linear regression问题的另一种方式...
  8. 【路径规划】基于matlab无线充电车辆路径和速度预测【含Matlab源码 1473期】
  9. Maven下载JasperReports报错Could not find artifact com.lowagie:itext:pom:2.1.7.js6 in alimaven
  10. 现代制造技术——金属切削原理
  11. 中国移动的呼叫转移呼叫等待等设置方法 USSD MMI
  12. 自己动手写CPU(6)简单算术操作指令
  13. 模拟时钟c语言编码,C语言模拟时钟转动程序
  14. js中value^= 是什么意思
  15. 非常喜欢的一期《晓松奇谈》
  16. 如何查询中文期刊影响因子
  17. Ant入门教程(上)
  18. 【POJ 2484】A Funny Game(对称博弈)
  19. 大型直播平台应用架构浅谈
  20. 【Matlab】已知邻接矩阵怎么求每个节点的度脑网络计算

热门文章

  1. linux 快速切换ip,linux-如何快速替换IP
  2. linux重定向到程序,技术|Linux I/O 重定向基础
  3. php面向对象教学笔记,php学习笔记之面向对象编程
  4. linux运行tcl脚本语言,Tool Command Language (Tcl)初体验
  5. MongoDB 官方C#驱动 封装 DbHelper
  6. 怎样在 Centos 6.8 中安装 Elasticsearch 5.2
  7. iOS开发常用快捷键
  8. [转载]网络编辑必知常识:什么是PV、UV和PR值 zz
  9. Android一个简单易用的进度条
  10. jQuery学习笔记——jQuery基础核心