maven book

maven仓库 https://mvnrepository.com/

 

https://mvnrepository.com/

 

搜索仓库地址 https://search.maven.org/    
       
默认仓库 https://repo1.maven.org/maven2/ 其它 http://insecure.repo1.maven.org/maven2/
阿里云仓库 ( 新版) https://maven.aliyun.com/repository/public 阿里云仓库(老版) https://maven.aliyun.com/nexus/content/groups/public
华为云仓库 https://mirrors.huaweicloud.com/repository/maven/    
       
       
       

 

 

maven下载

https://archive.apache.org/dist/maven/maven-3/

maven安装

1. 创建maven的文件夹并下载maven的tar包到此文件夹中

#进入一个目录
cd /usr/local
#创建一个文件夹
mkdir maven
#下载maven的tar包
wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
#解压tar包
tar -xvf apache-maven-3.3.9-bin.tar.gz

 

2.1 配置环境变量

#打开环境变量的配置文件
vim /etc/profile
#新增行MAVEN_HOME,等于号后面是maven解压的文件夹地址
export MAVEN_HOME=/usr/local/maven/apache-maven-3.5.2
#找到PATH行,追加$MAVEN_HOME/bin
#例如
PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH
#重新刷新配置文件
source /etc/profile

 

2.2补充 如果是windows环境如何配置环境变量 

新建 MAVEN_HOME 系统环境变量

配置 path 路径 %MAVEN_HOME%\bin

 

 

3. 测试安装

mvn -version

 如下结果表示安装成功

Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: /data/maven/apache-maven-3.3.9
Java version: 1.7.0_80, vendor: Oracle Corporation
Java home: /data/jdk/jdk1.7.0_80/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-514.el7.x86_64", arch: "amd64", family: "unix"

maven默认安装路径

Maven默认的本地仓库路径为 ${user.home}/.m2/repository

 

maven基本安装教程

Maven基础学习(一)—Maven入门

 

maven异常调试奥义📌

mvn -X   加X输出trace日志

mvn -Dmaven.test.skip=true clean package  跳过 test环节

mvn -s "K:\myprogram\maven\apache-maven-3.3.9\conf\settings_bobo.xml" package 指定配置文件进行 打包

maven项目基本结构

标准目录结构:
src
-main
  –bin 脚本库
  –java java源代码文件
  –resources 资源库,会自动复制到classes目录里
  –filters 资源过滤文件
  –assembly 组件的描述配置(如何打包)
  –config 配置文件
  –webapp web应用的目录。WEB-INF、css、js等
-test
  –java 单元测试java源代码文件
  –resources 测试需要用的资源库
  –filters 测试资源过滤库
  -site Site(一些文档)


target
   LICENSE.txt Project’s license
   README.txt Project’s readme

工程根目录下就只有src和target两个目录

target是有存放项目构建后的文件和目录,jar包、war包、编译的class文件等。

 

maven阿里云中央仓库

maven解压完后,一般只需要修改maven根目录下的conf文件夹中的setting.xml文件,修改2处即可,内容如下:

<!-- 本地仓库地址 -->
<localRepository>D:/maven/repo</localRepository>

<!-- 中央仓库镜像地址 -->
<mirrors>
    <mirror>
        <id>alimaven</id>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <mirrorOf>central</mirrorOf>
    </mirror>
</mirrors>

 

GroupID,ArtifactID释意

GroupID:  项目"组织"唯一标识符,可理解为namespace,用来初步定位maven依赖位置,相当于给下面的ArtifactId归类分组,这样不容易冲突 (举例: com.cnblogs.www)。
ArtifactID: 项目的唯一标识符,实际对应项目的名称,就是项目根目录的名称 (举例: myartifactid)。

 效果:在maven clean install 时会用到这些值

[INFO] --- maven-install-plugin:2.4:install (default-install) @ myartifact ---
[INFO] Installing D:\application\eclipse64ee\workspace\myartifact\target\myartifact.war to D:\maven\repo\com\cnblogs\www\myartifact\0.0.1-SNAPSHOT\myartifact-0.0.1-SNAPSHOT.war
[INFO] Installing D:
\application\eclipse64ee\workspace\myartifact\pom.xml to D:\maven\repo\com\cnblogs\www\myartifact\0.0.1-SNAPSHOT\myartifact-0.0.1-SNAPSHOT.pom

 另外: mvn archetype:generate -DgroupId=com.sample -DartifactId=SampleProject -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false 语句中的最后参数意为禁用交互模式,不然会一步步提示我们输入对应的archetype,以及groupId和artifact Id.

 

 

Maven三大生命周期

  Maven有三套相互独立的生命周期,请注意这里说的是"三套",而且"相互独立",这三套生命周期分别是:

  1. Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
  2. Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
  3. Site Lifecycle 生成项目报告,站点,发布站点。

  再次强调一下它们是相互独立的,你可以仅仅调用clean来清理工作目录,仅仅调用site来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。 

1.clean

  clean生命周期每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行mvn clean ,这个的clean是Clean生命周期的一个阶段。有Clean生命周期,也有clean阶段。Clean生命周期一共包含了三个阶段:

  1. pre-clean 执行一些需要在clean之前完成的工作
  2. clean 移除所有上一次构建生成的文件
  3. post-clean 执行一些需要在clean之后立刻完成的工作

  "mvn clean" 中的clean就是上面的clean,在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行,也就是说,"mvn clean"等同于 mvn pre-clean clean ,如果我们运行 mvn post-clean ,那么 pre-clean,clean 都会被运行。这是Maven很重要的一个规则,可以大大简化命令行的输入。 
  Site生命周期pre-site 执行一些需要在生成站点文档之前完成的工作

 

2.default

Default生命周期Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里,只解释一些比较重要和常用的阶段:

  • 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 将最终的包复制到远程的仓库,以让其它开发人员与项目共享。

  运行任何一个阶段的时候,它前面的所有阶段都会被运行,这也就是为什么我们运行mvn install 的时候,代码会被编译,测试,打包。此外,Maven的插件机制是完全依赖Maven的生命周期的,因此理解生命周期至关重要。

 

3.site

  1. site 生成项目的站点文档
  2. post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
  3. site-deploy 将生成的站点文档部署到特定的服务器上

  这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能,Manager比较喜欢,文档及统计数据自动生成,很好看。
  

Maven插件

    1. Maven的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的。
    2. 每个插件都能实现多个功能,每个功能就是一个插件目标。
    3. Maven的生命周期与插件目标相互绑定,以完成某个具体的构建任务,例如compile就是插件maven-compiler-plugin的一个插件目标。

 

Maven 中 plugins 和 pluginManagement的区别

plugins 下的 plugin 是真实使用的,而 pluginManagement 下的 plugins 下的 plugin 则仅仅是一种声明,父项目是不能使用的,子项目中可以对 pluginManagement  下的 plugin  进行信息的选择、继承、覆盖等。

假如存在两个项目,项目A为项目B的父项目,其关系通过pom文件的关系确定。项目A的父pom文件片段如下:

<pluginManagement>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.1.0</version>
            <configuration>
                <delimiters>
                    <delimiter>@</delimiter>
                </delimiters>
                <useDefaultDelimiters>false</useDefaultDelimiters>
            </configuration>
         </plugin>
    </plugins>
</pluginManagement>

如果项目B也想使用该plugin配置,则在项目B的子pom文件中只需要如下配置:

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
    </plugin>
</plugins>

可以看到,子项目的pom文件中,省去了版本、配置细节等信息,只需要指定groupId和artifactId,其他信息均从父项目的pom文件继承。如果子pom文件需要定制自己的插件,可以另行设置,并会覆盖从父pom文件继承到的内容。

特别提示:dependencies 和 dependencyManagement 均是 project 下的直接子元素,但是 plugins 和 pluginManagement 却是 project 下 build 的直接子元素。

 

 

 

聚合和继承区别

聚合主要为了快速构建项目,继承主要为了消除重复   http://www.cnblogs.com/xdp-gacl/p/4058008.html

 

排除maven项目依赖中的某个其它依赖

在projectA项目中依赖projectB,但是projectB又依赖了projectC, 想要让projectA排除projectC的配置如下

<dependencies>
    <dependency>
        <groupId>com.cn.projectB</groupId>
        <artifactId>projectB</artifactId>
        <version>1.0B</version>
        <!--方案一:使用execusions排除A与C的依赖  -->
        <exclusions>
            <exclusion>
                <groupId>com.cn.projectC</groupId>
                <artifactId>projectC</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

 

 

eclipse 中 转换普通maven成maven web项目

部分参考:

Eclipse配置maven web项目的所有问题总结

Eclipse中导入Maven Web项目并配置其在Tomcat中运行

解决Eclipse建Maven项目module无法转换为2.5

 

| 在Navigator视图下打开项目.settings目录:

   org.eclipse.wst.common.component,将1.5改成1.6 (因为项目依赖的jdk版本不一致)

   org.eclipse.wst.common.project.facet.core.xml,把  <installed facet="jst.web" version="3.0"/>改成  <installed facet="jst.web" version="2.5"/>

| 右鍵项目,最下面一行属性properties-->Project Facets-->在java,JavaScript,Dynamic Web Module三个打勾
| 右鍵项目,最下面一行属性properties-->Web Deployment Assembly

| 保证下面5行配置路径正常,如果没有就新建,一般就只有webapp可能需要新建。注意一定要点击Apply按钮,不然关闭后会还原。

 

| 右鍵项目,Maven-->Update Project (ALT + F5)
| 右鍵项目,Run As-->Maven Clean

| 用eclipse 中的 tomcat 正常加载maven web项目

 如果项目起不来,就重点关注这个真正执行的目录还缺什么:D:\application\eclipse64ee\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0

mvn命令直接安装jar

mvn install:install-file -Dfile=src/main/resources/WEB-INF/lib/jave-1.0.2.jar -DgroupId=lt.jave -DartifactId=jave -Dversion=1.0.2 -Dpackaging=jar

mvn install:install-file -Dfile={Path/to/your/ojdbc.jar} -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0 -Dpackaging=jar

maven直接使用项目本身自带的jar包

pom.xml中添加 , 相关路径前添加上${basedir}即可 , 注意如果直接以src/main开头 ,则不要以 / 开头

        <dependency>
            <groupId>com.king</groupId>
            <artifactId>king_sms</artifactId>
            <version>0.0.1</version>
            <scope>system</scope>
            <systemPath>${basedir}/src/main/lib/king_sms.jar</systemPath>
        </dependency>

 

 

 

scope的分类

引用自: 浅谈maven中的scope,systempath--https://www.cnblogs.com/zhengyun_ustc/archive/2013/03/18/tda.html

1)compile : 表示被依赖项目需要参与当前项目的编译,包括后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去,默认此项。

2)test 表示依赖项目仅仅参与测试相关的工作,包括测试代码的编译,执行。比较典型的如junit

3)runtime 表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过编译而已。在终端的项目(非开源,企业内部系统)中,和compile区别不是很大。比较常见的如JSRXXX的实现,对应的API jar是compile,具体实现是runtime的,compile只需要知道接口就足够了。oracle jdbc驱动jar包就是一个很好的例子,一般scope为runtime。  另runtime的依赖通常和optional搭配使用,optional为true。即可以用A实现也可以用B实现。

4)provided意味着打包的时候可以不用包进去,别的设施(web container)会提供。事实上该依赖理论上可以参与编译、测试、运行等周期。相当于compile,但是打包阶段做了exclude的动作。

5)system 和provided相同,不过被依赖项不会从maven仓库抓,而是从本地系统文件拿,一定要配合systemPath使用

 

另一种说法 from https://www.cnblogs.com/xdp-gacl/p/4051819.html

依赖范围scope用来控制依赖和编译,测试,运行的classpath的关系. 主要的是三种依赖关系如下:
    1.compile 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
    2.test:测试依赖范围。只对于测试classpath有效
    3.provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api
    4.runtime:运行时提供。例如:jdbc驱动

 

systempath

当maven依赖本地而非repository中的jar包,sytemPath指明本地jar包路径

  参考:

复制代码
<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-core</artifactId>
    <version>1.5</version>
    <scope>system</scope>
    <systemPath>${basedir}/WebContent/WEB-INF/lib/hamcrest-core-1.3.jar</systemPath>
</dependency>
复制代码
 

 

在eclipse中把maven项目打包(war,jar)

右键项目 run as -- “mavenbuild”,会看到如下弹出界面,在“Goals”后的文本框内输入“-X package”,勾选上下方的“update snapshots”和“skip tests”,然后点击右下方的“run”.

至于打出来的是jar还是war得看pom.xml中的<packaging>是jar还是war</packaging>

在eclipse中使用界面添加依赖无法自动搜索问题

eclipse菜单 window-> show view –> other –> Maven –> 右键 local repositories –> local repository ,选择 rebuild index

异常

异常1: Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variable and mvn script match.

在jre 参数后添加 空格-Dmaven.multiModuleProjectDirectory=$M2_HOME

 

异常2: Could not resolve dependencies for project

先安装<packaging>xxx.pom</packaging>

 

 

1.maven 打包Could not resolve dependencies for project

最近项目上使用的是idea ide的多模块话,需要模块之间的依赖,比如说系统管理模块依赖授权模块进行认证和授权,而认证授权模块需要依赖系统管理模块进行,然后,我就开始相互依赖,然后出现这样的问题:

“Could not resolve dependencies for project”,让我百思不得其解,最后网络搜了搜,最后给的解决方案是:

我也碰到这个问题,需要把parent工程,也就是package是pom的那个工程先install一下

然后我就找parent下面的pom,找到<packaging>标签里是pom的那个包,然后install了一下,就好了。原因未知,但是的确救了很多碰到相似问题的人

简单一句话:对着父项目先 clean install 然后子项目clean package发布  ok

2.maven 打包无效的目标发行版: 1.8

保证所有打包的项目 使用的jdk为1.8的版本 

 

另外,也建议先package,install子工程。然后install根pom

本小段参考自: https://www.cnblogs.com/weitaming/p/8065891.html

 

使用deploy命令布置到nexus服务上

mvn deploy:deploy-file -s "K:\myprogram\maven\apache-maven-3.3.9\conf\settings_bobo.xml" -DgroupId="com.test.temp" -DartifactId="temp" -Dversion="0.0.1" -Dpackaging=jar -Dfile="D:\temp\20210421\bobo.jar" -Durl=http://nexus.king.com:18081/nexus/content/repositories/thirdparty -DrepositoryId=thirdparty

https://www.cnblogs.com/whatlonelytear/articles/10722773.html#deploy

 

 

 

异常

异常3: 解决Eclipse建Maven项目module无法转换为2.5

异常4: Remove '@override' annotation终极方案

Maven项目解决Remove '@override' annotation终极方案--https://www.cnblogs.com/mao2080/p/7156852.html

在pom.xml中添加如下配置,然后右键Maven->Update project:

<build>
        <plugins>
            <!-- jdk版本号 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

 

异常5:Maven update project后 web Deployment Assembly 丢失问题

在pom.xml中添加一行<packaging>war</packaging>

 

 异常6: 第一行org.apache.maven.archiver.MavenArchiver.getManifest

org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.MavenProject, org.apache.maven.archiver.MavenArchiveConfiguration)

Help——>Install New SoftWare  输入 https://otto.takari.io/content/sites/m2e.extras/m2eclipse-mavenarchiver/0.17.2/N/LATEST/   安装重启eclipse

异常7: Project build error: 'packaging' with value 'jar' is invalid. Aggregator projects require 'pom' as packaging.

如果pom中配置了<module>或被其它子项目引用为<parent> ,即当前项目是聚合或继承模板时, 那么<packaging>必须是pom</packaging>

 

异常8: com.google.gson.GsonBuilder.setLenient()Lcom/google/gson/GsonBuilder;

 

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.5</version> <!-- 删掉,不要,指定版本,让启动的项目本身去定位最精确需要的版本 -->
</dependency>

pom.xml 里引入依赖时,删掉 <version>2.3</version>这一行,Spring Boot 会自动查找匹配最合适的版本

【排错】springboot项目,启动报An attempt was made to call the method com.google.gson.GsonBuilder.setLenient()Lcom/google/gson/GsonBuilder; but it does not exist.【转】==>https://www.cnblogs.com/whatlonelytear/p/12482119.html 

 

maven项目老是自动变成GBK

在pom.xml中配置properties属性

<project>  
    <properties>    
        <!-- 文件拷贝时的编码 -->    
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>    
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>    
        <!-- 编译时的编码 -->    
        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>    
    </properties>
</project>

 

给maven项目设置统一jdk

直接在maven的setting.xml中配置

    <!--  jdk  common config -->
        <profile>
            <id>jdk-1.8</id>
            <activation>
                <activeByDefault>true</activeByDefault>
                <jdk>1.8</jdk>
            </activation>
            <properties>
                <maven.compiler.source>1.8</maven.compiler.source>
                <maven.compiler.target>1.8</maven.compiler.target>
                <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
            </properties>
        </profile>

 

 

三、dependencyManagement与dependencies区别

dependencies

dependencies即使在子模块中不写该依赖项,那么子模块仍然会从父项目中继承该依赖项(全部继承)。

dependencyManagement

dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显式的声明需要用的依赖。

如果不在子项目中声明依赖,是不会从父项目中继承下来的;

只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;

另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。

所以一般还是偏向于dependencyManagement

 

 

 

强行更新快照 SNAPSHOT

有时候明明引用正确了,但却还是报类或方法使用错误,那么就可能是引用了旧版本的maven 生成的jar , 此时选中eclipse项目, alt+F5 勾选 Force Update of Snapshots/Releases就可以强行替换服务上最新版本了

 

参考: https://www.cnblogs.com/asderx/p/6541945.html

 

mirror和repository优先级问题(本小节不可全信,仅供参考)

三者相等时,依次按mirrorOf_id>pom_repo_id>set_repo_id的顺序下载jar包.
pom_repo_id和mirrorOf_id不等时,pom_repo_id更高优先级.
mirrorOf_id和set_repo_id不等时,mirrorOf_id更高优先级.
pom_repo_id和set_repo_id不等时,pom_repo_id更高优先级.
以上结论未经验证, 不代表官方说法, 仅为笔者根据百度他人说明意淫而来,下图说法切不可全信.

原图地址: https://www.processon.com/view/link/5cb6ef50e4b0bab9095c2083 

 

项目加载依赖项时的处理优先级:

第一优先级 项目POM文件中 <repository> 节点指定的仓库
第二优先级 IDE中配置的Settings.xml中指定的仓库
第三优先级 Maven默认的Settings.xml中指定的仓库

 

 

 

 


 

某人的setting.xml如下 , 参考自: maven的mirror和repository加载顺序==>https://www.cnblogs.com/ctxsdhy/p/8482725.html

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <localRepository>X:\工具\maven资源\repository</localRepository>
  <pluginGroups></pluginGroups>
  <proxies></proxies>
  <servers></servers>
  <mirrors>
    <mirror>
      <id>nexus-aliyun</id>
      <name>Nexus aliyun</name>
      <mirrorOf>central</mirrorOf>
      <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
    <mirror>
      <id>nexus-mine</id>
      <name>Nexus mine</name>
      <mirrorOf>*</mirrorOf>
      <url>http://xx.xx.xx.xx/nexus/content/groups/public</url>
    </mirror>
  </mirrors>
  <profiles></profiles>
</settings>

nexus-aliyun使用阿里云的镜像作为central中央仓库
nexus-mine作为私服,mirrorOf配置为*来提供中央仓库中不存在的jar包

 


 

 

另一篇文章关于mirror的说法: https://www.cnblogs.com/molashaonian/p/7242010.html

高级的镜像配置: 
1.<mirrorOf>*</mirrorOf> 
匹配所有远程仓库。这样所有pom中定义的仓库都不生效
2.<mirrorOf>external:*</mirrorOf> 
匹配所有远程仓库,使用localhost的除外,使用file://协议的除外。也就是说,匹配所有不在本机上的远程仓库。 
3.<mirrorOf>repo1,repo2</mirrorOf> 
匹配仓库repo1和repo2,使用逗号分隔多个远程仓库。 
4.<mirrorOf>*,!repo1</miiroOf> 
匹配所有远程仓库,repo1除外,使用感叹号将仓库从匹配中排除。

mirrors可以配置多个mirror,每个mirror有id,name,url,mirrorOf属性,id是唯一标识一个mirror就不多说了,name貌似没多大用,相当于描述,url是官方的库地址,mirrorOf代表了一个镜像的替代位置,例如central就表示代替官方的中央库。

我本以为镜像库是一个分库的概念,就是说当a.jar在第一个mirror中不存在的时候,maven会去第二个mirror中查询下载。但事实却不是这样,当第一个mirror中不存在a.jar的时候,并不会去第二个mirror中查找,甚至于,maven根本不会去其他的mirror地址查询。

后来终于知道,maven的mirror是镜像,而不是“分库”,只有当前一个mirror无法连接的时候,才会去找后一个,类似于备份和容灾。

还有,mirror也不是按settings.xml中写的那样的顺序来查询的。

所谓的第一个并不一定是最上面的那个。

当有id为B,A,C的顺序的mirror在mirrors节点中,maven会根据字母排序来指定第一个,所以不管怎么排列,一定会找到A这个mirror来进行查找,当A无法连接,出现意外的情况下,才会去B查询。


  

repository和mirror优先级(另一篇文章)

maven中repository和mirror的关系==>https://www.jianshu.com/p/8aecfebc3ef7

maven中获取真正生效的repository流程:先去获取配置中的repository集合,然后
根据repositoryId去匹配mirrorOf,如果匹配到使用mirror的配置。

  • 对于repositoryId和mirrorOf匹配到情况,会使用mirror配置的地址。
  • 如果mirrorOf配置的*,会覆盖掉所有respository的配置。
  • 如果有多个mirror的配置,最好将mirrorOf为*的放在最后。

 

另外在eclipse中maven问题

在eclipse中如果maven还是有莫名其妙地问题的话,可以从以下三个方面排查下

1.右键项目-->properties-->Java Build Path-->Libraries-->Maven Dependencies是否存在

 

2.右键项目-->properties-->Java Compiler-->Jdk Compiliance-->是否是你真正想要的jdk版本, 默认是1.5

 

3. 项目编码是否经常莫名其妙地变成GBK

在相关项目的pom.xml中配置properties属性

<project>  
    <properties>    
        <!-- 文件拷贝时的编码 -->    
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>    
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>    
        <!-- 编译时的编码 -->    
        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>    
    </properties>
</project>

 

让maven命令打包或安装时强制更新

在持续集成服务器上使用怎样的 mvn 命令集成项目,这个问题乍一看答案很显然,不就是 mvn clean install 么?事实上比较好的集成命令会稍微复杂些,下面是一些总结:

不要忘了clean: clean能够保证上一次构建的输出不会影响到本次构建。
使用deploy而不是install: 构建的SNAPSHOT输出应当被自动部署到私有Maven仓库供他人使用,这一点在前面已经详细论述。
使用-U参数: 该参数能强制让Maven检查所有SNAPSHOT依赖更新,确保集成基于最新的状态,如果没有该参数,Maven默认以天为单位检查更新,而持续集成的频率应该比这高很多。
使用-e参数:如果构建出现异常,该参数能让Maven打印完整的stack trace,以方便分析错误原因。
使用-Dmaven.repo.local参数:如果持续集成服务器有很多任务,每个任务都会使用本地仓库,下载依赖至本地仓库,为了避免这种多线程使用本地仓库可能会引起的冲突,可以使用-Dmaven.repo.local=/home/juven/ci/foo-repo/这样的参数为每个任务分配本地仓库。
使用-B参数:该参数表示让Maven使用批处理模式构建项目,能够避免一些需要人工参与交互而造成的挂起状态。

综上,持续集成服务器上的集成命令应该为 mvn clean deploy -B -e -U -Dmaven.repo.local=xxx 。此外,定期清理持续集成服务器的本地Maven仓库也是个很好的习惯,这样可以避免浪费磁盘资源,几乎所有的持续集成服务器软件都支持本地的脚本任务,你可以写一行简单的shell或bat脚本,然后配置以天为单位自动清理仓库。需要注意的是,这么做的前提是你有私有Maven仓库,否则每次都从Internet下载所有依赖会是一场噩梦。


————————————————
版权声明:本小段为CSDN博主「小小鬼谷子」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tlqfreedom/article/details/60955757

 

所以打包时只需要执行如下命令 ↓ , 注意  -Dmaven.test.skip=true 要在 clean package前

mvn -Dmaven.test.skip=true clean package -U

 

 多模块打包时指定模块相关依赖打包📌

# 打包 -pl 模块名 用于打包指定模块 , -am 用于打包指定指定模块所依赖的其它模块
mvn clean package -Dmaven.test.skip=true -pl iescp-cshop-service-boot -am  

-pl:这是 --projects 的缩写。

-am,或者有时候写作 -amd:这是 --also-make 的缩写。

maven 多个模块指定一个模块打包==>https://www.cnblogs.com/matd/p/12162641.html

 

spring-boot-maven-plugin 插件的作用

  POM 文件中添加了“org.springframework.boot:spring-boot-maven-plugin”插件。在添加了该插件之后,当运行“mvn package”进行打包时,会打包成一个可以直接运行的 JAR 文件,使用“Java -jar”命令就可以直接运行。这在很大程度上简化了应用的部署,只需要安装了 JRE 就可以运行。

可以在POM中,指定生成 的是Jar还是War。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- ... -->
<packaging>jar</packaging>
<!-- ... -->
</project>

 

你还可以指定要执行的类,如果不指定的话,Spring会找有这个【public static void main(String[] args)】方法的类,当做可执行的类。

如果你想指定的话,可以用下面两个方法:

1,如果你的POM是继承spring-boot-starter-parent的话,只需要下面的指定就行。

<properties>
<!-- The main class to start by executing java -jar -->
<start-class>com.mycorp.starter.HelloWorldApplication</start-class>
</properties>
2,如果你的POM不是继承spring-boot-starter-parent的话,需要下面的指定。

    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <version>1.3.5.RELEASE</version>
      <configuration>
        <mainClass>${start-class}</mainClass>
        <layout>ZIP</layout>
      </configuration>
      <executions>
        <execution>
          <goals>
            <goal>repackage</goal>
          </goals>
        </execution>
      </executions>
    </plugin>

 

 

遇见异常

repackage failed: Unable to find main class Maven

parent父项目中如果有如下插件 则一定会在子项目打包, 解决方式是去掉parent父项目中的该插件 ,只在需要打包的web项目中出现即可

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

另外,如果一定要让父项目存在以上配置, 而让子项目能跳过该插件,则可以在子项目中配置

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.1.3.RELEASE</version>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>

 

解决SpringBoot项目repackage failed: Unable to find main class Maven打包 install的问题==>https://blog.csdn.net/chl191623691/article/details/101422761

Return code is: 400, ReasonPhrase: Bad Reques

deploy的地址应该用的是hosted仓库 , 却写成了public group地址

使用Maven Deploy项目到Nexus时报错: Return code is: 400, ReasonPhrase: Bad Reques==>https://blog.csdn.net/Alexshi5/article/details/81633948  

 

401

setting.xml中的<server>节点配置有误

 

mvn site : java.lang.ClassNotFoundException: org.apache.maven.doxia.siterenderer.DocumentContent

原mvn site : java.lang.ClassNotFoundException: org.apache.maven.doxia.siterenderer.DocumentContent==>https://blog.csdn.net/bbsdsz/article/details/85335095

在执行mvn site时遇到的异常, 此时不要使用maven-site-plugin:3.3 plugin, 用更新的3.71.新版本就行

<build>
        <plugins>
 
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-site-plugin</artifactId>
                <version>3.7.1</version>
            </plugin>
 
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-project-info-reports-plugin</artifactId>
                <version>3.0.0</version>
            </plugin>
 
        </plugins>
    </build>

 

Failure to find com.fasterxml.jackson:jackson-bom:pom:1.9.13

[ERROR] [ERROR] Some problems were encountered while processing the POMs:
[ERROR] Non-resolvable import POM: Failure to find com.fasterxml.jackson:jackson-bom:pom:1.9.13 in http://47.96.181.192:8081/nexus/content/groups/public was cached in the local repository, resolution will not be reattempted until the update interval of nexus-releases has elapsed or updates are forced @ org.springframework.boot:spring-boot-dependencies:2.1.4.RELEASE, D:\maven\repo_bobo\org\springframework\boot\spring-boot-dependencies\2.1.4.RELEASE\spring-boot-dependencies-2.1.4.RELEASE.pom, line 605, column 13

那是因为maven中央仓库,下架了该版本,导致找不到了, 我们需要换更新的版本,在properties中指定<jackson.version>2.9.8</jackson.version> 即可

参考自: 使用Maven编译spring boot报错找不到jackson-bom:pom:2.6.2==>https://blog.csdn.net/weixin_43232196/article/details/82760093  (定位问题的思路值得参考)

 

 'version' contains an expression but should be a constant

这是因为Maven3 不允许出现version为非常量值的情况。那么就将版本号改成常量后可以正常打包.

之后再来研究@back

如果更新版本号一个文件一个文件的去改太麻烦,可以用以下命令一次性更新版本号:
>mvn versions:set -DnewVersion=0.0.2-SNAPSHOT
>mvn versions:update-child-modules
更新的父及子Module的版本号都改成了0.0.2-SNAPSHOT.

 

参考 Maven3 package时报 'version' contains an expression but should be a constant==>https://blog.csdn.net/weixin_34303897/article/details/89940758

 

Could not find artifact xxxxxx in nexus-releases

我遇到的问题是spring-boot-starter-web 在idea 的maven视图是搜索出了10个下拉, 目前已无法重现 ,

 

 

 和网上的删旧jar包没有关系, 而是和pom.xml的父子层配置是否有冲突有关系, 最终还是删删改改了pom.xml的依赖才变成能正常更新了.

本异常仅供记录, 并不具通用参考价值  @20200316

 

[ERROR] Failed to execute goal on project onlineshop-boot: Could not resolve dependencies for project com.shop:onlineshop-boot:jar:1.0.0-SNAPSHOT: Could not find artifact org.springframework.cloud:spring-cloud-dependencies:jar:Greenwich.SR1 in nexus-releases (http://nexus.princess.com:8081/nexus/content/groups/public), try downloading from https://github.com/spring-cloud -> [Help 1]

 

cannot resolve symbol xxx  

有时候傻X maven就是死活找不到类, 明明这个jar包位置完全正确, 无情地删掉重新导吧,能解决大部分类找不到的问题   (mark at 20201113 花费3小时)

 

 

实用参考链接:

$maven学习(上)- 基本入门用法

$maven学习(中)- 私服nexus搭建

$【Maven】Eclipse 使用Maven创建Java Web项目

$$$$$maven全局配置文件settings.xml详解--http://www.cnblogs.com/jingmoxukong/p/6050172.html

 如何把maven项目转换成web项目--https://blog.csdn.net/zouxucong/article/details/56009537

 maven打包时去除不需要的jar包策略==>https://blog.csdn.net/u013760453/article/details/85242883

孤傲苍狼的博客园--http://www.cnblogs.com/xdp-gacl/

其它问题

解决Intellij IDEA maven 老是自动跳到1.5的JDK==>https://blog.csdn.net/coding_lin/article/details/81878518

<properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>

 

 

我的学习项目gitee

git@gitee.com:KingBoBo/MavenParent.git
git@gitee.com:KingBoBo/MavenSonA.git
git@gitee.com:KingBoBo/MavenSonB.git

 

maven其它参考

maven-replacer-plugin 静态资源版本号解决方案(css/js等)==>https://blog.csdn.net/yclimb/article/details/79583759

Maven多模块及version修改的实现方法【转】==>https://www.cnblogs.com/whatlonelytear/p/12973827.html

搞懂Maven的本地仓、远程仓、中央仓、私服==>https://www.bigtspace.com/archives/10149.html

posted @ 2017-03-02 14:00  苦涩泪滴  阅读(918)  评论(3)    收藏  举报