maven增量编译

最近由于不清楚maven(2.2.x)增量编译的机制,导致应用出现了一个当时觉得非常诡异的一个问题。先描述一下问题。

背景是应用A有一个公用的base包,版本为1.6.6-SNAPSHOT,应用B依赖于这个公用的base包。我在base包中修改了一个字符串变量的值,该变量是一个缓存的key(如下面代码的Constants类,中的CACHE_KEY)。然后使用mvn deploy 命令把base包上传到中心库中。出现的问题是应用B打包部署,应用上线后,使用后台功能删除"cache.key.new"对应的缓存值,提示删除成功。但是前台展示的还是老的值(前台展示取的数据是从缓存取出的,简化代码后,参考下面的CategoryManager的showCategory()方法,根据key在缓存中取出值,然后前台展示)。

?

  public Interface Constants{
        public interface Cache{
            String CACHE_KEY = “cache.key.new”;//旧值为"cache.key"
    }
}
public Class CategoryManager{
    private static Map<int, String> keyMaps = new HashMap<String, String>();
        static {
             keyMaps.put(1, Constants. Cache. CACHE_KEY);//把缓存的key存到map中
             .........
    }

        public Object showCategory(){
            return  cacheManager.get(keyMaps.get(1));//在缓存中获取数据
        }
}

一开始怀疑是包没有成功deploy到中心库中,然后在中心库中把1.6.6-SNAPSHOT的源码包拉了下来,发现里面的代码是新的。

我的印象中deploy是maven生命周期的最后一步,执行deploy命令是会执行compile编译操作的,当时怀疑自己记错了,以为base包deploy的时候没有走到compile,就把包发到中心库中了,后续把base包的1.6.6-SNAPSHOT的编译后的文件拉下来,并且反编译Constants类,发现CACHE_KEY的确是新的值"cache.key.new",证明这块是被重新编译过了。(后续翻阅了下资料”http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html maven生命周期“发现自己记的的确没错)

最后把CategoryManager.class反编译过来一看,发现里面的部分代码是这样的:

?

    public Class CategoryManager{
    private static Map<int, String> keyMaps = new HashMap<String, String>();
        static {
             keyMaps.put(1, "cache.key");//问题出在这里,这个"cache.key"没有替换成新的值"cache.key.new"
             .........
    }
........
}

发现问题了,这里的"cache.key"并没有替换成新值。也就是说CategoryManager类并没有重新编译。这里的原因是maven的增量编译机制。
    后续找了些资料表明,默认情况下maven是增量编译的,maven在编译的时候会先去比较源文件(.java)文件的修改时间和对应类文件(.class)的修改时间,如果源文件的修改时间比类文件的修改时间要晚的话,重新编译原文件否则不做处理(另外,如果删除了一个java文件,对应的class文件在增量编译时是不会被移除的)。
    在这里CategoryManager的源文件并没有发生过改变,所以不会重新编译。并且这个地方恰好是静态代码块,这段代码  keyMaps.put(1, Constants. Cache. CACHE_KEY); 编译时直接被替换成 keyMaps.put(1, "cache.key"); ,如果是在非静态代码块里面使用的话,这块地方是不会出问题的。所以之前一直使用mvn deploy都没有出现过问题。

那要怎么避免这个问题呢,使用mvn clean deploy。clean会做一些清理的工作,包括移除上一次构建的文件。这样就能很好的解决这个问题了。

参考:

http://blog.jetbrains.com/teamcity/2012/03/incremental-building-with-maven-and-teamcity/ 部分有关于maven的 incremental building

http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html maven生命周期

时间: 2024-08-02 02:59:20

maven增量编译的相关文章

Spark 1.0 开发环境构建:maven/sbt/idea

因为我原来对maven和sbt都不熟悉,因此使用两种方法都编译了一下.下面记录一下编译时候遇到的问题.然后介绍一下如果使用IntelliJ IDEA 13.1构建开发环境. 首先准备java环境和scala环境: 1. jdk 1.7 2. scala 2.11.1 1. maven 首先安装maven,我安装的是3.2.3, 可以直接下载binary.解压即可用.需要设置一下环境变量: export MAVEN_HOME=/project/spark_maven/spark/apache-ma

maven——项目构建和依赖管理工具

apache maven是一个用于项目构建和依赖管理的工具. 添加archetype https://repo1.maven.org/maven2/archetype-catalog.xml 更改本地仓库存储位置:修改配置文件${user.home}/.m2/settings.xml或 $MAVEN_HOME/conf/setting.xml中的内容 <localRepository>... mvn archetype:generate会非常慢,搜索了本地和远程太多archetype,而加上-

IDEA 配置maven

编写Maven的settings.xml文件内容如下 引入阿里镜像和maven在中国的中央仓库镜像 <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:sc

使用 IDEA 创建 Maven Web 项目 (异常)- Disconnected from the target VM, address: &#39;127.0.0.1:59770&#39;, transport: &#39;socket&#39;

运行环境: JDK 版本:1.8 Maven 版本:apache-maven-3.3.3 IDEA 版本:14 maven-jetty-plugin 配置: <plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <configuration> <webAppSourceDirectory>${pro

maven依赖本地非repository中的jar包-依赖jar包放在WEB-INF/lib等目录下的情况客户端编译出错的处理

maven依赖本地非repository中的jar包 http://www.cnblogs.com/piaolingxue/archive/2011/10/12/2208871.html 博客分类: MAVEN 今天在使用maven编译打包一个web应用的时候,碰到一个问题: 项目在开发是引入了依赖jar包,放在了WEB-INF/lib目录下,并通过buildpath中将web libariary导入. 在eclipse中开发没有问题,但是使用maven编译插件开始便宜总是报找不到WEB-INF

eclipse 创建maven web项目

前言: 前面那一篇讲解了Maven的作用以及详细的应用,不了解Maven的具体使用,请参读:http://www.cnblogs.com/hongwz/p/5456578.html,下面来说明一下IDE构建Maven项目. 1.新建Maven项目 1.1 File -> New -> Other 1.2 选择Maven Project ,单击Next 1.3 保持默认即可,单击Next 1.4 选择Archetype为 web app,单击Next 1.5 输入一些必要信息,单击Finish

解决Maven项目pom.xml文件报xxx\target\classes\META-INF\MANIFEST.MF (系统找不到指定的路径。)问题

最近自己在公司项目修改一些代码以后,出现如题的错误,后来各种Google等,最终找到了解决办法. 错误环境:Tomcat7 + Eclipse + Maven + Spring + SpringMvc + Mybatis 错误描述: 错误解决步骤: 1.找到eclipse的project菜单选择clean...选项 2.选择Clean all projects 或者 Clean projects selectd blow(选择此项必须勾选出错的项目) 3.等着progress视图里的build完

linux安装maven及配置环境变量 配图

Maven 3.5.0 maven安装和环境变量的配置 1 下载 maven 链接:http://pan.baidu.com/s/1qXXjXfe 密码:r92r 2 解压安装包 tar zvxf apache-maven-3.5.0-bin.tar.gz 3  配置maven环境变量 vi  /etc/profile   编辑系统配置文件 #set Maven environmentexport MAVEN_HOME=/usr/local/software/dir-maven/apache-m

eclipse创建maven项目

以下内容不包含maven的配置... 好,进入主题. 首先new一个项目,选择Maven Project,点击Next 选择默认即可,继续点Next 我这里创建的是web工程,所以选择webapp后点击Next 填好 groupid和artifactId后会自动填写package,填完后点击finish.关于groupid和artifactId的解释我从网上找了下,大家可以参考下   "groupid和artifactId被统称为"坐标"是为了保证项目唯一性而提出的,如果你要