maven
- maven安装配置
- 下载解压maven压缩包,并配置相关环境变量,并将%M2_HOME%\bin添加到PATH,运行mvn -v确认安装成功
M2_HOME=C:\Program Files\apache-maven-3.0.4,指向maven解压安装目录(指向新版maven就可直接升级)
MAVEN_OPTS=-Xms128m -Xmx512m,maven运行需要多一点内存(java默认的内存不够) - 配置本地maven仓库:maven会将依赖jar包下载到本地,可以将本地仓库位置配置到C:盘之外的地方
复制${M2_HOME}/conf/settings.xml到${user.dir}/.m2/settings.xml,不直接修改M2_HOME下文件以方便maven升级
修改localRepository元素,如<localRepository>D:\Hongwei\project\data\m2repos</localRepository> - 插件下载或安装网址:
http://download.eclipse.org/technology/m2e/releases
http://m2eclipse.sonatype.org/sites/m2e,核心模块
http://m2eclipse.sonatype.org/sites/m2e-extras,额外组件方便与其他工具如SVN集成
配置maven插件:不使用内嵌的maven,它与命令行构建不一致(mvn package) - 配置代理:ping repo1.maven.org不通,telnet proxy port可行,配置proxies元素
<proxies>
<proxy><id>my-proxy</id><active>true</active>
<protocol>http</protocol><host>ip</host><port>3128</port>
<username>user</username><password>pwd</password><nonProxyHosts>repos.mycom.com|*.google.com</nonProxyHosts>
</proxy>
</proxies> - 镜像仓库请求到本地public:修改settings.xml配置,maven内置了central仓库访问,也可以在pom配置repository元素访问其他仓库,但最好是将所有仓库请求都镜像到私服public,
<mirrors><mirror>
<id>nexus</id><name>local</name><url>http://localhost:8079/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror></mirrors>
mirrorOf可能值:*匹配所有远程仓库,repo1,repo2匹配两个仓库,*,!repo1排除某个仓库,external:*排除file://协议依赖 - 部署项目模块:将项目模块部署install到私服以供其他模块依赖,此时注意快照版依赖将即时更新,而稳定版依赖将本地缓存
<distributionManagement>
<repository><id>nexus</id><name>local</name><url>http://localhost:8079/nexus/content/groups/public/</url>
</repository><snapshotRepository>
<id>nexus</id><name>local</name><url>http://localhost:8079/nexus/content/groups/public/</url>
</snapshotRepository></distributionManagement>
验证信息需要配置settings.xml,因为pom会发布出去不利于密码保护
<servers><server><id>nexus</id><username>admin</username><password>admin123</password></server></servers>
- 下载解压maven压缩包,并配置相关环境变量,并将%M2_HOME%\bin添加到PATH,运行mvn -v确认安装成功
- maven私服安装:Nexus当前最流行的Maven仓库管理软件
- 下载安装:解压至/usr/local并建立软链接
http://www.sonatype.org/downloads/nexus-2.0.4-bundle.tar.gz
tar xvzf nexus-2.0.2-bundle.tgz /usr/localln -s nexus-2.0.2 nexus - 配置端口及仓库路径:${nexus}/conf/nexus.properties,私服仓库保存在${nexus}/work
application-port=8079nexus-work=${bundleBasedir}/work - 运行nexus私服并查看日志:
/usr/local/nexus/bin/nexus starttail -f logs/wrapper.log - 访问nexus并管理远程仓库:
http://localhost:8079/nexus,默认登录账户admin/admin123,在这里还查找maven构件或上传私有构件
nexus自带public、thirdparty、releases、central等仓库,类型有hosted本地、proxy代理、group组合
其他公开远程仓库,http://download.java.net/maven/2,http://repository.jboss.com/mvaven2
本地代理仓库proxy到内网私服的public,修改本地public顺序为local、central
让maven使用本地public仓库:http://localhost:8079/nexus/content/groups/public/ - 上传本地jar到私服仓库:例如jta.jar
thirdparty可用来上传本地jar
mvn install:install-file -DgroupId=javax.transaction -DartifactId=jta -Dversion=1.1 -Dpackaging=jar -Dfile=c:\path\to\jar\jta-1.1-classes.jar - 搜索构件:内网私服可以搜索已索引的构件,而外网搜索服务能提供更多的构建搜索
Sonatype Nexus:http://repository.sonatype.org,提供关键字、类名、坐标、校验和等搜索
Jarvana:http://www.jarvana.com/jarvana,支持依赖声明片段、文档浏览
MVNbrowser:http://www.mvnbrowser.com,支持构件的依赖关系
MVNrepository:http://mvnrepository.com,支持构件各版本大小变化图表
- 下载安装:解压至/usr/local并建立软链接
- maven基础知识
- 构件坐标:maven使用自己的坐标系统定位所有构件,同时也要求maven项目有自己的坐标
groupId公司项目(org.sonatype.nexus,公司可能有多个项目),
artifactId项目模块(nexus-indexer,可能多个项目都有core模块所以加上项目前缀),
version版本(快照版SNAPSHOT不稳定),
packaging打包,默认为jar
classifier附属构件(不能直接定义,由插件帮助生成javadoc、sources等),
目标构件名为artifactId-version[-classifier].packaging,如nexus-indexer-2.0.0-javadoc.jar - 依赖范围
compile,编译需要,测试和运行也需要,如spring-core.jar
test,仅测试需要,如junit.jar
provided,仅编译和测试需要,运行时无效,如servlet-api.jar已有容器提供
runtime,仅运行时需要,如jdbc-connector.jar
system,使用systemPath指定系统路径,不利于构建的可移植性,如tools.jar - 依赖关系
传递性依赖,当前项目依赖的构件,可能还对其他构件有依赖,maven会自动计算出所有的依赖关系
依赖调解,第一原则是路径最近者优先,第二原则是声明顺序优先,maven会自动使用构件的稳定版本(非SNAPSHOT快照版)
可选依赖,比如某库支持mysql和postgresql但只能使用其一,此时某库对两种driver的依赖是可选的,项目中必须引入其中一种
排除依赖,可能某库依赖某构件的2.0版,而项目明确需要3.0版本,可排除某库对某构件2.0版的依赖并显示引入其3.0版
<denpendency>
<groupId>com.some.project</groupId>
<artifactId>project-model.jar</artifact>
<version>1.0.0</version>
<exclusions><exclusion>
<groupId>com.other.project</groupId><artifactId>project-model.jar</artifactId>
</exclusion></exclusions>
</denpendency>
<denpendency>
<groupId>com.other.project</groupId><artifactId>project-model.jar</artifactId>
<version>3.0</version>
</denpendency>
归类依赖,spring-core、spring-beans等其实是来自同一项目的多个模块,它们依赖的版本通常是相同的,此时可使用版本变量以方便spring升级
<properties>
<spring.version>2.5.6</spring.version>
</properties>
<denpendency>
<groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version></version>
</denpendency>
优化依赖,mvn denpendency:analyze,Used undeclared dependencies需要显示声明,Unused declared denpencies可能不需要声明(如spring-core等是spring-context-support的基础也最好声明版本) - 聚合与继承:聚合用于同时构建过个模块(反应堆还可以灵活剪裁),继承用于给子模块提供通用的配置(如源码插件版本等)
聚合模块使用modules声明目标模块
<modules>
<module>../account-email</module>
<module>../account-persist</module>
</modules>
剪裁反应堆,默认mvn clean install会构建整个反应堆链,而剪裁有利于多模块项目的快速构建
mvn clean install -pl account-email,account-persist,构建指定的模块列表project list
mvn clean install -pl account-email -am,构建指定模块及其依赖also make
mvn clean install -pl account-parent -amd,构建指定模块及依赖于它的模块also make denpendents
mvn clean install -rf account-email,构建反应堆中指定模块之后的模块resume-from
子模块使用parent声明父模块,通常子模块是父模块的子目录时relativePath=../pom.xml
<parent>
<groupId>com.soyinke.account</groupId>
<artifactId>account-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../account-parent/pom.xml</relativePath>
</parent>
父模块可声明而不引入插件版本,统一源码及目标版本等
<properties>
<spring.version>2.5.6</spring.version>
<junit.version>4.7.1</junit.version>
<maven.compiler.source>1.6</maven.compiler.source>
</properties>
<denpendencyManagement>
<denpendency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></denpendency>
<denpendency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version></denpendency>
</denpendencyManagement>
子模块直接引用依赖构件即可,或完整引用特有的依赖构件模块
<denpencies>
<denpendency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId></denpendency>
<denpendency><groupId>junit</groupId><artifactId>junit</artifactId></denpendency>
</denpencies> - 生命周期lifecycle、阶段phase、插件目标plugin:goal
- 默认有三套生命周期,各自有独立的阶段顺序
clean=pre-clean clean post-clean,清理项目
site=pre-site site post-site site-deploy,站点信息
default=validate initialize generate-sources process-sources generate-resources process-resources compile process-classes generate-test-sources process-test-resources test-compile process-test-classes test prepare-package package pre-integration-test integration-test post-integration-test verify install deploy - 常用构建命令:
- mvn -h;mvn help:describe -Dcmd=install -Ddetail; mvn help:help -Ddetail; mvn help:describe -Dplugin=groupId:artifactId[:version]
mvn assembly:help -Ddetail -Dgoal=,命令目标帮助 - mvn dependency:analyze,分析依赖包
- mvn deploy -pl ../soyinke-parent,指定发布项目包
- mvn package -Dmaven.test.skip=true,跳过测试打包
- mvn install,加入本地依赖库;mvn install:install-file -DgroupId= -DartifactId -Dversion -Dpackaging -Dfile=,加入jar包到本地依赖库
- mvn -h;mvn help:describe -Dcmd=install -Ddetail; mvn help:help -Ddetail; mvn help:describe -Dplugin=groupId:artifactId[:version]
- 阶段与插件的目标绑定,而插件可能有多个目标,maven内置了许多阶段与目标的绑定,用户也可以按打包源码source.jar的方式自定义这种绑定
查看插件信息mvn help:describe -Dplugin=groupId:artifactId -Ddetail
目标前缀help代表了org.apache.maven.plugins:maven-help-plugin:2.1
<settings><pluginGroups><pluginGroup>org.mortbay.jetty</pluginGroup></pluginGroups></settings>
插件仓库元数据:配置前缀
<metadata><plugins><plugin>
<name>Maven Clean Plugin</name><prefix>clean</prefix><artifactId>maven-clean-plugin</artifactId>
</plugin></plugins></metadata>
- 默认有三套生命周期,各自有独立的阶段顺序
- 创建骨架
- 骨架组成
描述符:archetype.xml,/src/main/resources/META-INF/maven/,包含骨架文件列表 - 原型文件:/src/main/resources/archetype-resources/,骨架插件要复制的文件
- 原型pom:/src/main/resources/archetype-resources/pom.xml
- 骨架项目pom:/pom.xml
-
- 构件坐标:maven使用自己的坐标系统定位所有构件,同时也要求maven项目有自己的坐标
- maven项目管理:
- 基本配置:约定优于配置,超级POM中包含许多约定。
编码属性project.build.sourceEncoding=UTF-8
代码版本属性maven.compiler.source=maven.compiler.target=1.6,实际是配置compiler插件
跳过测试maven.test.skip=true - 常见阶段:
compile,编译
package,根据jar或war打包
install,安装到本地m2repos,本地
deploy,上传到nexus仓库,内网 - 高级操作:
- 发布到仓库:mvn deploy
打开nexus上的hosted类型仓库releases的发布策略depoyment policy=allow redeploy
复制发布配置distributionManagement元素到项目pom,可以在父模块配置供子模块继承
在${maven}/conf/settings.xml中添加servers元素,可以在nexus/Security/Users重置密码。
<servers><server><id>snapshots</id><username>deployment</username><password>deploy</password></server><server><id>releases</id><username>deployment</username><password>deploy</password></server></servers> - 打包可执行jar,配置shade插件,生成主类信息
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><executions><execution><phrase>package</phrase><goals><goal>shade</goal></goals><configuration><transformers><transformer implementation="org.apache.mave.plugins.shade.resource.ManifestResurceTransformer"><mainClass>com.HelloWorld</mainClass></transformer></transformers></configuration></execution></executions></plugin> - 打包源码sources.jar、文档javadoc.jar
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-source-plugin</artifactId><version>2.2</version><executions><execution><id>attach-sources</id><phase>verify</phase><goals><goal>jar-no-fork</goal></goals></execution></executions></plugin> - 运行主类并传递参数:
mvn exec:java -Dexec.mainClass=package.class -Dexec.args="arg1 arg2"
-
- 基本配置:约定优于配置,超级POM中包含许多约定。
- maven插件目标
- maven-help-plugin,mvn help:help
- describe,描述插件或目标,-Ddetail -Dgoal=describe -Dplugin=prefix|groupId:artifactId[:version] -Dcmd=phrase|prefix:goal
- system,输出环境变量和系统变量
-
- maven-clean-plugin,mvn clean:help
- clean,清空输出目录
-
- maven-resources-plugin,mvn resources:help
- [test-]resources,复制资源
-
- maven-compiler-plugin,mvn compiler:help
- [test-]compile,编译源码
-
- maven-dependency-plugin,mvn dependency:help
- analyze[-only],分析依赖使用情况(默认触发test-compile)
- tree|resolve,树形显示或计算所有依赖
-
- maven-surefire-plugin, mvn surefire:help
- test,运行测试
-
- maven-antrun-plugin,mvn antrun:help
- run,执行ant构建任务,-Dtasks提供target任务列表(另外:ant:ant,插件maven-ant-plugin可以生成对应的ant构建文件)
-
- maven-jar-plugin, mvn jar:help
- [test-]jar,打包字节码
-
- maven-war-plugin, mvn war:help
- exploded,集合依赖包到WebContent\WEB-INF\lib
- war,打包网站项目war
-
- mvn-install-plugin,mvn install:help
- install,发布构件到本地库
- install-file,发布三方jar包到本地库
-
- maven-deploy-plugin,mvn deploy:help
- deploy,发布构件到远程库(通常如果有javadoc、sources等也会发布)
- deploy-file,发布三方jar包到远程库
-
- maven-source-plugin, mvn source:help
- [test-]jar[-no-fork],打包源码(默认触发compile)
-
- maven-javadoc-plugin,mvn javadoc:help
- [test-]javadoc,在site目录下生成apidocs源码文档
- [test-]jar,生成target\apidocs文档并打包
- maven-site-plugin,mvn site:help
- site,生成站点内容
- deploy,发布站点到远程
- jar|run,打包或运行站点(jetty,-Dport设定端口)
-
- maven-release-plugin,mvn release:help
- branch,分支代码库(-DbranchBase非标准目录trunk/tags/branchs时需要,-DbranchName分支名,-Dusername+password账户)
- prepare+clean,准备或清理
- perform+rollback,执行或回滚发布(workingDirectory=target/checkout)
- maven-eclipse-plugin,mvn eclipse:help
- eclipse+clean,生成或清理项目信息
- myeclipse[-clean],生成或清理myeclipse项目信息
-
-
- maven相关问题:
- Missing artifact com.sun:tools:jar:1.5.0
解决一:添加tools.jar到依赖库,在pom.xml中添加依赖项
mvn install:install-file -DgroupId=com.sun -DartifactId=tools -Dversion=1.5.0 -Dpackaging=jar -Dfile="C:\Program Files\Java\jdk1.6.0_22\lib\tools.jar"
项目中添加依赖
<dependency><groupId>com.sun</groupId><artifactId>tools</artifactId><version>1.5.0</version><scope>provided</scope></dependency>
解决二:指定运行eclipse的java虚拟机路径,在eclipse.ini的openFile下面添加-vmC:/Program Files/Java/jdk1.6.0_22/bin/javaw.exe
- Missing artifact com.sun:tools:jar:1.5.0