zoukankan      html  css  js  c++  java
  • JAVA常用知识总结(十)——Maven

    • Maven有哪些优点和缺点?

    优点如下:

    1. 简化了项目依赖管理:
    2. 易于上手,对于新手可能一个"mvn clean package"命令就可能满足他的工作
    3. 便于项目升级,无论是项目本身升级还是项目使用的依赖升级。
    4. 有助于多模块项目的开发,一个模块开发好后,发布到仓库,依赖该模块时可以直接从仓库更新,而不用自己去编译。
    5. maven有很多插件,便于功能扩展,比如配置反向生成工具等

    缺点如下:

    1. maven是一个庞大的构建系统,学习难度大
    2. maven采用约定优于配置的策略(convention over configuration),虽然上手容易,但是一旦出了问题,难于调试。
    3. 当依赖很多时,m2eclipse 老是搞得Eclipse很卡。
    4. 中国的网络环境差,很多repository无法访问,比如google code, jboss 仓库无法访问等。
    • Maven坐标的含义?

      Maven给我们制定了一套规则——使用坐标进行唯一标识。Maven的坐标元素包括groupId、artifactId、version、packaging、classfier。只要我们提供正确的坐标元素,Maven就能找到对应的构件,首先去你的本地仓库查找,没有的话再去远程仓库下载。如果没有配置远程仓库,会默认从中央仓库地址(http://repo1.maven.org/maven2)下载构件,该中央仓库包含了世界上大部分流行的开源项目构件,但不一定所有构件都有。

       在我们自己开发项目的时候,也是要给我们的项目定义坐标的,这是强制性要求,只有这样,其他项目才能引用该项目的构件。

    <?xml version="1.0"?>
    <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.cnten.common</groupId>
        <artifactId>cnten-common</artifactId>
         <version>0.0.1</version>
         
        <parent>
            <groupId>com.cnten.platform</groupId>
            <artifactId>cnten</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </parent> 
      
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
      
        <dependencies>
          <!-- BeanUtils 开始 -->
            <dependency>
                <groupId>commons-beanutils</groupId>
                <artifactId>commons-beanutils</artifactId>
                <version>1.9.2</version>
            </dependency> 
            <!-- BeanUtils 结束 -->
        </dependencies>
    </project>
    • 浅谈repository与mirror的区别?

    repository里存放的都是各种jar包和maven插件。当向仓库请求插件或依赖的时候,会先检查local repository,如果local repository有则直接返回,否则会向remote repository请求,并缓存到local repository。也可以把做的东西放到本地仓库,仅供本地使用;或上传到远程仓库,供大家使用。

    mirror相当于一个拦截器,它会拦截maven对remote repository的相关请求,把请求里的remote repository地址,重定向到mirror里配置的地址。

    ps: 远程仓库可以在工程的pom.xml文件里指定,如果没指定,默认就会把下面这地方做远程仓库,即默认会到http://repo1.maven.org/maven2这个地方去请求插件和依赖包。

    <repository> 
        <snapshots> 
            <enabled>false</enabled>
            </snapshots> 
        <id>central</id> 
        <name>Maven Repository Switchboard</name>
        <url>http://repo1.maven.org/maven2</url> 
    </repository>

    本地仓库默认在你本地的用户目录下的.m2/repository目录下。

    mirror就是镜像,主要提供一个方便地切换远程仓库地址的途径。比如,上班的时候在公司,用电信的网络,连的是电信的仓库。回到家后,是网通的网络,我想连网通的仓库,就可以通过mirror配置,统一把我工程里的仓库地址都改成联通的,而不用到具体工程配置文件里一个一个地改地址。
    mirror的配置在.m2/settings.xml里。如:

    <mirrors> 
       <mirror> 
        <id>UK</id>
        <name>UK Central</name> 
        <url>http://uk.maven.org/maven2</url> 
        <mirrorOf>central</mirrorOf> 
       </mirror>
    </mirrors>

    这样的话,就会给上面id为central的远程仓库做了个镜像。以后向central这个仓库发的请求都会发到http://uk.maven.org/maven2而不是http://repo1.maven.org/maven2了。
    <mirrorOf>central</mirrorOf>里是要替代的仓库的id。如果填*,就会替代所有仓库

    • 配置镜像的好处?

    1、在不配置镜像的情况下,maven默认会使用中央库.

    2、maven中央库在国外,有时候访问会很慢,尤其是下载较大的依赖的时候,有时候速度会很慢,甚至会出现无法下载的情况.

    3、为了解决依赖下载速度的问题,需要配置maven国内镜像

    说白了 mirror可以拦截对远程仓库的请求 , 改变对目标仓库的下载地址

    • Maven项目 打war 包时 需注意?

    run --> Maven install 需要在pom.xml中 <build></build>中 添加 配置文件 以免 生成war后无配置文件报错

                <resource>
                    <directory>src/main/resources</directory>
                    <includes>  
                          <include>**/*.properties</include>
                          <include>spring-mvc.xml</include>
                          <include>spring/spring-mybatis.xml</include>
                          <include>**/*.xml</include>
                      </includes>
                </resource> 
            

    在没有class文件的时候 需要maven clean 项目后 再Maven install 即可

    • setting.xml里配置<profile>的作用?

    <?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:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
    
        <!--本地仓库。该值表示构建系统本地仓库的路径。其默认值为~/.m2/repository。-->
        <localRepository>F:dev-space
    epo</localRepository>
      
        <!--Maven是否需要和用户交互以获得输入。如果Maven需要和用户交互以获得输入,则设置成true,反之则应为false。默认为true。-->  
        <interactiveMode>true</interactiveMode>
        <!--表示Maven是否需要在离线模式下运行。如果构建系统需要在离线模式下运行,则为true,默认为false。当由于网络设置原因或者安全因素,构建服务器不能连接远程仓库的时候,该配置就十分有用。 -->  
        <offline>false</offline> 
        <!--当插件的组织Id(groupId)没有显式提供时,供搜寻插件组织Id(groupId)的列表。该元素包含一个pluginGroup元素列表,每个子元素包含了一个组织Id(groupId)。当我们使用某个插件,并且没有在命令行为其提供组织Id(groupId)的时候,Maven就会使用该列表。默认情况下该列表包含了org.apache.maven.plugins。 -->  
        <pluginGroups>
            <pluginGroup>org.mortbay.jetty</pluginGroup>
            <pluginGroup>org.apache.maven.plugins</pluginGroup>
        </pluginGroups>
        
        <!--配置服务端的一些设置。一些设置如安全证书不应该和pom.xml一起分发。这种类型的信息应该存在于构建服务器上的settings.xml文件中。-->  
        <servers>
            <!--服务器元素包含配置服务器时需要的信息 -->  
            <server>  
                <!--这是server的id(注意不是用户登陆的id),该id与distributionManagement中repository元素的id相匹配。-->  
                <id>development</id>  
                <!--鉴权用户名。鉴权用户名和鉴权密码表示服务器认证所需要的登录名和密码。 -->  
                <username>cnten</username>  
                <!--鉴权密码 。鉴权用户名和鉴权密码表示服务器认证所需要的登录名和密码。 -->  
                <password>123</password>  
            </server>
            
        </servers>
    
        <!--为仓库列表配置的下载镜像列表。 -->  
        <mirrors>
            <!--给定仓库的下载镜像。 -->  
            <mirror>  
                <!--该镜像的唯一标识符。id用来区分不同的mirror元素。 -->  
                <id>public</id>  
                <!--镜像名称 -->  
                <name>Public Repositories</name>
                <!--该镜像的URL。构建系统会优先考虑使用该URL,而非使用默认的服务器URL。 -->  
                <url>http://192.168.1.99:8081/nexus/content/groups/public/</url>  
                <mirrorOf>*</mirrorOf>  
            </mirror>
        </mirrors>
        
        <profiles>  
            <!--根据环境参数来调整的构件的配置-->  
            <profile>
                <id>jdk1.7.0_75</id>
    
                <activation>
                    <activeByDefault>true</activeByDefault>  
                    <jdk>1.7</jdk>
                </activation>
    
                <properties>   
                    <maven.compiler.source>1.7</maven.compiler.source>   
                    <maven.compiler.target>1.7</maven.compiler.target>   
                    <maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion>   
                </properties>    
            </profile>
            
            <profile>
                <id>nexus</id>
                <repositories>
                    <repository>
                        <id>central</id>
                        <url>http://192.168.1.99:8081/nexus/content/groups/public</url>
                        <releases>
                            <enabled>true</enabled>
                            <updatePolicy>always</updatePolicy>
                        </releases>
                        <snapshots>
                            <enabled>true</enabled>
                            <updatePolicy>always</updatePolicy>
                        </snapshots>
                    </repository>
                </repositories>
                <pluginRepositories>
                    <pluginRepository>
                        <id>central</id>
                        <url>http://192.168.1.99:8081/nexus/content/groups/public</url>
                        <releases>
                            <enabled>true</enabled>
                            <updatePolicy>always</updatePolicy>
                        </releases>
                        <snapshots>
                            <enabled>false</enabled>
                            <updatePolicy>always</updatePolicy>
                        </snapshots>
                    </pluginRepository>
                </pluginRepositories>
            </profile>
        </profiles>
        <activeProfiles>
            <activeProfile>nexus</activeProfile>
        </activeProfiles>
    </settings>

    在现实实际中,不可能所有的项目都会用到继承,而我们又不想老是去配置<repositories>(其实配置一下也OK,看个人喜好啦。),这时可以把<repositories>这部分配置到maven的setting.xml的节点<profiles>里。<profiles>里可以配置多个<profile>,<repositories>里也是可以配置多个<repository>。按照我自己的理解,每个<profile>就相当于<repositories>的<repository>。不同点在于:<repositories>里配置的多个<repository>都是有效的;而<profiles>里配置了多个<profile>,需要使用<activeProfiles>来进行激活,激活了哪个<profile>,哪个<profile>才生效。

    在pom.xml文件中 profile的作用为 可灵活在多个项目环境中(生产,测试,开发等)切换配置文件

    <profiles>
       <profile>
          <!-- 本地开发环境 -->
          <id>dev</id>
          <properties>
             <profiles.active>dev</profiles.active>
          </properties>
        <activation>
           <activeByDefault> true</activebydefault>
           </activation>
       </profile>
       <profile>
          <!-- 测试环境 -->
          <id>test</id>
          <properties>
             <profiles.active>test</profiles.active>
          </properties>
       </profile>
       <profile>
          <!-- 生产环境 -->
          <id>product</id>
          <properties>
             <profiles.active>product</profiles.active>
          </properties>
       </profile>
    </profiles>
     
    <build>
       <finalname>SpringMVC-master</finalname>
       <filters>
          <filter>src/main/resources/environment/env-${profiles.active}.properties</filter>
       </filters>
       <resources>
          <resource>
             <directory>src/main/resources</directory>
             <filtering>true</filtering>
          </resource>
       </resources>
     
    </build>
    •  本地仓库有jar包maven依然报错的原因?

    问题在_remote.repositories,在有错误的jar包的仓库地址里,可以发现比正常的多一个

    说明这个依赖是从私服中下载下来的。而此时我是连不上私服的,所以会有jar包lastupdate后缀的文件出现,但是下载不到,还有lastupdate.properties信息。

    解决方法:将报错依赖的_remote.repositories中的public=改成central=,后者删除该文件,刷新pom.xml即可!

  • 相关阅读:
    Python中的赋值与深浅拷贝
    Python面试题解析之前端、框架和其他
    Python面试题解析之数据库与缓存
    Python面试题解析之网络编程与并发
    Python面试题解析之Python基础篇
    2、使用rpm包安装grafana
    1、在Centos上安装Grafana
    MySQL所学所思所想
    运维感悟(信息大爆炸的时代,该学习什么来保持着我们的竞争力)
    C#.NET 中的 Timer 计时器及 3 种使用方法
  • 原文地址:https://www.cnblogs.com/king-brook/p/10063281.html
Copyright © 2011-2022 走看看