Maven使用手册

文章目录

  • 1.Maven-使用手册
    • Maven及pom详解
    • Maven坐标/jar包存放路径
    • Maven仓库/镜像
    • Maven依赖传递/排除依赖
    • Maven常用命令
    • Maven deploy 工程打包到私服
  • 2.项目定制化打包方式
    • maven-assembly-plugin(插件)
  • 3.私服配置及搭建
    • nexus安装及访问
    • 私服仓库的分类
    • 上传jar包到私服
    • 从私服下载jar包

1.Maven-使用手册

Maven是什么?

Maven是一个软件(特别是Java)项目管理及构建工具

Maven及pom详解

maven原理:

Maven使用手册_第1张图片

Maven主要基于三个组件进行项目管理:

  • pom.xml配置文件
  • 本地仓库(Local Repository)
  • 远程仓库(Remote Repository)。

pom.xml 文件定义了项目依赖的插件(java项目的依赖的Jar包),包括插件的名称和版本。Maven会解析pom.xml配置,首先去本地仓库中寻找项目依赖的插件,本地仓库不存在,将会去远程仓库下载到本地仓库中。

Maven会在项目构建时,将项目依赖的插件复制到项目lib目录中

pom配置详解


<project><dependencies>
			<dependency>
				<groupId>groupId>
				<artifactId>artifactId>
				<version>version>
				<type>type>
				<scope>scope>
				<optional>optional>
				<exclusions>
					<exclusion>exclusion>
				exclusions>
			dependency>
		dependencies>
		
	
    <properties>
        
        <maven.compiler.source>1.8maven.compiler.source>
        
        <maven.compiler.target>1.8maven.compiler.target>
    properties>project>

dependencies 根元素project下的dependencies 可以包含一个或多个dependency元素,以声明一个或多个项目依赖。每个依赖可以包含的元素有

  • groupIdartifactId 和 **version:**依赖的基本坐标,是必须要有的。

  • type: 依赖的类型,对应项目坐标定义的packaging。大部分情况下,该元素不必声明,其默认值为jar

  • scope: 依赖的范围(Maven有三种classpath:编译classpath 、测试classpath、运行classpath)

    • compile: 编译依赖范围。默认就是compile依赖范围。该依赖范围在三种classpath都有效
    • test:测试依赖范围,只在测试时好使,在编译主代码或运行项目的使用时将无法使用此类依赖
    • provided:对于编译和测试classpath有效,但在运行时无效
    • runtime:运行时代码依赖,测试和运行classpath有效,但在编译时无效。
  • optional: 标记依赖是否可选

  • exclusion: 用来排除传递性依赖

    依赖范围与classpath的关系

依赖范围(scope) 对于编译classpath有效 对于测试classpath有效 对于运行classpath有效
compile
test × ×
provided ×
runtime ×
system ×

Maven坐标/jar包存放路径

Maven定义了一组规则:世界上任何一个插件都可以使用Maven坐标唯一标识。Maven坐标的元素包括groupId、artifactId、version、packaging、classifier。只要我们提供正确的坐标元素,Maven就能找到对应的插件。

maven依赖的坐标:公司的名称 + 项目名称 + 版本号
  • groupId: 定义当前Maven项目隶属的实际项目或者项目组。groupId的表示方式与Java包名的方式类似

  • artifactId: 该元素定义实际项目中的一个maven项目(模块),推荐使用实际项目名称作为artifactId的前缀

  • version:定义Maven项目当前所处的版本

  • package:定义Maven项目的打包方式。默认的打包方式是jar

  • classifier:定义插件输出的一些附属插件。

注:groupId、artifactId、version是必须的,packaging是可选的,classifier是不能直接定义的

jar包在Maven中存放的路径:

Maven 仓库的布局方式:任何一个插件都有唯一的坐标,根据这个坐标可以定义仓库的唯一的存储路径,该路径与坐标的大致对应关系为: groupId/artifactId/version/artifactId-version.packaging

图2中的依赖的插件:

org.springframework:spring:2.5.6起对应在仓库中的路径为:org/springframework/2.5.6/spring-2.5.6.jar

Maven仓库/镜像

Maven使用手册_第2张图片

对Maven来说,仓库只分为两类: 本地仓库 和 远程仓库。 当Maven根据坐标寻找插件的时候,它会先检查本地仓库,如果本地仓库存在此插件,则直接使用;如果本地仓库不存在此插件,或者需要查看是否有更新的插件版本,Maven就会去远程仓库查找,发现需要的插件之后,下载到本地仓库再使用。如果本地仓库和远程仓库都没有需要的构件,Maven就会报错。

本地仓库

如果想要所有用户都使用一个本地仓库,可以修改{M2_HOME}/conf/setting.xml下的localRespository元素

插件部署在本地仓库,一般有两种方式:

  1. 在Maven项目中通过依赖关系,Maven会自动从远程仓库中下载,并自动部署到本地仓库中
  2. 如果想将自己开发的插件部署到本地仓库中,可以再Maven项目上执行 mvn clean install 命令就可

远程仓库

对Maven来说,每个用户只有一个本地仓库,但是可以有很多的远程仓库。
  • 中央仓库: 由于最原始的本地仓库是空的,Maven必须知道至少一个可用的远程仓库,才能在执行Maven命令的时候下载到需要的构件。中央仓库是一个默认的远程仓库。Maven的安装文件自带了中央仓库的配置。

  • 私服: 一种特殊的远程仓库,架设在局域网内的仓库服务,私服代理广域网上的远程仓库,作为缓存,供局域网内部的Maven用户使用。

Maven使用手册_第3张图片

远程仓库的验证的配置:在{user.home}/.m2/settings.xml中添加server 元素的配置:

Maven使用手册_第4张图片

Maven镜像

如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。换句说,任何可以从Y得到的插件都可以从X得到。
镜像的配置:在{user.home}/.m2/settings.xml中添加 mirror 元素的配置

Maven依赖传递/排除依赖

依赖传递:

当传递性依赖造成问题的时候,我们就需要清楚地知道该传递性依赖时从哪条依赖路径引入的。

Maven依赖调解有两条依赖调解原则:

  • 路径最近者优先:A–>B–>C–>X(1.0)、A–>D–>X(2.0) ,最终X(2.0)会被解析使用

  • 第一声明者优先:A-> C->X(1.0)、A->D->X(2.0),pom中谁先定义用谁

依赖排除:

传递性依赖会给项目隐式地映入很多依赖,这极大地简化了项目依赖的管理,但是有些时候会带来一些问题。

举例: A -> B -> C (1.0.0)

A 依赖于 第三方的库 B,但是由于某些原因B依赖于另一个第三方的库C,而C是一个SNAPSHOT版本,那么这个SNAPSHOT就会成为当前项目的传递性依赖,而SNAPSHOT的不稳定性会直接影响到当前的项目。这时就需要删除这个SNAPSHOT版本,引入一个C的稳定版本(1.1.0)。

<dependencies>
	<dependency>
		<groupId>com.xxx.demogroupId>
		<artifactId>project-bartifactId>
		<version>1.0.0version>
		<exclusions>
			<exclusion>
				<groupId>com.xxx.demogroupId>
				<artifactId>project-cartifactId>
			exclusion>
		exclusions>
	dependency>
	<dependency>
		<groupId>com.xxx.demogroupId>
		<artifactId>project-cartifactId>
		<version>1.1.0version>
	dependency>
dependencies>

Maven常用命令

mvn clean: 该命令调用生命周期的clean阶段。实际执行的阶段为clean 生命周期的 pre-clean 和 clean阶段。

mvn test: 该命令调用default生命周期的test阶段

mvn clear package: 该命令调用 default 生命周期的 package阶段(仅打包)

mvn clear install:将包安装到Maven本地仓库,供本地其他Maven项目使用(布署到本地maven仓库)

mvn clean deploy:deploy命令完成了项目编译、单元测试、打包功能,同时布署到本地和远程仓库

mvn install -Dmaven.test.skip = true:跳过单元测试的install

Maven deploy 工程打包到私服

想把一个写好的工具jar 打包到 nexus(私服)上去

  1. Maven\conf\setting.xml 中要配置远程仓库的验证的配置

    <server>
      <id>adminid>
      <username>adminusername>
      <password>admin123password>
    server>
    
  2. 项目pom中添加

    <distributionManagement>
        <snapshotRepository>
            <id>adminid>
            <name>Local Nexus Repositoryname>
            <url>http://10.1.63.xx:8088/nexus/content/groups/public/url>
        snapshotRepository>
    distributionManagement>		
    
  3. 执行Maven deploy命令

注意 pom文件的id 要和在 maven中配置的server的id 一致 否则不起作用

2.项目定制化打包方式

maven-assembly-plugin(插件)

  • maven打包插件:http://maven.apache.org/plugins/maven-assembly-plugin/

它是maven中针对打包任务而提供的标准插件

  • pom.xml(模板拿来即用)
	<build>
		<resources>
            
			<resource>
				<directory>src/main/resourcesdirectory>
				<filtering>truefiltering>
				<includes>
					<include>**/*.propertiesinclude>
					<include>**/*.xmlinclude>
				includes>
				<excludes>
					<exclude>static/**exclude>
				excludes>
			resource>
			<resource>
				<directory>src/main/resourcesdirectory>
				<filtering>falsefiltering>
				<includes>
					<include>static/**include>
				includes>
			resource>
			<resource>
				<directory>src/main/resourcesdirectory>
				<filtering>truefiltering>
				<excludes>
					<exclude>static/**exclude>
				excludes>
			resource>
		resources>
    
		<plugins>
			
			<plugin>
				<groupId>org.apache.maven.pluginsgroupId>
				<artifactId>maven-surefire-pluginartifactId>
				<configuration>
					<skipTests>trueskipTests>
				configuration>
			plugin>

			
			<plugin>
				<groupId>org.apache.maven.pluginsgroupId>
				<artifactId>maven-jar-pluginartifactId>
				<configuration>
                    
					<excludes>
						<exclude>*.propertiesexclude>
						<exclude>*.xmlexclude>
						<exclude>*.ymlexclude>
						<exclude>*.shexclude>
					excludes>
					<archive>
						<manifest>
                            
							<addClasspath>trueaddClasspath>
                            
							<mainClass>com.ebupt.crbt.ApplicationmainClass>
                            
							<classpathPrefix>lib/classpathPrefix>
						manifest>
					archive>
				configuration>
			plugin>
            
            
			<plugin>
				<groupId>org.apache.maven.pluginsgroupId>
				<artifactId>maven-assembly-pluginartifactId>
				<version>2.2-beta-5version>
				<configuration>
					<descriptors>
                        
						<descriptor>src/main/resources/package.xmldescriptor>
					descriptors>
                    
                    <finalName>${project.artifactId}finalName>
                    
                    <outputDirectory>${project.build.directory}/outputDirectory>
				configuration>
                 
				<executions>
					<execution>
						<id>make-assemblyid> 
						<phase>packagephase>
						<goals>
							<goal>singlegoal>
						goals>
					execution>
				executions>
			plugin>

		plugins>

	build>
  • package.xml

<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
    
      
   <id>webAppid>
   <formats>
      
   	<format>zipformat>
   formats>
   <includeBaseDirectory>trueincludeBaseDirectory>  
   
   <fileSets>
    <fileSet>
    	<directory>${project.basedir}/src/main/resourcesdirectory>
   		<outputDirectory>/outputDirectory>
   		<includes>
		<include>*.shinclude>
		<include>*.propertiesinclude>
		<include>*.jsoninclude>
		<include>*.propertiesinclude>
		<include>*.xmlinclude>
		<include>*.mdinclude>
	includes>
    fileSet>
   	
   	<fileSet>
   		<directory>${project.basedir}/src/main/resourcesdirectory>
   		<outputDirectory>/configoutputDirectory>
   		<includes>
   			<include>*.ymlinclude>
   		includes>
   	fileSet>
   	
     <fileSet>
   		<directory>${project.build.directory}directory>
            <outputDirectory>/outputDirectory>
            <includes>  
                <include>*.jarinclude>    
           includes>
   	fileSet>
    
      <fileSet>
          <directory>${project.basedir}/src/main/resourcesdirectory>
          <outputDirectory>/binoutputDirectory>
          <includes>
              <include>*.shinclude>
          includes>
      fileSet>
  fileSets>
    
    
   <dependencySets>
        <dependencySet>
            <useProjectArtifact>falseuseProjectArtifact>
            <outputDirectory>/liboutputDirectory>
        dependencySet>
    dependencySets>
assembly>

3.私服配置及搭建

nexus安装及访问

  1. 下载(省略),下载完成解压:nexus-2.12.0-01

  2. 安装和卸载

    解压到没有中文的路径下

    使用管理员身份打开cmd 进入到E:\develop\nexus\nexus-2.12.0-01\bin 输入下面命令进行安装

  3. 修改配置文件/访问私服

application-port=8081
application-host=127.0.0.1
nexus-webapp=${bundleBasedir}/nexus
nexus-webapp-context-path=/nexus
  1. 启动nexus
  • 安装命令: nexus install

  • 启动服务:nexus start

  • 停止服务:nexus stop

  • 卸载命令:nexus uninstall

    修改后访问:localhost:8081/nexus

私服仓库的分类

宿主仓库(hosted): 当前私服自己维护的仓库,Nexus 有下面三个(repositoryId):

  • releases: 我们自己开发的包(Release 版),pom.xml 中 version 不包含“-SNAPSHOT”的情况,用于正式发布的版本;
  • snapshots: 我们自己开发的包(Snapshot 版),pom.xml 中 version 包含“-SNAPSHOT”的情况,用于调试中的不稳定版本;
  • thirdparty: 第三方开发的包,手工导入其中。

代理仓库(proxy): apache测试包,中央仓库的jar包(私服去中央仓库下载后的jar包存在这里)

虚拟仓库(virtual): maven1的jar包

组仓库(group): 宿主仓库/代理仓库,配置私服下载时用这个,既有自己发布的jar包又有从中央仓库下载的jar

上传jar包到私服

配置上传的路径(需要上传的项目的pom文件中)


 <distributionManagement>
  	<repository>
  		<id>releasesid>
	<url>http://localhost:8081/nexus/content/repositories/releases/url>
  	repository> 
  	<snapshotRepository>
  		<id>snapshotsid>
	<url>http://localhost:8081/nexus/content/repositories/snapshots/url>
  	snapshotRepository> 
  distributionManagement>

在例如:
<distributionManagement>
    <snapshotRepository>
        <id>iipid>
        <name>Local Nexus Repositoryname>
        <url>http://10.1.xx.xx:8088/nexus/content/groups/public/url>
    snapshotRepository>
    
        
        
    
distributionManagement>

如果访问需要认证的话,需要在settings.xml文件中设置:

配置私服的账号和密码(maven/conf/settings.xml)

<server>
  <id>releasesid>
  <username>adminusername>
  <password>admin123password>
server>
<server>
  <id>snapshotsid>
  <username>adminusername>
  <password>admin123password>
server>
<server>
  <id>thirdpartyid>
  <username>adminusername>
  <password>admin123password>
server>

从私服下载jar包

从私服下载jar包,maven/conf/settings.xml相关配置

a. 配置下载的位置模板(maven/conf/settings.xml)

<profile>   
	
   <id>devid>   
    <repositories>   
      <repository>  
		
        <id>nexusid>   
		
        <url>http://localhost:8081/nexus/content/groups/public/url>   
		
        <releases>   
          <enabled>trueenabled>   
        releases>   
		
        <snapshots>   
          <enabled>trueenabled>   
        snapshots>   
      repository>   
    repositories>  
	 <pluginRepositories>  
    	
        <pluginRepository>  
        	
            <id>publicid>  
            <name>Public Repositoriesname>  
            <url>http://localhost:8081/nexus/content/groups/public/url>  
        pluginRepository>  
    pluginRepositories>  
  profile>  

b. 激活下载的位置模板(maven/conf/settings.xml)

  <activeProfiles>
    <activeProfile>devactiveProfile>
  activeProfiles>

从什么库地址可以下载项目依赖的库文件(pom中如下配置)


<repositories>
     <repository>
         <id>alimavenid>
         <url>https://maven.aliyun.com/repository/publicurl>
     repository>
repositories>

注意:如果需要认证才能访问,则需要在settings.xml文件中添加如下内容,并且server中的id字段的值要与repository中id字段的值相同

<servers>  
    <server>  
        <id>nexusid>  
        <username>adminusername>  
        <password>admin123password>  
     server> 
servers>

你可能感兴趣的:(maven,java,开发语言)