Maven使用总结

半腔热情 提交于 2020-03-04 19:04:33

Maven 仓库分类:

1、本地仓库
默认为:C:\Users******.m2\repository
也可以设置其他位置。方式同上。
此时配置的maven的本地仓库是属于用户范围的,也可以配置全局的本地仓库(不推荐)

2、远程仓库

又可以分为:
2.1、中央仓库(一般不会用,会被其他远程仓库覆盖掉)
配置:这个配置是maven默认配置的!

  < repositories >  
      < repository >  
         < id >central</ id >  
         < name >Maven Repository Switchboard</ name >  
         < layout >default</ layout >  
         < url >http://repo1.maven.org/maven2</ url >  
         < snapshots >  
             < enabled >false</ enabled >  
         </ snapshots >  
      </ repository >  
   </ repositories >

这里我们只要知道,中央仓库的id为central,远程url地址为http://repo1.maven.org/maven2,它关闭了snapshot版本构件下载的支持。

2.2、私服–Nexus仅仅是私服的一种。
配置语句:

      <id>nexus</id>
      <repositories><!--配置远程仓库-->  
	    <repository>
		  <id>nexus2</id>
		  <name>Nexus</name>
		  <url>http://192.*.**:8081/nexus/content/groups/public/</url>
		  <releases><!-- 控制Maven对于发布版本构件的下载权限  -->
		     <enabled>true</enabled>
		  </releases>
		  <snapshots><!-- 控制Maven对于快照版本构件的下载权限  -->
		      <enabled>true</enabled>
		  </snapshots>
	    </repository>
      </repositories>

对于releases和snapshots来说,除了enabled,它们还包含另外两个子元素updatePolicy和checksumPolicy。

updatePolicy:配置Maven从远处仓库检查更新的频率,默认值是daily,Maven每天检查一次。其他可用的值包括:never-从不检查更新;always-每次构建都检查更新;interval:X-每隔X分钟检查一次更新(X为任意整数)。

checksumPolicy:配置Maven检查校验和文件的策略。当构件被部署到Maven仓库中时,会同时部署对应的检验和文件。在下载构件的时候,Maven会验证校验和文件,如果校验和验证失败:当checksumPolicy的值为默认的warn时,Maven会在执行构建时输出警告信息;fail-Maven遇到校验和错误就让构建失败;ignore-使Maven完全忽略校验和错误。

	  <pluginRepositories><!--配置Maven从什么地方下载插件构件-->  
	      <pluginRepository>
		     <id>nexus2</id>
		     <name>Nexus</name>
		     <url>http://192.*.2.*:8081/nexus/content/groups/public/</url>
		     <releases><enabled>true</enabled></releases>
		     <snapshots><enabled>true</enabled> </snapshots>
	      </pluginRepository>			
      </pluginRepositories>

一个局域网的远程仓库,使用该仓库能大大提高下载速度,继而提高构建速度;也有可能你依赖的一个jar在central中找不到,它只存在于某个特定的公共仓库,这样你也不得不添加那个远程仓库的配置

不是简单的将及元素复制到settings.xml中就可以,setting.xml不直接支持这两个元素。解决方案,就是利用profile
配置如下:

< profiles >  
    < profile >  
         < id >nexus</ id >
         <!-- repositories and pluginRepositories here-->
     </ profile >
</ profiles >
< activeProfiles >  <!--激活 远程仓库-->  
     < activeProfile >nexus</ activeProfile >  
  </ activeProfiles >  

使用profile为settings.xml添加仓库提供了一种用户全局范围的仓库配置。

mirror镜像:
作用:有一个速度更快的Central镜像,或者你想覆盖central仓库配置,或者你想为所有POM使用唯一的一个远程仓库(这个远程仓库代理的所有必要的其它仓库),你可以使用settings.xml中的mirror配置。

关于镜像的一个更为常见的用法是结合私服。由于私服可以代理任何外部的公共仓库(包括中央仓库),因此,对于组织内部的Maven用户来说,使用一个私服地址就等于使用了所有需要的外部仓库,这可以将配置集中到私服,从而简化Maven本身的配置。在这种情况下,任何需要的构件都可以从私服获得,私服就是所有仓库的镜像

mirrorOf的值为central,表示该配置为中央仓库的镜像,任何对于中央仓库的请求都会转至该镜像,用户也可以使用同样的方法配置其他仓库的镜像

配置如下:

<mirrors>			   
	<mirror><!--配置镜像-->  
         <id>nexus</id>  
         <name>Nexus</name>
         <url>http://192.*.*.233:8081/nexus/content/groups/public/</url>
         <mirrorOf>*</mirrorOf>  <!mirrorOf的值为星号,表示该配置是所有Maven仓库的镜像,任何对于远程仓库的请求都会被转至url -->
     </mirror> 
  </mirrors>

注:
1、如果访问该仓库需要验证,则配置一个id为nexus的认证信息即可
2、需要注意的是,由于镜像仓库完全屏蔽了被镜像仓库,当镜像仓库不稳定或者停止服务的时候,Maven仍将无法访问被镜像仓库,因而将无法下载构件。

2.3、其他公共库

mvn install 会将项目生成的构件安装到本地Maven仓库 ,构件只能供当前用户使用

mvn deploy 用来将项目生成的构件分发到远程Maven仓库 ,所有能访问该仓库的用户都能使用你的构件

1、需要配置POM.xml 的distributionManagement 来指定Maven分发构件的位置:

<distributionManagement>
         <repository>   <!--发布版本(稳定版本)构件的仓库 -->
             <id>nexus-releases</id>
             <name>Local Nexus Repository</name>
             <url>http://192.168.2.233:8081/nexus/content/repositories/releases/</url>
         </repository>
         <snapshotRepository>   <!-- 表示快照版本(开发测试版本)的仓库 -->
             <id>nexus-snapshots</id>
             <name>Local Nexus Repository</name>
             <url>http://192.168.2.233:8081/nexus/content/repositories/snapshots</url>
         </snapshotRepository>
 </distributionManagement>

注:如果缺失,会报下述错误

(repository element was not specified in the POM inside distributionManagement element):
	      Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy (default-deploy) on project vivo-paradise: 
		  Deployment failed: repository element was not specified in the POM inside distributionManagement element or in -DaltDeploymentRepository=id::layout::url parameter -> [Help 1]

2、分发构件到远程仓库需要认证,如果你没有配置任何认证信息,你往往会得到401错误。这个时候,如下在settings.xml中配置认证信息:

  </servers>
     <server>  
         <id>nexus-releases</id>  <!-- 这里的id必须要和pom文件中的id完全一致!见上面distributionManagement配置-->
         <username>admin</username>  
         <password>admin123456</password>  
     </server>
     <server>  
         <id>nexus-snapshots</id>  <!-- 这里的id必须要和pom文件中的id完全一致!见上面distributionManagement配置-->
         <username>admin</username>  
         <password>admin123456</password>  
     </server>   
  </servers>

maven打包 install package deploy区别

【】maven package:打包到本项目,仅仅放在项目target目录下。如果a项目依赖于b项目,打包b项目时,只会打包到b项目下target下,编译a项目时就会报错。

【】maven install:打包(安装)到本地仓库,将包安装至本地仓库,以让其它项目依赖。 如果a项目依赖于b项目,那么install b时,会在本地仓库同时生成pom文件和jar文件,
可以看install b的日志:

[INFO] --- maven-install-plugin:2.4:install (default-install) @ vivo-paradise-core ---
[INFO] Installing E:\git-file\backend-web\vivo-paradise-core\target\vivo-paradise-core-1.0-SNAPSHOT.jar to C:\Users\11065394\.m2\repository\com\vivo\paradise\vivo-paradise-core\1.0-SNAPSHOT\vivo-paradise-core-1.0-SNAPSHOT.jar
[INFO] Installing E:\git-file\backend-web\vivo-paradise-core\pom.xml to C:\Users\11065394\.m2\repository\com\vivo\paradise\vivo-paradise-core\1.0-SNAPSHOT\vivo-paradise-core-1.0-SNAPSHOT.pom

所以:package与deploy的区别是:
package是把jar打到本项目的target下;
install时把jar包放在target下并且把jar安装到本地仓库,供其他项目使用.

【问题】使用root下的package打包,发现没有把各个项目生成的jar放在本地仓库,但是启动intf工程依然可以正常启动!???

验证测试:
1、先package打包intf,在package打包core,同样的打包intf时出错,提示和下方相同。
2、先package打包core,在package打包intf出错,提示找不到Could not find artifact com.vivo.paradise:vivo-paradise-core:jar:1.0-SNAPSHOT in nexus (先从本地找,找不到再从远程仓库nexus查找,还是找不到报错)
3、采用root下的package打包,与使用install的唯一区别是install会多一个把包放到本地仓库的过程
因为根pom.xml 有各个工程关联信息,所以package打包可以直接把依赖工程包带进去(或者解释为当成一个大工程进行打包),而如果单独的对intf和core打包,因为两个工程下的pom文件没有对应依赖关系,所以单独打包intf需要依赖core的jar

【】maven deploy:打包上传(部署)到远程仓库,如:私服nexus等,需要配置pom文件。将最终的包复制到远程的仓库,以让其它开发人员与项目共享。

Clean Lifecycle 在进行真正的构建之前进行一些清理工作:
pre-clean 执行一些需要在clean之前完成的工作
clean 移除所有上一次构建生成的文件
post-clean 执行一些需要在clean之后立刻完成的工作

maven项目对象的部分方法:

①mvn compile 编译项目

②mvn package 打包项目

③mvn clean 清除之前编译和打包产生的文件

④mvn install 将项目安装到本地仓库

⑤mvn test 运行测试代码

mvn clean package包含的执行步骤:

执行顺序:

1、使用清理插件:maven-clean-plugin:2.5执行清理删除已有target目录(版本2.5),但是不会删除已经放在本地仓库的jar包;

2、使用资源插件:maven-resources-plugin:2.6执行资源文件的处理(版本2.6);

3、使用编译插件:maven-compiler-plugin:3.1编译所有源文件生成class文件至target\classes目录下(版本3.1);

4、使用资源插件:maven-resources-plugin:2.6执行测试资源文件的处理(版本2.6);

5、使用编译插件:maven-compiler-plugin:3.1编译测试目录下的所有源代码(版本3.1);

6、使用插件:maven-surefire-plugin:2.12运行测试用例(版本2.12);

7、使用插件:maven-jar-plugin:2.4对编译后生成的文件进行打包,包名称默认为:artifactId-version,比如本例生成的jar文件:rtp-front-1.0-SNAPSHOT,包文件保存在target目录下(这个生成的包不能在命令行中直接执行,因为我们还没有入口类配置到Manifest资源配置文件中去,后续会阐述)。

如果工作空间同时引进maven项目A、B,A项目依赖B项目,这时看maven引入的jar包以文件夹形式展示,关闭了项目B就会以jar包形式显示(重新从私服上拉取)。
总之如果依赖的项目在本地,项目会优先在本地查找。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!