proxy
true
http
proxy.zte.com.cn
80
proxy.zte.com.cn:80|192.168.*.*|*.zte.com.cn|10.*.*.*|*.*.zte.intra
//哪些主机名不需要代理
4.0.0 指定了当前POM模型的版本
scope : test,默认compile
mvn clean compile
mvn clean test
插件配置:
org.apache.maven.plugins
maven-compiler-plugin
3.7.0
1.8
UTF-8
如果没有指定打包类型,默认为jar,mvn clean package
其他maven项目如果需要直接引用的话,还需要install,将项目输出的jar安装到本地仓库 mvn clean install
默认打包生成的jar是不能直接运行的,带有main方法的类信息不会加载到manifest中,生成可执行jar需要借助
org.apache.maven.plugins
maven-shade-plugin
1.4
package
shade
*:*
META-INF/*.SF
META-INF/*.DSA
META-INF/*.RSA
com.lcifn.Application
META-INF/spring.handlers
META-INF/spring.schemas
骨架:基本的目录结构和pom的文件内容
mvn archetype:generate
完全可以自己开发骨架
为各种构件引入了秩序,groupId artifactId version packaging classifier(不能直接指定)
依赖范围控制与三种classpath(编译、测试、运行的classpath)的关系
依赖范围也影响依赖的传递性:
compile | test | provided | runtime | |
---|---|---|---|---|
compile | compile | - | - | runtime |
test | test | - | - | test |
provided | provided | - | provided | provided |
runtime | runtime | - | - | runtime |
标签,依赖不会被传递利用
有些依赖来自同一项目的不同模块,版本会一起升级,应该在一个唯一的地方定义版本。如:
2.5.6
引用 ${springframework.version}
查看已解析依赖:mvn dependency:list``````mvn dependecny:tree
还有mvn dependency:analyse
分析当前项目依赖
实际的项目不再各自存储依赖文件,统一位置是仓库,需要的时候maven会根据坐标找到并使用
仓库的路径:groupId/artifactId/version/artifactId-version-classifier.packaging
central
Central Repository
https://repo.maven.apache.org/maven2
default
false
false
default 表示是maven2或3的默认布局
``
true
daily daily/never/always/interval:分钟
ignore
默认值是daily mvn clean install -U 强制下载最新快照
checksumPolicy:构建部署到仓库时会同时部署校验和文件,下载构建会验证校验和文件,如果失败?warn/fail/ignore
在settings文件中的’’’ ‘’'中配置用户名密码,其中的id必须和pom中仓库id对上
proj-release
proj release repository
http://192.168.1.100/content/repositories/proj-release
proj-snapshots
proj snapshot repository
http://192.168.1.100/content/repositories/proj-snapshots
如果不指定插件的版本,maven以RELEASE策略,自动解析最新的发布版本构建(不是快照)
仓库X可以提供仓库Y的所有存储内容,认为X是Y的一个镜像,在settings中可以使用镜像代替中央仓库
alimaven
aliyun maven
http://maven.aliyun.com/mvn/view
central
jboss-public-repository-group
central
JBoss Public Repository Group
http://repository.jboss.org/nexus/content/groups/public
mirrorOf:
*
所有远程仓库*,!repo1
repo1除外镜像需要权限也在
配置
在settings.xml中配置远程仓库
...
dev
把上面的内容粘贴到这里。。。
dev
...
这里我们定义一个id为dev的profile,将所有repositories以及pluginRepositories元素放到这个profile中,然后,使用元素自动激活该profile。这样,你就不用再为每个POM重复配置仓库。
使用profile为settings.xml添加仓库提供了一种用户全局范围的仓库配置。
生命周期抽象了构建的各个步骤,定义了次序,没提供具体实现。谁实现?插件
maven提供了默认插件简化和稳定构建,用户可通过配置现有插件或自己编写插件自定义构建行为。
clean周期: 后一个步骤会顺序执行前面所有步骤
default周期:
site周期: 处理你的项目站点文档的创建。
一个插件会聚合多种功能,每个功能就是一个目标
dependency: analyze、dependency:tree、dependency:list
compiler:compile、surefire:test
生命周期绑定了插件目标。
多个目标绑到一个阶段,按照插件声明的先后顺序决定执行顺序
org.apache.maven.plugins
maven-compiler-plugin
2.3.2
1.6
org.apache.maven.plugins
maven-war-plugin
2.1.1
src/main/webapp
**/*.jpg
任务配置:
67 org.apache.maven.plugins
68 maven-clean-plugin
69 ${plugin.version}
70
71
72 auto-clean
73
74 clean
75
76
77 clean
78
79
80
81
从命令行调用插件,因为有些插件不适合绑定在生命周期
插件的远程仓库用
配置
在pom中配置插件时,如果是maven官方插件,可省略groupId
maven在超级pom中为所有核心插件指定了版本,如果不属于核心插件,会检查仓库中可用版本,maven3默认的是RELEASE
可以在settings中配置
这样除了扫描org.apahce.maven.plugins和org.codehaus.mojo外,还会扫描配置的
maven聚合特性:把多模块聚合在一起构建;继承:抽取模块相同的依赖和配置,统一管理。
额外的tip:测试用例测试接口而不是实现,测试代码不能引入实现类
实现模块的聚合,每一个值是一个当前pom的相对目录。一般与artifactId一致(模块存放的目录)../account-email
创建parent模块,packaging还是为pom,继承的时候子模块用
来继承
默认是../pom.xml
,默认父pom在上一层目录../account-parent/pom/xml
表示在与子模块平行的parent目录下maven会根据relativePath查找父模块,没找到会到本地仓库找
dependencyManagement能让子模块继承到依赖配置,但只是对版本进行管理,不会实际引入jar,约束dependencies依赖使用。在子模块只要配置简单的groupId和artifactId就能获得对应的依赖信息
com.test.sample
base-parent1
1.0.0-SNAPSHOT
pom
import
import依赖范围,可以将目标pom中的dependencyManagement引入,提供了除复制和继承外的第三种方法,注意:打包类型必须是pom
简化: 一个POM既是聚合pom又是继承pom也没关系
maven有一些固定的项目组织结构,减少交流成本,如非必要不要改,比如
这些约定来自于超级pom
依次读取pom,如果没有依赖,构建,有依赖,先构建依赖的模块,不允许出现依赖循环。
反应堆裁剪命令:
举例:使用-pl来指定构建某几个模块,并增加 -am 参数同时构建依赖的模块,mvn clean -pl account-service -am; 使用 -amd 选项可以同时构建依赖于所列模块的模块, mvn clean -pl account-email -amd; 使用 -rl 选项可以在完整的反应堆构建顺序基础上指定从哪个模块开始构建,mvn clean -rf account-email
maven重要职责之一是自动运行单元测试,插件为maven-surefire-plugin,test目标会自动执行测试源码路径(默认为src/test/java)下所有符合一组命名模式的测试类:
**/Test*.java
: 任何子目录下以Test开头的类**/*Test.java
: 任何子目录下以Test结尾的类**/*TestCase.java
: 任何子目录下以TestCase结尾的类以Tests结尾的类不会自动执行
-DskipTests可跳过测试运行,-Dmaven.test.skip = true跳过测试代码的编译和运行
org.apache.maven.plugins
maven-surefire-plugin
2.20
**/*Tests.java
**/Abstract*.java
cobertura是一个开源测试覆盖率统计软件 mvn cobertura:cobertura
测试代码默认是不打包的,插件maven-jar-plugin有两个目标,分别是jar和test-jar,前者内置绑定到package生命周期,后者默认绑定到package,但没有内置绑定,要显式声明
org.apache.maven.plugins
maven-jar-plugin
3.0.2
package
test-jar
/*.properties
/*.xml
测试被打成jar之后,可被其他模块的测试代码包含到dependency中,type test-jar
+src
++main
+++java(源代码)
+++resources(资源文件)
+++webapp(web应用目录)
++++WEB-INF
web.xml
++++静态资源
++test
+++java(测试源代码)
+++resources(测试资源文件)
详细的配置,用法以及需要修改settings.xml,这不是官方的默认插件,groupid不同。还可以设置很多web级的配置,比如context。
https://www.cnblogs.com/liupeizhi/articles/2701348.html
mvn jetty:run mvn jetty:run -Djetty.port = 9999
插件自动扫描到web的修改,热部署
自动化地将web应用部署至本地或远程的web容器中
cargo:start的生命周期依赖于maven实例的生命周期,也就是说,maven构建成功或者失败之后,cargo插件的生命周期也自动停止了;而cargo:run不同,不管maven是否构建成功或者失败,都必须手工去按Ctrl + C来停止。
standalone模式
在standalone模式,Cargo会从Web容器的安装目录复制一份配置到用户指定的目录,然后在此基础上部署应用,每次重新构建的时候,这个目录都会被清空,所有配置被重新生成
org.codehaus.cargo
cargo-maven2-plugin
1.4.9
tomcat7x
/usr/local/devtools/apache-tomcat-7.0.55
standalone
${project.build.directory}/tomcat7x
8088
mvn cargo:run
2. 部署到本地Web容器
existing模式
在existing模式下,用户需要指定现有的web容器配置目录,然后Cargo会直接使用这些配置并将应用部署到其对应的位置
org.codehaus.cargo
cargo-maven2-plugin
1.4.9
tomcat7x
/usr/local/devtools/apache-tomcat-7.0.55
existing
/usr/local/devtools/apache-tomcat-7.0.55
部署到远程正在运行的容器
更多配置详见插件解析,这里是最简单的
配置好之后就可以运行mvn cargo:redeploy 来部署应用了(必须保证tomcat是running状态,否则没法部署),如果容器中已经部署的当前应用,Cargo会先卸载掉原来的应用,然后再重新部署。
org.codehaus.cargo
cargo-maven2-plugin
1.4.9
tomcat7x
remote
runtime
http://localhost:8080/manager/text
admin
password
版本管理:项目整体版本的演变过程管理;版本控制:追踪代码的每一个变更
发布的条件:
命名的含义:<主版本>.<次版本>.<增量版本> - <里程碑版本>
后面两个是可选的
该插件主要有三个目标:release: prepare, release: rollback, release: perform (什么是插件目标),在介绍分支自己主动化的时候还会引入branch目标
release:prepare -DautoVersionSubmodules 准备版本号公布。依次运行下列操作
release: rollback
回退release: prepare所运行的操作。
将POM回退至release:prepare之前的状态。并提交。
注:该步骤不会删除release:prepare生成的标签,须要用户手动删除
release: perform
运行版本号公布
签出release:prepare生成的标签中的源码,并在此基础上运行mvn deploy命令打包并部署构件至仓库
scm:git:http://项目git地址
项目git地址(不加'.git后缀')
scm:项目git地址
org.apache.maven.plugins
maven-release-plugin
2.5.3
v@{project.version}
true
release: branch
mvn release:branch -DbranchName=1.1.x -DupdateBranchVersions=true -DupdateWorkingCopyVersions=false
这是maven-release-plugin的branch目标,我们指定branch的名称为1.1.x,表示这里会有版本1.1.1, 1.1.2等等。updateBranchVersions=true的意思是在分支中更新版本,而updateWorkingCopyVersions=false是指不更改当前工作目录(这里是trunk)的版本。
在运行该命令后,我们会遇到这样的提示:
What is the branch version for “Unnamed - org.myorg:myapp:jar:1.1-SNAPSHOT”? (org.myorg:myapp) 1.1-SNAPSHOT: :
——“分支中的版本号是多少?默认为1.1-SNAPSHOT” 这时我们想要的版本是1.1.1-SNAPSHOT,因此输入1.1.1-SNAPSHOT,回车,maven继续执行直至结束。
接着,我们浏览svn仓库,会看到这样的目录:https://192.168.1.100:8443/svn/myapp/branches/1.1.x/,打开其中的POM文件,其版本已经是1.1.1-SNAPSHOT。
GPG是GNU Privacy Guard的缩写,是自由软件基金会的GNU计划的一部分。它是一种基于密钥的加密方式,使用了一对密钥对消息进行加密和解密,来保证消息的安全传输。一开始,用户通过数字证书认证软件生成一对公钥和私钥。任何其他想给该用户发送加密消息的用户,需要先从证书机构的公共目录获取接收者的公钥,然后用公钥加密信息,再发送给接收者。当接收者收到加密消息后,他可以用自己的私钥来解密,而私钥是不应该被其他人拿到的。
签名,验证完整性: gpg -ab temp.java:-b创建一个独立的签名文件,-a创建AscII格式输出,生成temp.java.asc签名文件,将这两个文件一起发给用户,假设用户已导入你的公钥
gpg --verify temp.java.asc 验证原始文件
加密:
法一:gpg -o encrypted_file.gpg --encrypt -r key-id original.file
命令解释:
(1)-o encrypted_file.gpg = 指定输出文件
(2)–encrypt = 做加密
(3)-r = 接收者的KEY-ID,比如这里就填你朋友的KEY-ID。
(4)original.file = 指定要加密的文件
法二: gpg --recipient [your pubID]--output out.file --encrypt original.file
3. 解密:gpg --decrypt filename.gpg
org.apache.maven.plugins
maven-gpg-plugin
${maven-gpg-plugin.version}
sign-artifacts
verify
sign
执行mvn clean deploy -Dgpg.passphrase=yourpassphrase
若已经发布了,想签名,用插件的另一个goal:
mvn gpg:sign-and-deploy-file
> -DpomFile = target/myapp-1.0.pom
> -Dfile = target/myapp-1.0.jar
> -Durl = maven仓库地址
> -DrepositoryId = id
考虑一个问题:签名只有正式发布的时候才有必要,平常的快照构建是不需要的,profile标签设置触发条件
内置
b a s e d i r 项 目 的 根 目 录 ( 包 含 p o m . x m l 文 件 的 目 录 ) , {basedir}项目的根目录(包含pom.xml文件的目录), basedir项目的根目录(包含pom.xml文件的目录),{version}项目版本
pom属性,每一个都对应一个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
p r o j e c t . v e r s i o n : 项 目 的 v e r s i o n , 与 {project.version}:项目的 version,与 project.version:项目的version,与{version}等价
p r o j e c t . b u i l d . f i a n l N a m e : 项 目 打 包 输 出 文 件 的 名 称 。 默 认 为 {project.build.fianlName}:项目打包输出文件的名称。默认为 project.build.fianlName:项目打包输出文件的名称。默认为{project.artifactId}-${project.version}
用户可以在POM的元素下自定义Maven属性
用户使用settings.开头的属性引用 settings.xml 文件中XML元素的值,如:${settings.localRepository}
所有Java系统属性都可以使用Maven属性引用,${user.home}
所有环境变量都可以使用以env.开头的Maven属性引用 ${env.JAVA_HOME}
比如开发和测试和发布所用的数据库配置都不同!!
我们写变量值:maven 属性,然后在某个地方定义它
database.jdbc.driverClass = ${db.driver}
database.jdbc.connectionURL = ${db.url}
database.jdbc.username = ${db.username}
database.jdbc.password = ${db.password}
dev
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3360/test
username
password>
** 但是,maven默认属性只在pom中被解析,在资源文件中没有自动解析,资源文件处理是maven-resource-plugin做的事情,他默认的行为是将主资源和测试资源文件复制到编译输出目录,这个是在超级pom定义的**
开启filtering即可
${project.basedir}/src/main/resources
true
${project.basedir}/src/test/resources
true
然后运行 mvn clean install -Pdev,-P参数表示激活一个profile,构建完成后输出目录中的配置就是开发环境的配置了
true
dev
false
1.5
操作系统环境
Windows XP
Windows
x86
5.1.2600
系统属性 在命令行可以声明哦 mvn install -Dtest=x
mavenVersion
2.0.5
file2.properties
file1.properties
...
mvn help:active-profiles 列出当前激活的
mvn help:all-profiles列出当前所有的
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
在Web项目中,资源文件位于src/main/resources/目录下,他们经处理后会位于WAR包的WEB-INF/classes目录下,即这类资源文件在打包过后位于应用程序的classpath中。Web项目中位于src/main/webapp目录,经打包后位于WAR包的根目录。这一类资源文件称作web资源文件,他们在打包过后不位于应用程序的classpath中。web资源默认不会被过滤,因此开启一般资源文件的过滤也不会影响到web资源文件
client-a
a.jpg
red
client-b
b.jpg
blue
需要配置maven-war-plugin对src/main/webapp这一web资源目录开启过滤
org.apache.maven.plugins
maven-war-plugin
2.1-beta-1
true
src/main/webapp
**/*.css
**/*.js
profile不仅可以用来应对不同的构建环境以保持构建环境的可移植性,还可以用来分离构建的一些较耗时或耗资源的行为,给予更合适的构建频率
添加maven-site-plugin,mvn site,但是多模块的链接点不过去,那么可以在本地预发布到一个临时目录:
mvn site:stage -DstagingDirectory = D:\temp
org.apache.maven.plugins
maven-site-plugin
3.0-beta-3
org.apache.maven.plugins
maven-project-info-reports-plugin
2.4
license
mailing-list
dependencies
dependency-convergence
plugin-management
cim
issue-tracking
scm
summary
org.apache.maven.plugins
maven-surefire-report-plugin
2.6
org.apache.maven.plugins
maven-javadoc-plugin
2.7
org.apache.maven.plugins
maven-checkstyle-plugin
2.6
org.codehaus.mojo
jdepend-maven-plugin
2.0-beta-2
org.codehaus.mojo
cobertura-maven-plugin
2.4
org.codehaus.mojo
taglist-maven-plugin
2.4
org.apache.maven.plugins
maven-jxr-plugin
2.1
org.apache.maven.plugins
maven-pmd-plugin
2.5
true
100
3
1.6
mvn archetype:generate DarchetypeGroupId= -DarchetypeArtifactId=maven-archetype-quickstart
-DarchetypeVersion -DinteractiveMode=false
-DgroupId=com.mycompany.app -DartifactId=myapp -Dversion=1.0-snap... -Dpackage
mvn archetype:crawl -Drepository = D:/java/reposiroty -Dcatalog = C:/archetype-catalog.xml
指定要遍历的仓库和要更新的文件,不提供会遍历settings中定义的localRepository,在仓库根目录生成archetype-catalog.xml
src/main/java
**/*.**
src/main/resources
**/*.xml
**/**
src/test/java
**/*.**
默认要求的参数group artifact version package,还可以要求额外参数,见上述代码
编写完成后,clean install 安装到本地库
https://blog.csdn.net/lff1991/article/details/76550363
maven-plugin maven-plugin-api的依赖
@goal
插件目标,唯一必须声明的标注@phase
绑定到生命周期,@phase test@requiredDependencyResolution
运行该Mojo前必须解析所有指定范围的依赖, compile,test,runtime,默认runtime@requiredProject
该目标是否必须在一个maven项目中运行,默认为true@requiredDirectInvocation
是否只能通过命令行调用,若true,在pom中尝试绑定到生命周期就报错,默认false@requiredOnline
是否要求maven在线,默认false@requiredReport
是否要求项目报告已生成,默认false@aggregator
多模块项目,该标注表示目标只会在顶层模块运行@execute goal= ""
运行该目标前,先运行另一目标;如果是本插件的目标,直接使用目标名称,否则用"prefix:goal"@execute phase= ""
运行该目标前,先让maven运行一个并行的生命周期,到指定的阶段为止@execute lifecycle= "" phase=""
运行该目标前,先运行一个自定义的生命周期,到指定的阶段为止。自定义生命周期的配置文件lifecycle.xmlboolean(boolean和Boolean):
/**
*@parameter
*/
private boolean sampleBoolean:对应配置true
int(Integer,long.Long,short,Short,byte,Byte):
/**
*@parameter
*/
private int sampleInt:对应配置8
float(Float,Double,double):
/**
*@parameter
*/
private float sampleFloat:对应配置8.2
String(StringBuffer,char,Character):
/**
*@parameter
*/
private String sampleString:对应配置heoll
Date(yyyy-MM-dd HH:mm:ss.S a或yyyy-MM-dd HH:mm:ssa):
/**
*@parameter
*/
private Date sampleDate:对应配置2010-06-09 3:14:55.1 PM或2010-06-09 3:14:55 PM
File
/**
*@parameter
*/
private File sampleFile:对应配置c:tem
URL
/**
*@parameter
*/
private URL sampleUrl:对应配置http;//www.baidu.com
数组
/**
*@parameter
*/
private String[] includes:对应配置ee dd
Collection(任何实现Collection接口的类)
/**
*@parameter
*/
private List includes:对应配置ee dd
Map
/**
*@parameter
*/
private Map includes:对应配置ee dd
Properties
/**
*@parameter
*/
private Properties includes:对应配置
ee
22
dd
11
@parameter额外属性:
@parameter alias="":为mojo参数使用别名
@parameter expression="${aSystemProperty}":使用系统属性表达式对mojo参数进行赋值
@parameter defaultValue="aValue/${anExpression}":提供一个默认值
另外
@readonly:只读属性,不允许配置
@required:必需的属性,未配置,会报错