0%

maven
构建
清理:将之前编译的class字节码文件删除
编译:将java源程序编译成为class字节码文件
测试:自动测试,自动调用junit程序
报告:测试程序执行的结果
打包:动态web工程打war包,java工程打jar包
安装:将打包得到的文件复制到仓库中指定的位置
部署:将动态web工程生成的

TODO 待整理

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#查看maven版本
mvn -v
#清理
mvn clean
#编译
mvn compile
#编译测试程序
mvn test-compile
#执行测试
mvn test
#打包
mvn package
# 跳过测试
mvn clean package -Dmaven.test.skip=true
mvn clean package -DskipTests
#安装到本地仓库
mvn install
mvn install:install-file -Dfile= -DgroupId= -DartifactId= -Dversion= -Dpackaging=jar
# 发布
mvn deploy
# 生成项目站点
mvn site
# 创建maven项目
mvn archetype:create -DgroupId= -DartifactId= -DpackageName=
# 测试代码的覆盖率统计信息
mvn cobertura:cobertura
# 查看完整的pom文件(包含有超级pom内容的pom文件)
mvn help:effective-pom
# 查看插件的目标
mvn help:describe -Dplugin=插件名称
mvn help:describe -Dplugin=插件名称 -Dfull
# 查看所有的激活的profiles 会按照从上到下的顺序覆盖,会取用最后一个profile的属性值
mvn help:active-profiles
# 查看所有的profiles
mvn help:all-profiles
# 查看依赖树
mvn dependency:tree

目录结构
src 源码 主程序
main
- java 源文件
- resources 框架配置文件
test
- java
- resources
pom.xml

POM
Project Object Model 项目对象模型
pom.xml maven的核心配置文件

坐标
groupid: 公司域名倒叙+项目名
artifactid: 模块名
version: 版本
packaging: 打包方式
classifer: 定义输出的一些附件

依赖
依赖的范围
①compile
- 对主程序是否有效(main):有效
- 对测试程序是否有效(test):有效
- 是否参与打包:参与
②test
- 对主程序是否有效:无效
- 对测试程序是否有效:有效
- 是否参与打包:不参与
③provided
只参与开发环节,部署运行时不需要,在服务器上存在,如servlet-api.jar
- 对主程序是否有效:有效
- 对测试程序是否有效:有效
- 是否参与打包:不参与
④runtime
运行时有效,编译时无效,如JDBC
⑤system
不从maven仓库获取,通过systemPath指定jar路径
⑥import
用于一个dependencyManagement对另一个dependencyManagement的继承

依赖原则

依赖的传递性 非compile范围的无法传递

依赖路径最短优先原则
项目依赖了两个jar包,其中A-B-C-D , A-D。由于第二条路径最短,所以项目使用的是第二个D。

pom文件中申明顺序优先
路径距离相同的情况下,先声明者优先,dependency的声明顺序

覆写优先
子pom内声明的优先于父pom中的依赖

1
2
依赖的排除
<exclusions>
版本的统一管理
    使用<properties>使用自定义标签号
        <properties>
            <spring.version>4.1.2</spring.version>  
        </properties>

        依赖中使用版本
        ${spring.version}

仓库
本地仓库:
私服:局域网内的
中央仓库:
中央仓库镜像:为了分担中央仓库的流量

仓库中包含
①maven工程所需要的插件
②第三方框架或工具的jar包
③自己开发的Maven工程

生命周期

无论是执行哪个阶段,都会从最初的位置开始执行
maven有三套生命周期
一、clean生命周期  在构建之前进行一些清理工作
    pre-clean clean之前完成的工作
    clean 移除上一次构建生成的文件
    post-clean 执行一些需要在clean之后立刻完成的工作

二、Default 生命周期  构建的核心,编译、测试、打包、安装、部署    每个都是一个目标goal 在插件中指定目标
    validate: 验证工程是否正确
    generate-sources
    process-sources  
    generate-resources
    process-resources  复制并处理资源文件,至目标目录,准备打包
    complie 编译
    process-classes
    generate-test-sources
    process-test-sources
    generate-test-resources
    process-test-resources  复制并处理资源文件,至目标测试目录
    test-complie  编译测试代码
    process-test-classes
    test 测试
    prepare-package
    package  打包

    pre-integration-test
    integration-test   可以将包处理发布到一个能够进行集成测试的环境
    post-integration-test

    verify  验证包是否有效

    install 安装至本地仓库

    deploy 发布到远程仓库

三、Site生命周期  生成项目报告、站点、发布站点
    pre-site:执行一些需要在生成站点文档之前的工作
    site:生成项目的站点文档
    post-site:执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
    site-deploy:将生成的站点文档部署到服务器上


插件中配置该插件执行的生命周期
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-source-plugin</artifactId>
    <version>3.7.0</version>
    <executions>
        <execution>
            <phase>compile</phase>  生命周期
            <goals>
                <goal>jar<goal>  目标
            </goals>
        </execution>
    </executions>
</plugin>

继承
继承父工程的版本

在父工程中进行统一的依赖管理,子工程也可以不使用该依赖的version
依赖管理
<dependencyManagement>
    <dependencies>
        <denpendency>

        </denpendency>
    </dependencies>
</dependencyManagement>

聚合
在maven工程中可以配置多个模块

指定相对路径

寻找依赖的插件或者jar包 ,先寻找本地仓库,连接中央仓库下载

配置构建过程






maven 有一个超级pom 在lib下的maven-model-builder.jar中

可以使用mvn help:effective-pom命令来查看完整的pom文件(包含有超级pom内容的pom文件

命令
mvn cobertura:cobertura 测试代码的覆盖率统计信息

mvn archetype:create -DgroupId= -DartifactId= -DpackageName= 创建maven工程
mvn install:install-file -Dfile= -DgroupId= -DartifactId= -Dversion= -Dpackaging=jar 上传jar包到本地仓库
mvn help:describe -Dplugin=插件名称 查看插件的目标
mvn help:describe -Dplugin=插件名称 -Dfull
mvn help:active-profiles 查看所有的激活的profiles 会按照从上到下的顺序覆盖,会取用最后一个profile的属性值
mvn help:all-profiles 查看所有的profiles

profiles 可以写在pom.xml 也可以抽离出来,写在settings.xml
使用标签匹配激活

false</> 是否默认激活
1.8</> jdk版本1.8
操作系统

</os>
<file>
</file>
<property> 匹配某个属性值
    <name></>
    <value></>
</property>

在settings.xml中激活profile,不能激活pom.xml中的profile


profile-id

在maven中profiles只有repositories/pluginRepositories/properties可以再settings.xml中定义,其他属性必须在pom.xml中使用

maven的六类属性
一、内置属性
${basedir}表示根目录(含有pom.xml的文件目录) ${version} 项目版本
二、POM属性
${project.build.sourceDirectory}:项目的主源码目录,默认为src/main/java
${project.build.testSourceDirectory}:项目的测试源码目录,默认为src/test/java
${project.build.directory}:项目构建输出目录,默认为target/
${project.outputDirectory}:项目主代码编译输出目录,默认为target/classes/
${project.testOutputDirectory}:项目测试代码编译输出目录,默认为target/test-classes/
${project.groupId}:项目的groupid
${project.artifactId}:项目的artifactid
${project.version}:项目的version,等价于${version}
${project.build.fianlName} 项目打包的名称,默认为${project.artifactId}-${project.version}
三、自定义属性
可以在POM的中自定义属性
四、Settings属性
用户使用settings.开头的属性引用settings.xml文件中XML元素的值
五、Java系统属性
所有java系统属性都可以使用Maven属性引用
六、环境变量属性
所有环境变量都可以使用env.开头的maven属性引用

maven的属性过滤
在build中添加resources进行属性文件过滤,替换属性值
resources中定义那些目录下的文件会被配置文件中定义的变量替换
表示src/main/resources下的所有properties文件中的变量都会替换


编译之后文件移动到的位置

src/main/resources

true 如果filtering是false表示不会进行替换

*/.properties


maven配置web资源过滤

org.apache.maven.plugins
maven-war-plugin
2.6

<configuration>
    <webResources>
        <resource>
            <filtering>true</filtering>
            <directory>${project.basedir}/src/main/WebContent/WEB-INF
            </directory>
            <includes>
                <include>**/*.xml</include>
                <include>**/*.properties</include>
            </includes>
            <targetPath>WEB-INF</targetPath>
        </resource>
        <resource>
            <filtering>true</filtering>
            <directory>${project.basedir}/src/main/WebContent/WEB-INF/jsp
            </directory>
            <targetPath>WEB-INF/jsp</targetPath>
        </resource>

        <resource>
            <filtering>true</filtering>
            <directory>${project.basedir}/src/main/WebContent/WEB-INF/css
            </directory>
            <targetPath>WEB-INF/css</targetPath>
        </resource>


        <resource>
            <filtering>true</filtering>
            <directory>${project.basedir}/src/main/WebContent/WEB-INF/js
            </directory>
            <targetPath>WEB-INF/js</targetPath>
        </resource>
        <resource>
            <filtering>true</filtering>
            <directory>${project.basedir}/src/main/WebContent/WEB-INF/images
            </directory>
            <targetPath>WEB-INF/images</targetPath>
        </resource>
        <resource>
            <filtering>true</filtering>
            <directory>${project.basedir}/src/main/WebContent/WEB-INF
            </directory>
            <includes>
                <include>**/*.xml</include>
                <include>**/*.properties</include>
            </includes>
            <targetPath>WEB-INF</targetPath>
        </resource>
    </webResources>
</configuration>

Nexus仓库管理器
默认admin/admin123

可以搭建私服

仓库分类

download remote indexes 改为true

group组仓库 仓库的合集 按照配置的顺序找jar包
- proxy代理仓库1 ——url1 type为proxy
- proxy代理仓库2 ——url2
- hosted宿主仓库 mvn deploy会提交到hosted仓库中
- snapshot部署仓库
- release部署仓库
- 第三方jar包仓库 third party/3rd party

Virtual虚拟仓库,用于适配其他类型的仓库,比如maven要兼容maven1、maven2等
想要使用私服时,需要在pom文件中配置






true



true



或者在settings中配置








true



true



或者设置镜像

在settings.xml进行配置私服


nexus 对应激活的profile
*

这个对应的是group组仓库的地址

在pom文件中配置
发布工程时会用到,会发布到仓库


releases 要对应在nexus中的id
</>
</>


snapshots 要对应在nexus中的id
</>
</>

在发布时会使用到用户名,密码
此时应该在settings.xml中配置server


releases
admin
admin123

权限管理
先设置权限 privileges
再设置角色 roles
再设置用户 users

项目发布 Assembly插件
1、Assembly:一定要单独运行,不要绑定生命周期
2、Single mojo 这个和某个生命周期相关联

Assembly常用的套件描述符
1、bin - 将jar包打zip包
2、jar-with-denpendencies - 带有依赖的jar包
3、project - 将工程源代码打包
4、src - 将工程src目录下的源代码打包

默认在超级pom中带有插件的

maven-assembly-plugin
2.2-beta-5

可以使用打包
mvn assembly:single -DdescriptorId=描述符

可以在pom文件中直接配置自定义该插件

org.apache.maven.plugins maven-assembly-plugin 2.6
        <id>create-jar</id>
        <phase>package</phase>
        <goals>
            <goal>single</goal>
        </goals>
        <configuration>
            <descriptorRefs>
                <descriptorRef>
                    jar-with-dependencies
                </descriptorRef>
            </descriptorRefs>
            <archive>
                <manifest>
                    <mainClass>GetSiteMapUrl</mainClass>
                </manifest>
            </archive>
        </configuration>
    </execution>
</executions>