Maven中的疑难杂症

近期在进行工程整合的时候,又有些Maven使用中发现的问题进行整理

发布和编译

在使用Maven build package 的时候,必须先clean一下。否则本次编译中删除的java代码如果在上次打包中存在,则class依然会出现在打好的包中。

配置文件

我习惯自己书写一个setting.xml,这个文件中指定了私服的地址。在eclipse中进行配置。在eclipse中都没有问题,但是在命令行程序中执行会发现有些私服管理的包就找不到了。将这个文件复制到 %MAVEN_HOME%\conf下则可以解决这个问题。Maven在执行中首先检查这个目录,然后检查个人目录C:\Users\Administrator\.m2,为了安全,这个目录下我也放置了一份

检查包依赖

在进行包管理中,会有一些意外的包被引入,导致出现问题。使用如下的命令可以查看包的依赖关系

mvn dependency:tree -Dverbose

使用下面的命令可以进行内容的过滤

# 这里是过滤包组织为org.hibernate的依赖关系
mvn dependency:tree -Dverbose -Dincludes=org.hibernate

去除包的依赖

从上面的命令中,我们已经可以判断出产生冲突的包是由什么地方被引入的。如果想剔除这个依赖,需要在引入的地方进行如下处理(拷贝自网络,去除asm包的引用

        
            org.unitils
            unitils-dbmaintainer
            ${unitils.version}
            
                
                    dbunit
                    org.dbunit
                
                
                
                    asm
                    asm
                
            
        

运行期查看Jar情况

有些问题在运行期出现,多是由于不同版本的包的兼容问题。这个时候可以使用如下的方法(取自网络

package com.ridge.util;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.CodeSource;
import java.security.ProtectionDomain;
/**
 * @author : chenxh
 * @date: 13-10-31
 */
public class ClassLocationUtils {
    /**
     * 获取类所有的路径
     * @param cls
     * @return
     */
    public static String where(final Class cls) {
        if (cls == null)throw new IllegalArgumentException("null input: cls");
        URL result = null;
        final String clsAsResource = cls.getName().replace('.', '/').concat(".class");
        final ProtectionDomain pd = cls.getProtectionDomain();
        if (pd != null) {
            final CodeSource cs = pd.getCodeSource();
            if (cs != null) result = cs.getLocation();
            if (result != null) {
                if ("file".equals(result.getProtocol())) {
                    try {
                        if (result.toExternalForm().endsWith(".jar") ||
                                result.toExternalForm().endsWith(".zip"))
                            result = new URL("jar:".concat(result.toExternalForm())
                                    .concat("!/").concat(clsAsResource));
                        else if (new File(result.getFile()).isDirectory())
                            result = new URL(result, clsAsResource);
                    }
                    catch (MalformedURLException ignore) {}
                }
            }
        }
        if (result == null) {
            final ClassLoader clsLoader = cls.getClassLoader();
            result = clsLoader != null ?
                    clsLoader.getResource(clsAsResource) :
                    ClassLoader.getSystemResource(clsAsResource);
        }
        return result.toString();
    }
}

在出现问题的地方设置好断点,在断点处动态执行下面的代码

# 你运行出问题的类设置为参数
ClassLocationUtils.where(org.objectweb.asm.ClassVisitor.class) 

可以马上查到这个类是哪个Jar包中的,可以判断是否符合自己的预期

配置文件

下面是一个比较详细的说明,来自网络Maven配置setting.xml详细说明



  
  d:/.m2/repository

    
  true

  
  false

  
  false

    
    
        
        com.micmiu.plugins
    

  
  
    
    
        
      micmiuProxy
      
      true
      
      http
      
      micmiu
      
      mypwd
      
      micmiu.com
      
      80
      
      ctosun.com|ctosun.micmiu.com
    
  

  
  
    
    
        
      micmiu-releases
      
      michael
      
      mypwd
    

    
    
      micmiu-snapshots
      
      /home/micmiu/.ssh/id_dsa
      
      mypwd
      
      775
      
      664
    
  

  
  
    
    
        
      mirrorId
      
        central
      micmiu for dev.
      http://dev.micmiu.com/repo/maven2
    

  

  
  
    
    
        
      jdk-1.4

            
      
        
            false

        
        1.4

        
        
                
                windows 7
                
                windows
                
                x86
                
                6.1
            

            
            
                
                mavenVersion
                
                3.0.4
            
            
            
                
                /usr/local/micmiu/workspace/myfile
                
                /usr/local/micmiu/workspace/myfile
            
      

            
            
            www.micmiu.com
          

    

    
    
        
      env-dev
      
        
            
          target-env
          
          dev
        
      
      
      
        /path/to/tomcat/instance
      
    

    
            repo-dev
            
            
                
                
                    
                    nexus
                    
                    nexus for develop
                    
                    http://192.168.1.8:8080/nexus/content/groups/public/
                    default
                    
                        
                        true
                        
                  daily
                  
                  warn
                    
                    
                        
                        true
                        
                  daily
                  
                  warn
                    
                
            
            
                
                    nexus
                    local nexus
                    http://192.168.1.8:8080/nexus/content/groups/public
                    default
                    
                        true
                    
                    
                        true
                    
                
            
        

  

  
  
    repo-dev
  

下面是我个人使用的Setting.xml文件



  
    
  

  
    
  

  
    
    
    
    
          releases
          admin
          admin123
    
    
          snapshots
          admin
          admin123
    
  

  
    
     
      
      nexus
      *
      http://192.168.24.15:8081/nexus/content/groups/public/
    

    
      internet
      *
      http://repo1.maven.org/maven2/
    
  
  
  

    
      nexus
      
      
      
        
            nexus
            local private nexus
            http://192.168.24.15:8081/nexus/content/groups/public/
            true
            false
        
        
      
      
        
            nexus
            local private nexus
            http://192.168.24.15:8081/nexus/content/groups/public/
            true
            false
        
        
       
    
  

  
    
    nexus
  

导出所有依赖包

在开发中有这样一个需求,需要在非Maven环境下进行开发。这个时候需要将依赖的jar包导出。可以使用如下的命令完成:

mvn dependency:copy-dependencies -DoutputDirectory=lib -DincludeScope=compile -sD:\eclipseallinone\maven\settings.xml

这个命令指定了导出Jar包到那个目录,包括那个Scope以及指定的配置文件位置。

依赖本地Jar

在开发过程中,有些包可能在服务器中找不到,需要对私服进行管理。有些只需要在本地加载即可


javax.servlet
servlet-api
        1.1.1< ersion>
        system
        
        path/to/yourLocalJar.jar

配置私服

使用nexus进行私服配置。启动和运行都非常简单,重点是配置中心库
Maven2的依赖库查询
中心库
一个据说非常快的中心库
阿里的mvn仓库

Maven多环境打包

需求:有两个环境,需要不同的配置参数,在以前打包的过程中需要手动修改,容易出错。通过参数进行多系统的打包。
参考文章

  1. webPack目录


    Maven中的疑难杂症_第1张图片
    修改后的目录结构
  2. 修改配置文件pom.xml
    下面的内容都是增加的

    
        
            local
            
                dev
            
            
                
                true
            
        
        
            real
            
                real
            
        
    
    
    
        
            
                org.apache.maven.plugins
                maven-war-plugin
                
                    ${project.artifactId}-${project.version}
                    
                        false
                    
                    
                        
                            src/main/resources/webPack/${package.environment}
                            WEB-INF/classes
                            true
                        
                    
                
                
                       
        

        
        
            
                
                src/main/resources
                
                true
                
                
                
                    **/*.properties
                    **/*.xml
                
                
                
                
                    webPack/dev/*.properties
                    webPack/real/*.properties
                
            
                
    

  1. 打包
# mvn package -Preal
# mvn package -Plocal

更换私服

之前使用的私服nexus-2.4.0-09,近期由于服务器上安装了很多服务,有些必须java8,而2.4版本的私服不能使用java8。所以考虑使用nexus3版本,进行私服的更换

  1. 下载软件
    nexus-3.2.0-01-win64.zip
  2. 配置
    解压之后,可以使用如下的命令进行服务的注册
bin\nexus.exe install
  1. 验证
    在浏览器中输入IP:8081即可访问
  2. 增加代理
    增加中心库,proxy方式,阿里的中心库地址:http://maven.aliyun.com/nexus/content/groups/public/
    增加中心库3rd_parted,hosted方式,允许上传,为了放置第三方的库
  3. 修改setting.xml文件,主要是修改中心库地址
    增加如下内容
    
      nexus
      admin
      admin123
       
  1. 上传第三方jar文件
    之前2.4版本可以直接在页面上上传jar文件,新版本好像不行,可以使用下面的命令完成
mvn deploy:deploy-file -DgroupId=com.oracle -DartifactId=ojdbc -Dversion=14 -Dpackaging=jar -DrepositoryId=nexus -Dfile=D:\ojdbc-14.jar -Durl=http://192.168.24.15:8081/repository/3rd_party/ -DgeneratePom=false

你可能感兴趣的:(Maven中的疑难杂症)