maven打包后pom.properties中的注释问题

简介: 使用maven打包后,在META-INF目录下会生成pom.properties文件(当然可以使其不生成)。这个文件包含了包的Id信息,此外它最开始有两行注释,看起来是这样的 #Generated by Maven #Sat Jun 25 09:40:37 CST 2016  第一行 是固定的,第二行是打包时候的时间戳。

使用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:

MSHARED-494

MSHARED-505

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信息写好了)。这样就把时间删掉了。

 

 

目录
相关文章
|
Java Maven
SpringBoot项目的用maven插件打包报Test错误
SpringBoot项目的用maven插件打包报Test错误
586 1
|
Java 测试技术 Maven
Maven打包使用多线程加速构建过程
Maven打包使用多线程加速构建过程
3005 0
|
Java Maven
maven打包出现没有主类的原因,详细分析并解决
本文分析了使用Maven打包Java应用时找不到或无法加载主类的问题,通常是由于未配置主类或打包时未包含依赖,并通过添加Maven插件解决了依赖问题,同时指出了JavaFX应用可能遇到的运行时组件缺失的错误。
1206 1
maven打包出现没有主类的原因,详细分析并解决
|
Java 应用服务中间件 Maven
Maven的三种项目打包方式——pom,jar,war的区别
Maven 提供了多种打包方式,分别适用于不同类型的项目。pom 用于父项目或聚合项目,便于项目的结构和依赖管理;jar 用于Java类库或可执行的Java应用程序;war 则专用于Java Web应用程序的部署。理解这些打包方式的用途和特点,可以帮助开发者更好地配置和管理Maven项目,确保构建和部署过程的顺利进行。无论是单模块项目还是多模块项目,选择合适的打包方式对于项目的成功至关重要。
2407 3
|
Java Maven Android开发
【Azure Developer】VS Code打包Java maven Project 遇见 BUILD FAILURE
Unknown lifecycle phase "lean". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>
505 5
|
缓存 IDE Java
idea的maven项目打包时没有source下的文件
【10月更文挑战第21天】idea的maven项目打包时没有source下的文件
1135 1
|
Java 测试技术 Maven
maven 打包命令
maven 打包命令
271 6
|
Java Maven 容器
Maven使用IDEA自带工具打包,同时将lib下的jar包打入,双击jar包可直接运行
使用IntelliJ IDEA的Artifacts功能,可以将项目依赖的第三方jar包打包进jar文件中,实现双击jar包即可直接运行。
Maven使用IDEA自带工具打包,同时将lib下的jar包打入,双击jar包可直接运行
|
Java Shell Maven
Flink-11 Flink Java 3分钟上手 打包Flink 提交任务至服务器执行 JobSubmit Maven打包Ja配置 maven-shade-plugin
Flink-11 Flink Java 3分钟上手 打包Flink 提交任务至服务器执行 JobSubmit Maven打包Ja配置 maven-shade-plugin
939 4
|
Java Linux Maven
IDEA如何用maven打包(界面和命令两种方式)
【10月更文挑战第14天】本文介绍了两种Maven项目打包方法:命令行与IDEA界面。首先确保已安装Maven并配置环境变量,通过`mvn -v`检查安装。命令行打包需进入项目目录,执行`mvn package`,之后在`target`目录查看结果。IDEA打包则需配置Maven路径,打开Maven Projects窗口,双击Lifecycle下的`package`阶段,同样在`target`目录查找生成文件,并在Build窗口查看日志以排查问题。
5965 1