Maven 总结

本文详细介绍Maven的安装配置流程、项目结构配置、依赖管理、生命周期与插件使用方法,以及私有仓库搭建与维护技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1安装与配置:

1.1从官网下载

1.2解压至任一目录

1.3设置环境变量

root身份打开并编辑profile文件:

yan@yan-Ubuntu:/$ sudo gedit/etc/profile

在文件最后添加:

#set mavenenvironment
M2_HOME=/usr/local/apache-maven-3.1.0

export MAVEN_OPTS="-Xms256m-Xmx512m"

export PATH=$M2_HOME/bin:$PATH

保存并关闭。

要使配置生效必须重启机器或者在命令行输入:

yan@yan-Ubuntu:/$ . /etc/profile或使用source命令

yan@yan-Ubuntu:/$ mvn -version

1.4设置本地仓库:

sudo cp/usr/local/apache-maven-3.1.0/conf/settings.xml ~/.m2

sudo vim ~/.m2/settings.xml

找到<!--localRepository

| The path to the local repository maven will use to storeartifacts.

|

| Default: ${user.home}/.m2/repository

<localRepository>/path/to/local/repo</localRepository>

-->

在其后添加内容:其中,/home/yan/code/repository/maven是你maven本地仓库的路径。

<localRepository>/home/yan/code/repository/maven</localRepository>


2项目配置:

目录结构:

pom.xml

src

main

java

package

resources

test

java

package

resources

target

classes

pom.xml

groupId-->项目的Id

artifactId-->模块的Id

version-->版本号0.0.1-SNAPSHOT

x.x.x-里程碑

x:里程碑,大版本,架构上的变化(SNAPSHOT快照版正在开发中的版本,alpha:内部的测试版本,beta:外部的测试版本,releaseRC):稳定版,GA:可靠的版本)

x:架构上的分支

x:这个分支里做了多少次更新

<dependencies>


</dependencies>


在项目根目录建立pom.cml文件及src文件夹,src文件夹包含main文件夹和test文件夹

在项目根目录运行:mvncompile:可以编译项目并下载项目需要的依赖和插件并在根目录下建立target目录,里面保存了项目编译后sclass文件

项目根目录运行:mvntest:运行对应目录中的测试文件

mvnclean:清空target文件夹

注意:运行该命令后如果再运行mvntest就是不出现该文件夹,也许是包名写错了

把项目分成模块,把这个模块开发好后,将来的项目直接用dependency引入那个模块即可

把项目打包成jar并导入本地库:mvninstaill


如何去找对应jar包的dependency

去中央工厂网站找到对应jar包就有相应的dependency


生成maven骨架目录:

mvnarchetype:generate \

-DarchetypeGroupId=org.apache.maven.archetypes\

-DgroupId=com.mycompany.app \

-DartifactId=my-app


3 eclipse插件配置

安装m2eclipse插件

配置:

preferences中的MavenInstallations创建自己的Maven,别用系统默认的,然后在UserSettings配置本地仓库(选择本地仓库中的setting.xml文件)


配置好后就能创建New Maven Project

GroupId:相当于package的命名规则:域名反置加模块名如:com.coslay.maven


4 dependency

scope(对包而言):

compile:编译范围有效,在编译和打包时都会将依赖存储进去(编译测试打包都有效),依赖会传递

import

provided:在编译和测试的过程有效,最后生成war包时不会加入,诸如:service-api,因为service-apitomcat等服务器已经存在了,如果再打包会冲突(编译测试有效,打包不打进去)

runtime:在运行的时候依赖,在编译的时候不依赖(编译无效测试有效,打包打进去)

system

test:测试范围有效,在编译和打包时都不会使用这个依赖,只有src/test目录下的文件才会关联编译,其他目录不会关联编译。不会传递。

默认的依赖范围compile

依赖传递A-->C B-->A ==> B-->C (这种依赖是基于compile这个范围进行传递)


直接依赖和间接依赖

A-->l1.0

B-->l2.0

C-->A,B

Al1.0为直接依赖,Cl1.0为间接依赖,间接依赖如果有多个相同类型不同型号的包,依赖于先声明<dependence>的那一个。因为C先声明A所以依赖于l1.0.

如果A-->D-->l1.0

B-->l2.0

C--A,B

这时候C就依赖于l2.0了,因为层次最短

排除依赖

如果你在C里面想用l1.0,就可以把l2.0排除,在<dependency>使用<exclusions>标签:如:

<exclusions>

<exclusion>

<groupId></groupId>

<artifactId></artifactId>

</exclusion>

</exclusions>


5 bug

清除maven支持:

maven选项:disablemaven nature

重新支持mavenconfiture选项:convertto maven project


6Maven内置隐式变量


Maven提供了三个隐式的变量可以用来访问环境变量,POM信息,和MavenSettings

env

env变量,暴露了你操作系统或者shell的环境变量。便如在MavenPOM中一个对${env.PATH}的引用将会被${PATH}环境变量替换,在Windows中为%PATH%.

projetc

project变量暴露了POM。可以使用点标记(.)的路径来引用POM元素的值。例如

<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.sonatype.mavenbook</groupId>
<artifactId>project-a</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<build>
<finalName>${project.groupId}-${project.artifactId}</finalName>
</build>
</project>

当你使用mvnhelp:effective-pom查看时,你会看到<finalName>org.sonatype.mavenbook-project-a</finalName>

  • ${basedir}项目根目录

  • ${project.build.directory}构建目录,缺省为target

  • ${project.build.outputDirectory}构建过程输出目录,缺省为target/classes

  • ${project.build.finalName}产出物名称,缺省为${project.artifactId}-${project.version}

  • ${project.packaging}打包类型,缺省为jar

  • ${project.xxx}当前pom文件的任意节点的内容

settings

settings变量暴露了Mavensettings信息。可以使用点标记(.)的路径来引用settings.xml文件中元素的值。例如${settings.offline}会引用~/.m2/settings.xml文件中offline元素的值。




7仓库

私有仓库:共享不同模块使用相同包这样一个需求,先在本地仓库找,没有再到私有仓库找,私有仓库没有到中央工厂找。

nexus的安装:

在本地局域网中的一台机器搭建,最好选用linux,下载http://www.sonatype.org/nexus/go

nexus-latest-bundle

sonatype-work

nexus:存储私服仓库从中央工厂请求的包

nexus-2.3.1-01

bin:这个目录需要增加到path

jsw

conf

wrapper.conf:修改这个文件下的wrapper.java.command=java的绝对路径

然后在命令行执行:nexusinstall:进行安装服务

然后使用命令行:service服务名start:启动服务

在浏览器输入:localhost:8081/nexus/index.html:打开首页

登录:点击login输入默认密码admin,帐号admin


私有工厂分类

group

hosted:把本地工厂提交来的包提交到hosted工厂

3rd party:中央工厂没有的包可以由自己增加到这里

artifact upload选项:上传

snapshots:<version>0.0.1-SNAPSHOT</version>的包提交到这里

releases:<version>0.0.1-RELEASE</version>的包提交到这里

proxy

central:从中央工厂下载来的包

configuration选项:配置中央工厂路径

apache snapshots:专门下载apachesnapshots开发包

codehaus snapshots:专门下载codehaus的包

virtual:基本用不到

group:把多个工厂加到一个工厂中,用这样的一个路径就可以访问其他多个工厂

mvn:deploy --->把本地工厂提交到私有工厂


私有工厂配置:

1这种方式只对增加以下标签的包有效,这种方式会先在私有仓库找,找不到直接从中央仓库下,而不使用本地仓库的(即使本地仓库中有也不使用)。如果私有仓库找到了,再到本地仓库找,找到了直接使用,找不到从私有仓库下载。

pom.xml中增加:

<repositories>

<repositories>

<id>nexus</id>

<name>Nexus Repository</name>

<url>http://localhost:8081/nexus/content/groups/public</url>

</repositories>

</repositories>

2 配置所有模块公共的私有工厂:

这种方式会先在私有仓库找,找不到直接从中央仓库下,而不使用本地仓库的(即使本地仓库中有也不使用)。如果私有仓库找到了,再到本地仓库找,找到了直接使用,找不到从私有仓库下载。在maven的配置文件setting.xml中:

<profile>

<id>nexusProfile</id>

<repositories>

<repository>

<id>nexus</id>

<name>Nexus Repository</name>

<url>http://localhost:8081/nexus/content/groups/public</url>

<releases>

<enabled>ture</enabled>

</releases>

<!-- snapshots默认是关闭的,需要手动开启-->

<snapshots>

<enabled>true</enabled>

</snapshots>

</repository>

</repositories>

</profile>

</profiles>

<activeProfiles>

<!--只有激活之后才生效-->

<activeProfile>nexusProfile</activeProfile>

</activeProfiles>

3 配置本地不能访问中央工厂:

maven的配置文件setting.xml中:

<!--工厂的镜像,只要mirrorof中的工厂要访问,都会自动来寻找镜像,如果镜像无法访问就不会再去中央工厂,使用*表示所有的工厂都使用这个镜像访问,这个推荐的做法-->

<mirror>

<id>nexusMirror</id>

<!--<mirrorOf>nexus,central</mirrorOf>-->

<mirrorOf>*</mirrorOf><!--所有的工厂都来这边访问-->

<name>Human Readable Name for this Mirror.</name>

<url>http://localhost:8081/nexus/content/groups/public</url>

</mirror>

</mirrors>

<activeProfile></activeProfile>:在这里就不用激活profile

4 如果你想默认下载snapshots包可以设置:

maven的配置文件setting.xml中:

<profiles>中增加<profile>central默认的配置覆盖如下:

<profile>

<id>centralProfile</id>

<repositories>

<repository>

<id>central</id>

<name>Central Respository</name>

<url>http://*</url>

<snapshots>

<enabled>true</enabled>

</snapshots>

</repository>

</repositories>

</profile>

<activeProfiles>

<!--只有激活之后才生效-->

<activeProfile>centralProfile</activeProfile>

</activeProfiles>

注:如在本地增加私有仓库中没有的包时,需要更新私有仓库中的索引。


5 项目的发布

首先必须授权:修改settings.xml,增加:

<server>

<id>user-release</id>

<username>deployment</username>

<password>deployment</password>

</server>

</servers>

然后在项目的pom.xml中设置:

<distributionManagement>

<repository>

<id>user-release</id>

<name>uesr release</name>

<url>http://localhost:8081/nexus/content/repositories/releases/</url>

</repository>

<snapshotRepository>

<id>user-snapshots</id>

<name>user snapshots resp</name>

<url>http://localhost:8081/nexus/content/repositories/snapshots</url>

</snapshotRepository>

</distributionManagement>

然后运行命令:mvndeploy把这个项目发布到私有仓库


8发布不同到项目到私有工厂:

1 Repositories中增加对应项目的仓库(snapshotrelease):

选择add增加Hosted

allow redeploy


2 增加对应仓库的权限(对应仓库的snapshotrelease的全部权限):

Privileges中选择add增加:


3增加角色:

Roles选项中:

add增加角色:选择对应仓库的权限

4 创建用户:

Users选项:

add增加用户,选择Statusactive,把角色增加进来

5最后就可以在项目中进行设置

同项目的发布


9三套生命周期和插件

1 clean

pre-clean 执行一些需要在clean之前完成的工作

clean 移除所有上一次构建生成的文件

post-clean执行一些需要在clean之后立刻完成的工作

2 compile

validate

generate-sources

process-sources

generate-resources

process-resources 复制并处理资源文件,至目标目录,准备打包

compile 编译项目源代码

process-classes

generate-test-sources

process-test-sources

generate-test-resources

process-test-resources复制并处理资源文件,至目标测试目录

test-compile编译测试源代码

process-test-classes

test 使用合适的单元测试框架运行测试,这些测试代码不会被打包或部署

prepare-package

package 接收编译好的代码,打包成可发布的格式,如JAR

pre-integration-test

integration-test

post-integration-test

verify

install 将包安装至本地仓库,以让其他项目依赖

deploy 将最终的包复制到远程仓库,以让其他开发人员与项目共享

3 site

pre-site 执行一些需要在生成站点文档之前完成的工作

site 生成项目的站点文档

post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备

site-deploy 将生成的站点文档部署到特定的服务器上


执行某一步操作将会执行其之上的所有操作。

这里每一个步骤称为一个目标,这些步骤由插件来执行,这些插件保存在仓库中。

默认目标:指的是执行一个插件不写前缀目标,而默认执行的那个目标。

如:nvmclean这里没写前缀目标,只写了一个插件(compile)就会执行默认目标。

每个插件里面有许多目标,这些目标可以配置到生命周期的某个步骤之后,

插件的作用和用法,查看网站查看相应:http://maven.apache.org/plugins/index.html

配置插件并将插件绑定到某个生命周期中(查看example代码):在pom.xml中增加,

<build>

<plugins>

<plugin>

<groupId>org.apache.maven.plugins</proupId>

<artifactId>maven-source-plugin</artifactId>

<version>2.2.1</version>

<executions>//将插件绑定到生命周期的某个阶段

<execution>

<phase>compile</phase>//compile生命周期之后执行

<goals><goal>jar</goal><goal>test-jar</goal></goals>
</execution>

</executions>

</plugin>

</plugins>

</build>

注:还可以使用<configuration>标签配置相应的参数。



在插件中<plugin></plugin>可以使用<dependencies><dependencies>,使用插件依然可以使用相应的依赖


10测试

默认执行测试的类名:Test****Test **TestCase这些类必须放在src/test/java的包中,最好与被测试类的源代码包名保持一致

使用surefire插件控制JUnit测试

如果想运行非默认测试名称的测试:

pom.xml中增加插件:

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-surefire-plugin</artifactId>

<version>2.14</version>

<configuration>

<!--设置包含的测试类-->

<includes>

<include>**/Hello*</include>

</includes>

<!--设置不进行测试的类-->

<excludes>

<exclude>Test*</exclude>

</excludes>

<skip>true</skip><!--跳过编译测试和运行测试-->

<skipTests></skipTests><!--编译测试,但不运行测试-->

</configuration>

</plugin>


所有的编译测试都跳过:

pom.xml中设置<compiler>插件:

在配置中增加<skip>true</skip>//此处设置了skip等于设置了把所有的测试编译都跳过,如果测试类写得有问题,也不会报错,只有你确定你的测试类没问题了为了节省测试时间的时候可以关闭


动态运行测试:

运行命令的时候进行参数设置,如:

clean package-DskipTests=true//跳过测试

clean package-Dtest=Hello.java//指定测试类,只准备测试一个类


生成测试覆盖率(有多少代码进行了测试,生成测试报告)

使用插件coberturahttp://mojo.codehaus.org/cobertura-maven-plugin/

cobertura:cobertura

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值