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即可!

  • 相关阅读:
    BZOJ5212 ZJOI2018历史(LCT)
    BZOJ5127 数据校验
    253. Meeting Rooms II
    311. Sparse Matrix Multiplication
    254. Factor Combinations
    250. Count Univalue Subtrees
    259. 3Sum Smaller
    156. Binary Tree Upside Down
    360. Sort Transformed Array
    348. Design Tic-Tac-Toe
  • 原文地址:https://www.cnblogs.com/king-brook/p/10063281.html
Copyright © 2011-2022 走看看