`
somefuture
  • 浏览: 1089741 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

 
阅读更多

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

 

 

  • 大小: 31.4 KB
0
0
分享到:
评论

相关推荐

    eclipse-external-annotations-m2e-plugin:M2E扩展,用于从pom.xml设置Eclipse外部注释

    从包含org.eclipse.jdt.core.prefs文件的maven-compiler-plugin的依赖项中读取,或者从configuration / compilerArguments / properties中读取。 允许配置Maven依赖关系和JRE类路径容器的外部注释的路径。 路径是取...

    Mybatis Generator自动生成JavaEntity带中文注释和注解[Maven]工程

    配置完成后,你需要在Maven的`pom.xml`文件中引入Mybatis Generator的依赖,并添加执行生成代码的maven插件,如下所示: ```xml <groupId>org.mybatis.generator <artifactId>mybatis-generator-core ...

    maven-yaml-plugin:将 Java .properties 文件转换为 .yaml 文件

    描述中提到,这个插件的代码需要重构,意味着当前可能存在的代码结构不够优化或者存在一些问题,重构完成后,开发者计划发布这个插件。发布插件通常包括将其上传到公共的Maven仓库,这样其他开发者就可以通过在他们...

    eigenbase-properties-1.1.5-API文档-中文版.zip

    赠送Maven依赖信息文件:eigenbase-properties-1.1.5.pom; 包含翻译后的API文档:eigenbase-properties-1.1.5-javadoc-API文档-中文(简体)版.zip; Maven坐标:net.hydromatic:eigenbase-properties:1.1.5; 标签:...

    Maven环境配置

    在该文件中找到一下代码,将注释去掉并修改路径,修改的路径就为上面创建的仓库路径。 四、创建Maven项目 因为这里还有说到使用eclipse来创建Maven项目,因此就只能使用命令行来创建了,输入以下命令: mvn ...

    git-commit-id-maven-plugin:Maven插件,它将构建时的git信息存储在POJO * .properties中。 让您的应用程序告诉您它们确切是从哪个版本构建的! 在大型分布式部署中是无价的... :-)

    基本设置中需要做的就是在pom.xml包含该插件定义。 对于更高级的用户,我们还准备了...继续阅读! 版本号 当前版本是4.0.3 ( )。 您可以通过访问来检查可用版本,尽管使用最新版本显然是最佳选择。 插件与Java的...

    Maven+SSM(Spring+springMVC+MyBatis)整合框架

    - 打开 Maven 安装目录下的 `conf/settings.xml` 文件,取消第 53 行注释并将其改为本地仓库路径,例如 `D:\maven\mvnRepo`。 #### MyEclipse 配置与 SSM 项目创建 1. **MyEclipse Maven 插件配置** - 确保已...

    Maven的ssm项目配置文件

    在Maven项目中,配置文件主要体现在`pom.xml`,这是Maven的核心文件,包含了项目信息、构建设置、依赖关系和插件配置等。通过`pom.xml`,我们可以指定项目的依赖库,构建目标,以及执行的构建过程。 2. Spring配置...

    IT楠老师maven教学资料.pdf

    - **POM (Project Object Model)**:Maven的核心是POM,它是项目构建的蓝图,定义了项目的依赖关系、插件配置和其他构建细节。 - **生命周期**:Maven的工作基于一系列阶段构成的生命周期,如clean、default、site等...

    spring注解出现中文乱码

    例如,在Maven项目中,可以在`pom.xml`文件中加入以下依赖: ```xml <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind <version>2.9.0 ``` 如果需要兼容旧版本的Jackson...

    idea出现maven问题或者插件报红问题汇总

    可以在`settings.xml`的`profiles`节点中增加`download平行线程数`,例如`<settings><profiles><profile><id>increase-download-threads</id><properties><maven.compiler.parallel>true</maven.compiler.parallel>...

    Maven下载安装及其配置-maven下载安装配置

    Maven 可以自动处理依赖的下载、传递性以及冲突等问题。 - **依赖下载**:Maven 会从规范的远程仓库下载所需的 JAR 包到本地仓库。 - **依赖传递性**:当项目依赖于某个库时,该库所依赖的其他库也会自动被添加到...

    IDEA整合SpringMVC开发框架(maven+springboot)Demo

    描述中提到,项目中的依赖是通过Maven管理的,这意味着开发者可以利用Maven的POM.xml文件来声明项目所需的库和它们的版本。配置文件可能包括SpringMVC的配置、Spring Boot的application.properties或.yml文件等,...

    mybatis-generator生成带中文注释POJO类的超详细教程含代码和图解

    对于Maven,可以在`pom.xml`中添加以下依赖: ```xml <groupId>org.mybatis.generator <artifactId>mybatis-generator-core <version>1.4.1 ``` 接下来,创建一个`generatorConfig.xml`配置文件,这是MBG的...

    mybatis-generator生成数据库中文注释

    如果是Maven项目,可以在pom.xml中添加以下依赖: ```xml <groupId>org.mybatis.generator <artifactId>mybatis-generator-core <version>1.4.2 ``` 接下来,创建MyBatis Generator的配置文件generatorConfig...

    eclipse的maven项目中,通过mybatisgenerator工具自动生成实体类和Mapper

    1. **配置`mybatis-generator-maven-plugin`**:在`pom.xml`的`<build>`节点内添加插件配置,以便在构建过程中执行代码生成任务。示例代码如下所示: ```xml <groupId>org.mybatis.generator <artifactId>...

    Mybatis Generator自动生成代码实例(maven方式)

    然后,我们需要在`pom.xml`中添加一个执行目标,使得通过Maven命令就可以触发代码生成: ```xml <groupId>org.mybatis.generator <artifactId>mybatis-generator-maven-plugin <version>1.4.1 <id>...

    ssm+maven+tomcat简单项目源码

    开发者可以根据个人经验在项目中添加注释和心得,这对于其他开发者理解代码有很大帮助。部署项目到Eclipse时,首先需要在Eclipse中导入Maven项目,然后将项目右键关联Tomcat服务器,最后通过"Run As" -> "Run on ...

    eigenbase-properties-1.1.5.jar中文-英文对照文档.zip

    Maven依赖:【***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【***-sources.jar下载地址(官方地址+国内镜像地址).txt】...

    sonar+maven2+myeclipse代码质量监控

    Maven是Java项目自动化构建工具的基础框架,它通过一个项目对象模型(POM)来管理项目的构建、报告和文档。 1. **下载Maven** - 从Maven官网下载Maven 2.x版本,解压至非中文目录。 - 配置`MAVEN_HOME`环境变量...

Global site tag (gtag.js) - Google Analytics