maven学习随笔

    Apache Maven,是一个软件(特别是java软件)项目及自动构建工具,由Apache软件基金会所提供。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、测试报告和文档等。

     maven有规定好的目录结构,项目必须严格遵从。一个 maven 项目在默认情况下会产生 JAR 文件,另外 ,编译后 的 classes 会放在 ${basedir}/target/classes 下面, JAR 文件会放在${basedir}/target 下面

    

目录 作用
${basedir} 存放 pom.xml和所有的子目录
${basedir}/src/main/java 项目的 java源代码
${basedir}/src/main/resources 项目的资源,比如说 property文件
${basedir}/src/test/java

项目的测试类,比如说 JUnit代码

${basedir}/src/test/resources 测试使用的资源


        一,maven配置文件

        全局配置文件:{installed_dir}/conf/settings.xml

        优先级更高的配置文件:${user.home}/.m2/settings.xml

        二,maven本地和远程仓库

        本地仓库是远程仓库的一个缓冲和子集,当你构建Maven项目的时候,首先会从本地仓库查找资源,如果没有,那么Maven会从远程仓库下载到你本地仓库。这样在你下次使用的时候就不需要从远程下载了。如果你所需要的jar包版本在本地仓库没有,而且也不存在于远程仓库,Maven在构建的时候会报错,这种情况可能发生在有些jar包的新版本没有在Maven仓库中及时更新。

        1,自定义的本地仓库路径     

如下配置,在setting.xml文件中,本地仓库有默认配置,在${user.home}/.m2/repository目录中。

  <!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>
  -->

当然,我们可以在settings.xml中自定义本地仓库,加入以下字段即可:

<localRepository>/opt/java/repo</localRepository>


也可以通过命令行的模式指定本地仓库:(不推荐这么做)

# mvn clean install -Dmaven.repo.local=/home/juven/myrepo/


        2,自定义远程仓库

     默认远程仓库配置:

    在apache-maven-3.0.4/lib/maven-model-builder-3.0.4.jar文件中org/apache/maven/model/pom-4.0.0.xml文件中定义了中央仓库:

<repositories>

    <repository>

      <id>central</id>

      <name>Central Repository</name>

      <url>http://repo.maven.apache.org/maven2</url>

      <layout>default</layout>

      <snapshots>

        <enabled>false</enabled>

      </snapshots>

    </repository>

  </repositories>


  <pluginRepositories>

    <pluginRepository>

      <id>central</id>

      <name>Central Repository</name>

      <url>http://repo.maven.apache.org/maven2</url>

      <layout>default</layout>

      <snapshots>

        <enabled>false</enabled>

      </snapshots>

      <releases>

        <updatePolicy>never</updatePolicy>

      </releases>

    </pluginRepository>

  </pluginRepositories>


   setting.xml配置文件中定义远程仓库,优先级高,配置如下:

   pom.xml的作用范围限于一个项目, 但一个公司/组织通常不只开发一个项目,那么为了避免重复配置,那么我们可以把一些公共配置放在${MAVEN_HOME}/conf/setting.xml(或${user.home}/.m2/setting.xml中。下面是在setting.xml中配置一个远程仓库的例子.

<settings>  
 <profiles>
   <profile>
      <!-- 其他profile -->
   </profile>
   <profile>  
     <id>myProfiel</id>  
     <!--  在这里加入<repositories>及<pluginRepositories>  -->
   </profile>  
 </profiles>  
 
 <!-- 声明哪些profile被激活,或根据某些条件激活 -->
 <activeProfiles>  
   <activeProfile>myProfiel</activeProfile>  
 </activeProfiles>  
 
</settings>

     这里通过<activeProfile>元素来激活这个profile,这样我们就可以全局的使用这个配置,不再需要为每个POM做重复的配置了(也可以针对特定的条件激活,比如某些profile只有在使用JDK 1.4时才生效)。

     在实际的操作过程中,setting.xml配置的远程仓库,可以是通过nexus建立的公司自己的仓库。


    pom.xml文件定义远程仓库,优先级最高,配置如下:

    <repositories>

        <repository>

            <id>Nexus</id>

            <name>Nexus Public Repository</name>

            <url>http://maven.test.sohu.com/nexus/content/groups/public</url>

        </repository>

        <repository>

            <id>nexus-snapshots</id>

            <name>Nexus Snapshot Repository</name>

            <url>http://maven.test.sohu.com/nexus/content/repositories/snapshots</url>

            <snapshots>

                <enabled>true</enabled>

            </snapshots>

        </repository>

    </repositories>

在pom中允许配置多个repository和 plugin repository,其中<snapshots><enabled>true</enabled</snapshots>

告诉Maven可以从这个仓库下载snapshots版本的构件。而如果有<snapshots><enabled>false</enabled></snapshots>这样的配置,则告诉Maven不要从这个仓库下载snapshot版本的构件。

Maven在使用第三方构件和插件时是分开来配置的,所以如果我们也希望插件的下载也通过我们自己的仓库来下载,那么我们就需要配置pluginRepository.至于<pluginRepositories>,这是配置Maven从什么地方下载插件构件,Maven的所有行为都是通过插件来完成的。 <pluginRepository>的配置与<repository>类似。


    三,maven发布jar包到nexus服务器

    1),在pom.xml文件中可以定义如下代码:

    <distributionManagement>
        <repository>
            <id>nexus-releases</id>
            <name>Nexus Release Repository</name>
            <url>http://maven.test.sohu.com/nexus/content/repositories/releases</url>
        </repository>

        <snapshotRepository>
            <id>nexus-snapshots</id>
            <name>Nexus Snapshot Repository</name>
            <url>http://maven.t.sohu.com/nexus/content/repositories/snapshots</url>
            <uniqueVersion>false</uniqueVersion>
        </snapshotRepository>
    </distributionManagement>

    2)确保Nexus服务器的Releases仓库属性正确。

         进入Nexus控制台,用admin登录。点开“Views/Repositories”选“Repositories”,在Repositories列表中选择Releases,点configuration,Deployment Policy默认为“Disable Redeploy”,点击修改为“Allow Redeploy”并保存。

      3)修改用户目录下的settings.xml文件。

         settings.xml文件路径为${user.home}/.m2或%{m2_home}/conf/。Windows7系统目录为C:/Users/用户名/.m2。

         找到<servers>,然后修改信息如下:
 <servers>
     <server>
       <id>releases</id>
       <username>deployment</username>
       <password>deployment</password>
     </server>
 </servers>

注意:server的id必须和第1)点中的repository的id一致。用户名最好用deployment。

      4)重新设定用户deployment的密码。

         进入Nexus控制台,点开Security选Users,在用户列表中右键点击deployment用户,选Set Password重新设定deployment的密码为“deployment”,当然也可设置为其他,只要与第3)点server配置一致即可。

      5)在工程主目录下(POM文件所在目录)运行“mvn deploy:deploy”即能实现版本的构建和发布。


    四,maven使用assembly实现自定义打包

pom.xml中设置如下:

<build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <!-- not append assembly id in release file name -->
                    <appendAssemblyId>false</appendAssemblyId>
                    <descriptors>
                        <descriptor>src/main/assemble/package.xml</descriptor>
                    </descriptors>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

  其中<artifactId>maven-assembly-plugin</artifactId>的maven-assembly-plugin是这个插件的标准命名,在maven2.0.*中带的默认版本是

    appendAssemblyId属性控制是否在生成的打包文件的文件名中包含assembly id。

    descriptor属性指定maven-assembly-plugin的配置文件,当然我设置的是src/main/assemble/package.xml.容许使用多个,功能强大当然用法也复杂,对于简单情况一个足矣。

    execution的设置是为了将maven-assembly-plugin继承到标准的maven打包过程中,这样在运行命令mvn package时就会执行maven-assembly-plugin的操作,从而实现我们需要的自定义打包,这样就不用再去执行mvn assembly:assembly指令了。


    五,maven的常用命令和参数、

1,常用参数

mvn -e 显示详细错误
mvn -U 强制更新snapshot类型的插件或依赖库(否则maven一天只会更新一次snapshot依赖)
mvn -o 运行offline模式,不联网更新依赖
mvn -N 仅在当前项目模块执行命令,关闭reactor
mvn -pl module_name在指定模块上执行命令
mvn -ff 在递归执行命令过程中,一旦发生错误就直接退出

mvn -Dxxx=yyy指定java全局属性

    mvn -Dwtpversion=2.0 指定maven版本
    mvn -Dmaven.test.skip=true 如果命令包含了test phase,则忽略单元测试
    mvn -DuserProp=filePath 指定用户自定义配置文件位置
    mvn -DdownloadSources=true -Declipse.addVersionToProjectName=true eclipse:eclipse 生成eclipse项目文件,尝试从仓库下载源代码,并且生成的项目包含模块版本(注意如果使用公用POM,上述的开关缺省已打开)


mvn -Pxxx引用profile xxx。profile的定义在pom.xml文件中,一般id为test或者product,一个是测试环境的配置,一个是线上环境的配置。配置如下:

<profiles>

        <profile>

            <id>test</id>

            <properties>

                <env>test</env>

            </properties>

        </profile>

        <profile>

            <id>product</id>

            <properties>

                <env>product</env>

            </properties>

            <activation>

                <activeByDefault>true</activeByDefault>

            </activation>

        </profile>

    </profiles>


2,常用命令

mvn compile     编译生成class文件

mvn test        运行程序中的单元测试

mvn clean       移除所有上一次构建生成的文件(例如test和target目录)

mvn package     打包编译后的代码,在target目录下生成package文件,默认会生成jar文件,如果有自定义打包策略,可以生成zip等类型文件。需要的依赖文件,会先从本地仓库找(linux默认为~/.m2/repository/),没有的话,再从远处仓库download

mvn install      在本地Repository中安装jar,方便本地其它项目使用。默认是安装打好的包到server的本地mvn仓库中,linux默认为~/.m2/repository/


常用的打包命令:

# mvn -U -Dmaven.test.skip=true -P test -f pom.xml clean package install


你可能感兴趣的:(maven打包,maven使用,mvn打包,mvn命令)