• Maven学习,使用笔记


    Maven使用笔记

    使用Maven有一段时间了,用它做过几个项目的构建工具,感觉还是非常不错的,省去很多不必要的麻烦,比如jar包的依赖管理,升级等,还可以处理一些繁杂的事务,比如简单的代码生成,数据导入导出等。当然这里有一定的学习成本!

    本文就一些常规使用做了介绍,包括一些需要注意的地方和本人常人的配置插件等。

    特别说明,由于settings.xml是针对全局或个人的设置,不能随项目走,所以本文直接无视settings.xml的配置!

    Maven一般目录结构

    .
    pom.xml
    src
       |-main
             |-java
             |-resources
             |-webapp
       |-test
             |-java
             |-resources
    target
    

    Maven属性设置

    项目属性配置

    加*项是建项目必要属性

    属性名称描述
    groupId * 当前项目隶属的上级项目ID,一般是系列相关子项目的组ID,如:org.springframework
    artifactId * 当前项目模块ID,一般为实际项目ID,如:spring-web
    version * 此项目模块的版本
    packaging 项目类型,jar或war,默认为jar
    name 项目名称,如果跟IDE配合使用时IDE会识别此名称
    description 项目描述
    organization 所属组织
    licenses 许可协议
    mailingLists 邮件列表
    developers 开发者
    contributors 贡献者
    issueManagement 问题追踪系统
    ciManagement 持续集成系统
    scm 版本控制系统

    POM一般属性变量

    名称说明
    ${basedir} 项目根目录,包含pom.xml文件的目录
    ${version} 项目的版本
    ${pom.build.sourceDirectory} 项目的主源码目录,默认为:src/main/java
    ${pom.build.testSourceDiretory} 项目的测试源码目录, 默认为:src/test/java
    ${pom.build.directory} 项目构建输出目录,默认为target
    ${pom.outputDirectory} 项目主代码编译输出目录,默认为: target/classess
    ${pom.testOutputDirectory} 项目主代码编译输出目录,默认为: target/test-classess
    ${pom.groupId} 项目的groupId
    ${pom.artifactId} 项目的artifactId
    ${pom.version} 项目的版本
    ${pom.build.finalName} 项目打包输出文件的名称,默认为${pom.artifactId}-${pom.version}

    以上build属性可通过pom.xml文件中build结点指定如:

    <build>
        <directory>${pom.basedir}/target</directory>
        <outputDirectory>${pom.build.directory}/classes</outputDirectory>
        <finalName>${pom.artifactId}-${pom.version}</finalName>
        <testOutputDirectory>${pom.build.directory}/test-classes</testOutputDirectory>
        <sourceDirectory>${pom.basedir}/src/main/java</sourceDirectory>
        <scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
        <testSourceDirectory>${pom.basedir}/src/test/java</testSourceDirectory>
        <resources>
          <resource>
            <directory>${pom.basedir}/src/main/resources</directory>
          </resource>
        </resources>
        <testResources>
          <testResource>
            <directory>${pom.basedir}/src/test/resources</directory>
          </testResource>
        </testResources>
    <build>
    

    更多内容:MavenPropertiesGuide

    自定义属性变量

    在根结点增加:

    <projecties>
        <spring.version>3.1-RELEASE</spring.version>
        <hibernate.version>4.2-FINAL</hibernate.version>        
        <!-- 使用${spring.version}读取 -->
    </projecties>
    

    资源文件使用Maven变量

    如有文件 src/main/resources/application.properties

    # application.properties
    application.name=${pom.name}
    application.version=${pom.version}
    

    执行命令:mvn process-resources maven会给其中的亦是赋值:

    # application.properties
    application.name=Maven Quick Start Archetype
    application.version=1.0-SNAPSHOT
    

    更多内容:http://maven.apache.org/guides/getting-started/index.html#How_do_I_filter_resource_files

    Maven依赖管理

    自定义源地址

    如在maven的中央仓库中没有你要用的jar包,通过自定义源解决:

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

    排除依赖和子项目依赖

    <dependency>
        <!-- 子项目,被依赖的子项目必须经过maven的install安装,不然maven还是找不到! -->
        <groupId>bgonline</groupId>
        <artifactId>foundation</artifactId>
        <version>1.0.0</version>
        <!-- 排除 -->
        <exclusions>
            <exclusion>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    

    本地JAR包安装

    ##安装jar文件
    call mvn install:install-file -Dfile=xxx-1.0.0.jar -DgroupId=com.xx -DartifactId=xx -Dversion=1.0.0 -Dpackaging=jar
    ##安装pom文件
    call mvn install:install-file -Dfile=xxx-1.0.0.pom.xml -DgroupId=com.xx -DartifactId=xx -Dversion=1.0.0 -Dpackaging=pom
    

    Maven插件管理

    添加插件:

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <version>1.3</version>
                </plugin> 
            </plugins>
        </pluginManagement>
    </build>
    

    自定义插件源

    <pluginRepositories>
        <pluginRepository>
            <id>central</id>
            <name>Maven Plugin Repository</name>
            <url>http://repo1.maven.org/maven2</url>
            <layout>default</layout>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <releases>
                <updatePolicy>never</updatePolicy>
            </releases>
        </pluginRepository>
    </pluginRepositories>
    

    常用插件

    名称说明
    jetty-maven-plugin jetty插件,轻量级web容器,推荐阶段开发使用
    maven-antrun-plugin 跑ant命令插件,常用来做文件处理,sql执行等,基本包括ant所有功能
    native2ascii-maven-plugin 转ascii,如多语言配置文件的中文转成ascii码解决乱码问题
    versions-maven-plugin 检测所有依赖的更新情况
    maven-surefire-plugin 生成测试报告,配全Testng,指定单元测试的配置文件,进行分组、分类、分包测试,可参考Testng文档说明

    更多内容:plugins

    Maven Profile使用

    有时候会根据不同的情况执行不现的构建命令,这就用到maven的profile,profile可以直接写在pom.xml里也可以被提出到独立文件profiles.xml同pom.xml同级目录或settings.xml,但Maven3只支持写在pom.xml文件里,why?!

    1.使用profile+ant执行sql做数据初始化:

    <profile>
        <id>INIT-DB-DATA</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <configuration>
                        <target>
                            <sql driver="${jdbc.driver}" url="${jdbc.url}" userid="${jdbc.username}" password="${jdbc.password}" onerror="continue">
                                <classpath refid="maven.runtime.classpath"/>
                                <transaction src="src/main/resources/sql/${jdbc.direct}/schema.sql"/>
                            </sql>
                        </target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
    

    2.使用maven profile ant hibernate-tools生成类bean:

    <profile>
        <id>Gen-Java-Bean</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <configuration>
                        <target>
                            <echo message="生成表ENTITY类……"/>
                            <property name="toolsDir" value="src/test/tools"/>
                            <!-- 这里需要指定hibernatetool相关jar包,自行下载 -->
                            <path id="lib.class.path">
                                <fileset dir="${toolsDir}/lib">
                                    <include name="*.jar"/>
                                </fileset>
                            </path>
                            <taskdef name="hibernatetool" classname="org.hibernate.tool.ant.HibernateToolTask" classpathref="lib.class.path"/>
                            <hibernatetool destdir="${toolsDir}/lib/build">
                                <jdbcconfiguration propertyfile="${toolsDir}/lib/cfg/jdbc.properties" revengfile="${toolsDir}/lib/cfg/hibernate.reveng.xml"/>
                                <!-- 指定hibernatetools生成bean的模板,根据自己需要定制生成内容,用的freemarker引擎,在hibernate-tools.jar包里有默认模板 -->
                                <hbmtemplate
                                        destdir="${toolsDir}/lib/build"
                                        templatepath="${basedir}/${toolsDir}/lib/hbmtemplates/"
                                        templateprefix="/hbmtemplates"
                                        filepattern="{class-name}Entity.java"
                                        template="pojo2/Pojo.ftl">
                                    <property key="ejb3" value="false"/>
                                    <property key="jdk5" value="false"/>
                                </hbmtemplate>
                                <!-- 或者直接 <hbm2java/> 只是这样使用的是默认模板 -->
                            </hibernatetool>
                        </target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
    

    更多内容:profiles.html

    Maven多项目配置

    创建如下目录结构:

    +- pom.xml 父
    +- my-app
    | +- pom.xml 子1,jar类型
    | +- src
    |   +- main
    |     +- java
    +- my-webapp
    | +- pom.xml 子2,webapp类型
    | +- src
    |   +- main
    |     +- webapp
    

    父pom内容如下:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.mycompany.app</groupId>
      <artifactId>app</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>pom</packaging>
    
      <modules>
        <module>my-app</module>
        <module>my-webapp</module>
      </modules>
    </project>
    

    注:一些项目全局属性可在此pom文件中设置,比如项目信息,所有依赖等,这样在子项目就不用重复申明,如依赖可省掉版本号,直接使用父pom中的版本,这样可以统一管理所有项目的依赖版本。

    子1的pom内容如下:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <groupId>com.mycompany.app</groupId>
        <artifactId>app-jar</artifactId>
        <packaging>jar</packaging>
        <parent>
            <groupId>com.mycompany.app</groupId>
            <artifactId>app</artifactId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        ...
    

    子2的pom内容如下:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <groupId>com.mycompany.app</groupId>
        <artifactId>app-war</artifactId>
        <packaging>war</packaging>
        <parent>
            <groupId>com.mycompany.app</groupId>
            <artifactId>app</artifactId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        ...
    

    子2需要依赖子1,配置如下:

    ...
    <dependencies>
    <dependency>
        <groupId>com.mycompany.app</groupId>
        <artifactId>my-app</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    ...
    </dependencies>
    

    最后在父pom所在目录执行mvn clean install命令,jar包会被安装本地仓库,war会被发布到target目录。

    Maven创建项目

    创建java项目

    mvn archetype:generate \
      -DarchetypeGroupId=org.apache.maven.archetypes \
      -DgroupId=com.mycompany.app \
      -DartifactId=my-app
    

    生成的目录结构:

    my-app
    |-- pom.xml
    `-- src
        |-- main
        |   `-- java
        |       `-- com
        |           `-- mycompany
        |               `-- app
        |                   `-- App.java
        `-- test
            `-- java
                `-- com
                    `-- mycompany
                        `-- app
                            `-- AppTest.java
    

    创建java webapp

    mvn archetype:generate \
    -DarchetypeGroupId=org.apache.maven.archetypes \
    -DarchetypeArtifactId=maven-archetype-webapp \
    -DgroupId=com.mycompany.app \
    -DartifactId=my-webapp
    

    生成的目录结构:

    +- my-webapp
    | +- pom.xml
    | +- src
    |   +- main
    |     +- resources
    |     +- webapp
    |       +- index.jsp
    |       +- WEB-INF
    |         +- web.xml
    

    之后根据需要在main下创建java目录,在src创建test目录。

    生命周期常用命令

    1. 编译 mvn compile,编译测试 mvn test-compile,不执行测试,仅编译
    2. 测试 mvn test,执行测试
    3. 打包 mvn package,java项目打成jar包,web项目打包war包
    4. 安装 mvn install,将自己java项目生成的jar包安装到本地仓库
    5. 站点 mvn site,根据pom.xml配置信息生成项目相关的站点在target/site
    6. 清除 mvn clean,将target目录下build后的内容删除

    更多内容:lifecycle.html

    更多Maven参考

    POM详细说明文档 :http://maven.apache.org/pom.html
    POM说明3.0.5版:http://maven.apache.org/ref/3.0.5/maven-model/maven.html
    Maven-3.0.5文档:http://maven.apache.org/ref/3.0.5/
    maven.apache.org:http://maven.apache.org/guides/getting-started/
    docs.codehaus.org:http://docs.codehaus.org/display/MAVENUSER

  • 相关阅读:
    主机的IOPS需求转换成硬盘实际IOPS负载
    IT安全运维职责
    IT应用运维职责
    存储RAID 选择策略
    交换机接口下错包计数,哪些是属于物理链路(包括本端设备和对端设备硬件问题)引起的
    华为交换机SNMP配置
    c# 位与运算符&简单实现复选框功能【实际应用】
    centos7 安装谷歌浏览器教程
    centos7下 Consul安装
    .netcore3.1 获取请求头header中认证信息并调用其它接口
  • 原文地址:https://www.cnblogs.com/xguo/p/3113146.html
Copyright © 2020-2023  润新知