maven book
maven仓库 https://mvnrepository.com/
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异常调试奥义📌
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有三套相互独立的生命周期,请注意这里说的是"三套",而且"相互独立",这三套生命周期分别是:
- Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
- Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
- Site Lifecycle 生成项目报告,站点,发布站点。
再次强调一下它们是相互独立的,你可以仅仅调用clean来清理工作目录,仅仅调用site来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。
1.clean
clean生命周期每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行mvn clean ,这个的clean是Clean生命周期的一个阶段。有Clean生命周期,也有clean阶段。Clean生命周期一共包含了三个阶段:
- pre-clean 执行一些需要在clean之前完成的工作
- clean 移除所有上一次构建生成的文件
- 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
- site 生成项目的站点文档
- post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
- site-deploy 将生成的站点文档部署到特定的服务器上
这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能,Manager比较喜欢,文档及统计数据自动生成,很好看。
Maven插件
- Maven的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的。
- 每个插件都能实现多个功能,每个功能就是一个插件目标。
- 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项目
部分参考:
| 在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 会自动查找匹配最合适的版本
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>
Return code is: 400, ReasonPhrase: Bad Reques
deploy的地址应该用的是hosted仓库 , 却写成了public group地址
401
setting.xml中的<server>节点配置有误
mvn site : java.lang.ClassNotFoundException: org.apache.maven.doxia.siterenderer.DocumentContent
在执行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.
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】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/
- « 上一篇:Maven学习总结(二)——Maven项目构建过程练习
- » 下一篇:Maven学习总结(三)——使用Maven构建项目
- » 下一篇:Maven学习总结(四)——Maven核心概念
- » 下一篇:Maven学习总结(五)——聚合与继承
- » 下一篇:Maven学习总结(六)——Maven与Eclipse整合
- » 下一篇:Maven学习总结(七)——eclipse中使用Maven创建Web项目
- » 下一篇:Maven学习总结(八)——使用Maven构建多模块项目
- » 下一篇:Maven学习总结(九)——使用Nexus搭建Maven私服
其它问题
解决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