maven 编译和缓存
maven 入门是很容易的,但是用好比较难。经常是各种奇怪问题。
比如, 我一个maven工程的 依赖的jar 已经发生了变化: 可能类名、方法、字段都已经改了, 但我当前工程 却没报错, 重新编译也没有出现任何问题, 但是呢, 你重启一下idea ,问题就出来了!
why, 应该是还是各种缓存引起的!
首先, target 目录下有之前编译好的class, 如果不 clean 他们,那么我们 package 打包就不会重新编译,也就是没有 compile 这个步骤。 那么,依赖jar 修改引起的问题就不会暴露出来。 但是那个依赖问题是客观存在的。
因为之前依赖的jar 是没问题的, 但是现在的jar 已经不是最新的了, 按理说, 当前工程也是 必须需要重新编译的, 但是呢, 我们可能会忘记, 比如我, 往往就是为了省事, 直接一个 install ,这个时候呢, 其实是不对的!
pom 能够继承的元素。
如何知道哪些 元素是继承而来的?
pom 继承
mvn dependency:tree >> D:/tree.txt
查看依赖树中包含某个artifactId的依赖链(artifactId前面加上冒号)
mvn dependency:tree -Dincludes=:fastjson:
或者
查看依赖树中包含某个groupId的依赖链(-Dincludes后面跟上groupId)
mvn dependency:tree -Dincludes=com.alibaba:
---
idea 和maven插件
有时候也经常遇到:
Error running 'umc-portal [clean]': No valid Maven installation found. Either set the home directory in the configuration dialog or set the M2_HOME environment variable on your system.
M2_HOME 我其实是有设置的,但是没有啥用, 也就是说跟 M2_HOME 无关。(这么说, 也算是一个idea 插件的小bug)
打卡 config dialog 一看:
仔细一想, 这个大概是因为我切换了 idea 引起的
idea 从2020 升级到2021, 就出现了
C:/Program Files/JetBrains/IntelliJ IDEA 2020.2.3/plugins/maven/lib/maven3 应该是之前的目录,后面卸载了 idea 2020, 但是仍然保留了一些残留。
解决方法很简单, 点击选择其他的 可用的 maven即可:
不过, Use Maven wrapper 也是不能选择的,因为我没有这个文件:
Maven Wrapper:
Maven Wrapper 是什么? 它是一个包装器,我也没有用过,看起来是需要 一个 Maven-Wrapper.properties文件, 我本地也没有.mvn 目录, 没有那个properties文件
那么
idea 自带的maven插件
Bundled (Maven 3)
什么是Bundled (Maven 3), 其实就是idea 自带的maven, Bundled就是绑定的。 这个应该是安装idea 的时候,选择插件的界面选择的。(记得默认就会有maven插件, 还好很多其他一大堆)
之前的idea 版本,好像还有 Bundled (Maven 2),
IDEA 中 maven 自带 Bundled (Maven 2) 和 Bundled (Maven 3) 的文件目录位置在 idea 安装的 plugins 目录中。
假设 IDEA 安装目录为:D:workideaIU-2017.3.1.win
Bundled (Maven 2)的目录为:D:workideaIU-2017.3.1.winpluginsmavenlibmaven2
Bundled (Maven 3)的目录为:D:workideaIU-2017.3.1.winpluginsmavenlibmaven3
settings.xml 优先级
默认的Bundled (Maven 3),当然 也有一个settings.xml,位于
C:Program FilesJetBrainsIntelliJ IDEA 2021.1pluginsmavenlibmaven3confsettings.xml
但是呢,这个可能不是我们所需要的, 所以呢, 我们修改它即可, 另外呢, 如果Bundled (Maven 3) 不能满足需求,我们可以另外下载一个 apache-maven 可执行程序
然后指定它即可。 比如我的 D:/devTool/apache-maven-3.3.9 :
不过呢, 这样做好像没有什么必要! 因为,一般 idea 自带的maven插件就足够。
另外, 这里有两行是什么意思?
我登录用户是lk, 所以默认 本地仓库地址是 C:Userslk.m2 epository ;
User settings file 的出现,导致了 settings.xml 的优先级更加朴素迷离。 因为 User settings file 是在 idea 中可以配置的。
测试发现呢,User settings file 优先级最高,但是User settings file 指定的文件也可以不存在, 如果 那么以maven-home下的配置 为准!
Override 到底怎么用
Override 有点难理解。
Override 表示是可以覆盖的, 如果勾选了override,那么就可以修改。User settings file 是可以随意指定的。
这里的 User settings file 的优先级其实是最高的。高于 maven下的配置:比如 maven-homeconfsettings.xml, 也就是覆盖的作用。
本地仓库的地址呢, 还可以通过Local repository 进行设置,这个优先级更好,可以覆盖User settings file 中的localRepository