注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

和申的个人主页

专注于java开发,1985wanggang

 
 
 

日志

 
 

Jar hell问题;类重复校验,如果是在maven中解决方法  

2013-03-27 14:00:29|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

1. Jar hell问题以及解决办法
最近看到温绍锦的JVM基础,里面看到这个jar hell问题的解决方法
当一个类或者个资源文件存在多个jar中,就会存在jar hell问题。可以通过以下代码来诊断问题

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

String reosurceName = "com/alibaba/simpleEL/dialect/tiny/TinyELEvalService.class";

Enumeration<URL> urls = classLoader.getResources(reosurceName);

while (urls.hasMoreElements()) { 

URL url = urls.nextElement()

System.out.println(url)

}




2. 使用maven时,可以加入maven插件校验是否有相同的类
具体插件校验代码见:
DuplicateDependencyCheckMojo.java



import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.util.HashMap;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import org.apache.commons.io.IOUtils;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.project.MavenProject;

public class DuplicateDependencyCheckMojo extends AbstractMojo
{
  private MavenProject project;
  private boolean failOnWarning;

  public void execute()
    throws MojoExecutionException, MojoFailureException
  {
    Set artifacts = this.project.getArtifacts();
    HashMap classAndArtifactMap = new HashMap();
    boolean hasWarnings = false;
    for (Artifact artifact : artifacts) {
      ZipInputStream zis = null;
      try {
        zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(artifact.getFile())));
        ZipEntry entry;
        while ((entry = zis.getNextEntry()) != null)
          if ((!entry.isDirectory()) && (entry.getName().endsWith(".class")))
          {
            if (classAndArtifactMap.containsKey(entry.getName())) {
              hasWarnings = true;
              getLog().warn("DUPLICATED CLASS FOUND! " + entry.getName() + "\r\n\t" + artifact + "\r\n\t" + classAndArtifactMap.get(entry.getName()));

              break;
            }
            classAndArtifactMap.put(entry.getName(), artifact);
          }
      } catch (Exception e) {
        throw new MojoExecutionException("Unknown errors...", e);
      } finally {
        IOUtils.closeQuietly(zis);
      }
    }
    if ((this.failOnWarning) && (hasWarnings))
      throw new MojoFailureException("PLEASE CHECK ABOVE WARNINGS!!! There is duplicated classes found in your dependencies.");
  }
}



参考资料:http://wenku.baidu.com/view/a465792d453610661ed9f44e.html

  评论这张
 
阅读(748)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016