和其他文章一样,记录使用过程中学习的心得,及遇到的坑。
maven内部运行原理解析(一)
maven内部运行原理解析(二)
Maven总结
不同的Maven版本,需要对应的JDK版本才能正常工作的,不然会有各种各样的问题。笔者就是在一个项目中,使用了JDK1.8(java8),然后用了Maven 3.6.3。结果在使用Maven import老项目时,部分依赖包总是无法自动下载下来(不是所有的都下不下来,而是部分的下不下来,并且有些是能下doc,能下sources.jar,但不能下载class的jar)。见下图,但明明到nexus是可以看到版本有效的。
后来问了同事,知道Maven和JDK版本有冲突,然后上Maven官网一看,果然这个是写的明明白白的。见Maven官网的 Maven VS JDK对应图
以下摘抄简短对比
Mave版本 | JDK版本 |
---|---|
3.3.1 到 3.6.3(当前最新版本) | Java 7 |
3.2.1 到 3.2.5 | java 6 |
2.2.0 到 3.1.1 | java 5 |
2.0 到 2.2.1 | Java 1.4 |
但是,可但是,但可是,然并卵,上述版本对应并不是一定起作用,即使使用了所描述的Maven+JDK版本,还是有可能遇到部分JDK没下载成功的情况。所以还是要多换几个maven+jdk版本尝试。使用mvn -v可以看到当前使用的maven和JDK版本。如果没下成功的比较少的话,直接到中央仓库手动拿jar包即可。
C:\Windows\system32>mvn -v
Apache Maven 3.0.5 (r01de14724cdef164cd33c7c8c2fe155faf9602da; 2013-02-19 21:51:28+0800)
Maven home: D:\Tools\apache-maven-3.0.5\bin\..
Java version: 1.8.0_251, vendor: Oracle Corporation
Java home: D:\Program Files\Java\jdk1.8.0_251\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "dos"
C:\Windows\system32>mvn -v
Apache Maven 3.0.5 (r01de14724cdef164cd33c7c8c2fe155faf9602da; 2013-02-19 21:51:28+0800)
Maven home: D:\Tools\apache-maven-3.0.5\bin\..
Java version: 1.8.0_251, vendor: Oracle Corporation
Java home: D:\Program Files\Java\jdk1.8.0_251\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "dos"
指定本地仓库位置,是在Maven的配置文件中,如果不指定本地仓库位置,默认会把依赖包下载到如下目录,这样显然不利于管理,所以要改变本地的路径,
C:\Users\86185.m2\repository\
变更本地仓库路径的文件是:{Maven安装路径}\conf\settings.xml
打开这个文件,发现setting下所有的子节点都被注释掉了,其实都没用到。指定本地仓库位置,并不是用到被注释的节点,而是在setting下增加一个节点,直接复制即可(当然要换成自己喜欢的路径)
<localRepository>D:\Tools\MavenStorelocalRepository>
项目中指定中央仓库位置,不是在Maven中,到项目路径下,根目录一定有一个pom.xml。没有这个文件,那说明你的不是maven项目,别看这片文章了。
POM中指定仓库的位置,都包含在repositories 节点下,具体如下。查找顺序还没来得及看,先记录下来。
如下的xml结构,不过xml节点和真实链接有一点点不同,列举如下:
XML节点 | 对应链接 |
---|---|
http://121.201.35.8:9081/nexus/repository/maven-public/ | http://121.201.35.8:9081/nexus/#browse/browse:maven-public |
但实际中,应该是访问http://121.201.35.8:9081/nexus/,然后点击左边的browse,在选择maven-public
<repositories>
<repository>
<id>nexusid>
<name>nexus repositoryname>
<url>http://121.201.35.8:9081/nexus/repository/maven-public/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>trueenabled>
snapshots>
repository>
<repository>
<id>snapshotsid>
<name>nexus repositoryname>
<url>http://121.201.35.8:9081/nexus/repository/maven-snapshots/url>
<releases>
<enabled>falseenabled>
releases>
<snapshots>
<enabled>trueenabled>
snapshots>
repository>
<repository>
<id>releasesid>
<name>nexus repositoryname>
<url>http://121.201.35.8:9081/nexus/repository/maven-releases/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>falseenabled>
snapshots>
repository>
repositories>
无论使用eclipse还是Intellij IDEA,里面的自动关联maven更新可能都有些问题,哦,也可能是笔者配置的不好导致,所以可能需要在项目命令行下直接使用maven,看下载依赖包的错误。下面是拿来即用的命令。
mvn clean package -e -U -X -Dmaven.test.skip=true >myMavenLog.log
参数 | 用途 |
---|---|
clean | 清除target目录下的之前打好的jar包或者是war包 |
-e | 详细异常 |
-U | 强制更新 |
-X | 打印错误信息(这个一定要,看是出了啥错误) |
-Dmaven.test.skip=true | 据说加这个会比较快 |
>myMavenLog.log | 这个实际上是MS DOS的命令,把输出结果放到myMavenLog.log 这个文件中 |
使用命令行,并将输出结果放到myMavenLog.log文件中之后,就比较容易检查错误了。以下列出实际使用中笔者所遇到的错误:
该错误的log如下:
at org.apache.maven.repository.internal.DefaultModelResolver.resolveModel(DefaultModelResolver.java:122)
... 33 more
Caused by: org.sonatype.aether.transfer.ArtifactNotFoundException: Could not find artifact com.xuebangsoft:xb-jigsaw-projects:pom:0.1.3-SNAPSHOT in nexus (http://121.201.35.8:9081/nexus/repository/maven-public/)
at org.sonatype.aether.connector.wagon.WagonRepositoryConnector$4.wrap(WagonRepositoryConnector.java:947)
关键信息:Could not find artifact
com.xuebangsoft:xb-jigsaw-projects:pom:0.1.3-SNAPSHOT in nexus
到Nexus中查看,确实没有这个包的存在,应该是漏了放上去
有2个解决方案:
D:\Tools\MavenStore\com\xuebangsoft\xb-jigsaw-distributed-lock-api\0.1.2\xb-jigsaw-distributed-lock-api-0.1.2.pom
D:\Tools\MavenStore\com\xuebangsoft\xb-jigsaw-distributed-lock-zk-impl\0.1.9\xb-jigsaw-distributed-lock-zk-impl-0.1.9.pom
手动改pom拿其他版本的,看到nexus上有0.1.8,就拿这个最新的吧。
把
<parent>
<groupId>com.xuebangsoftgroupId>
<artifactId>xb-jigsaw-projectsartifactId>
<version>0.1.3-SNAPSHOTversion>
parent>
改成
<parent>
<groupId>com.xuebangsoftgroupId>
<artifactId>xb-jigsaw-projectsartifactId>
<version>0.1.8version>
parent>
同样是could not find artifact,但这是Maven的文件
Could not find artifact org.glassfish:javax.el:pom:3.0.1-b06-SNAPSHOT in nexus
maven-metadata-jvnet-nexus-snapshots.xml 中引用如下。
<metadata>
<groupId>org.glassfishgroupId>
<artifactId>javax.elartifactId>
<versioning>
<versions>
<version>3.0.1-b06-SNAPSHOTversion>
<version>3.0.1-b07-SNAPSHOTversion>
<version>3.0.1-b08-SNAPSHOTversion>
<version>3.0.1-b11-SNAPSHOTversion>
versions>
<lastUpdated>20180604075339lastUpdated>
versioning>
metadata>
造成这个原因,是因为Maven版本众多,不同版本的maven,对依赖的版本也不尽相同,但自己的nexus仓库,总不能把所有的版本都囊括进来。
解决方案一:找到pom文件中的版本,放到自己的nexus仓库
解决方案二:自己看看中央仓库的javax.el有什么版本,替换掉pom中的版本号
笔者使用方案二可以解决问题。
这个其实后面也会指到错误 Could not find artifact
解决方案同上
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)
Caused by: org.apache.maven.project.DependencyResolutionException: Could not resolve dependencies for project com.eduboss:eduboss:war:1.2.8-SNAPSHOT: Could not find artifact xb-mq-event:xb-mq-event:jar:DASHAN-UAT-SNAPSHOT in nexus (http://121.201.35.8:9081/nexus/repository/maven-public/)
at org.apache.maven.project.DefaultProjectDependenciesResolver.resolve(DefaultProjectDependenciesResolver.java:189)
如下,requires Maven version,需要换更高级的maven版本,好在Maven是使用环境变量配置的,在环境变量中将MAVEN_HOME指到对应的maven版本即可,随时可以再改回来
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 57.306s
[INFO] Finished at: Fri Jun 19 17:44:26 CST 2020
[INFO] Final Memory: 17M/135M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal com.github.eirslett:frontend-maven-plugin:1.4:install-node-and-npm (install-node-and-npm) on project eduboss: The plugin com.github.eirslett:frontend-maven-plugin:1.4 requires Maven version 3.1.0 -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal com.github.eirslett:frontend-maven-plugin:1.4:install-node-and-npm (install-node-and-npm) on project eduboss: The plugin com.github.eirslett:frontend-maven-plugin:1.4 requires Maven version 3.1.0
很熟悉的字眼,out of memory,只要加大内存就好
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 14:39 min
[INFO] Finished at: 2020-06-19T18:13:44+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.2:compile (default-compile) on project eduboss: Fatal error compiling: java.lang.OutOfMemoryError: RegularFileObject[E:\com\code\Java\Study1\Dashan2\src\main\java\com\eduboss\modules\others\service\impl\RealTimeReportServiceImpl.java]@pos37220: RegularFileObject[E:\com\code\Java\Study1\Dashan2\src\main\java\com\eduboss\modules\others\service\impl\RealTimeReportServiceImpl.java]@pos37235: RegularFileObject[E:\com\code\Java\Study1\Dashan2\src\main\java\com\eduboss\modules\others\service\impl\RealTimeReportServiceImpl.java]@pos37265: RegularFileObject[E:\com\code\Java\Study1\Dashan2\src\main\java\com\eduboss\modules\others\service\impl\RealTimeReportServiceImpl.java]@pos37260: GC overhead limit exceeded -> [Help 1]
在Maven的安装路径:%MAVEN_HOME%\bin下,找 mvn.bat 或 mvn.cmd 文件(不同版本的Maven文件名不同,但必定为二者之一)。
加入以下语句,
set MAVEN_OPTS = -Xms128m -Xmx512m
想要更大的运行内存空间可以设到:(笔者就是设了上面的,不够用,干脆一次性搞大)
set MAVEN_OPTS = -Xms1024m -Xmx2048m