java中user.home环境变量的问题

下午在开发的过程中发生了几个"怪异"的问题。

先是在IDEA中开发时,无法自动导入jdk中的java.util.Map类。在自动提示列表中找不到java.util.Map这个类。
但是却能自动导入java.util.List类;如果手动import java.util.Map; 编译并不提示错误,运行也正常。
在网上搜索下,发现比较多的人碰到过这类问题。但是解决方法各异。其中有人提到时jdk版本冲突的问题。
在我的pc上使用everything搜索下java.exe,确实发现多个版本的java.exe,定位到IDEA时使用jdk8启动的,而开发的project却配置的jdk时1.7版本的。

尝试把jdk8卸载后,重新启动IDEA,提示选择setting目录(即.IDEA目录),
选择了windows中当前用户目录下的.IDEA目录,启动ok。
然后在编辑其中输入Map发现可以自动提示java.util.Map,看来真的是jdk版本冲突的问题;
但是这种冲突为什么会导致无法自动提示java.util.Map,因为开发任务的原因,并没有深究;
想着终于可以愉快的开发了,心中倍爽。

紧接着出现了一个更"怪异"的问题。
之前编译ok的项目,全都提示变异错误,找不到第三方的jar。
这些jar都是公司内部maven镜像库中的jar。这尼玛什么鬼,成心不让人愉快的工作啊。
ctrl+alt+s 打开IDEA的配置对话框,在Build Tools中定位到Maven,发现了问题的所在
java中user.home环境变量的问题_第1张图片

Maven使用的默认settings.xml文件指向了D:\Documents\.m2\settings.xml,默认的repository也指向了D:\Documents\.m2\repository,发现了问题所在,之前使用的是windows中当前用户的根目录C:\Users\jack\.m2中的settings.xml,这里配置的central repository使用的是公司内部的镜像,而D:\Documents\.m2并没有什么settings.xml文件,所以就使用默认的中央库,当然是找不到公司内部的jar。然而这是为什么呢,为什么卸载了原来的jdk8,maven的默认库路径就变了呢?查看了settings.xml文件,默认的reposiory路径是${user.home}/.m2/repository, 想到前面卸载掉jdk8后重启IDEA提示选择配置文件目录(之前启动配置一次后就不再提示)。这里判断应该是user.home这个环境变量的值变了。
写了个测试用例

System.out.println(System.getProperty("user.home"));

输出的正是D:\Documents目录。
网上搜索后发现原来这是jdk1.7以及以前版本的一个bug,从1.8之后修改掉了。http://bugs.java.com/view_bug.do?bug_id=4787931
jdk1.7以及之前的版本设置user.home环境变量是通过从注册表项
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Desktop]
拿到值,然后取这个路径的上级目录。使用regedit查看pc上该注册表项的值就是D:\Documents\Desktop,这是公司提供的电脑把用户的桌面目录切换到D:\Documents\下,以便系统重装后不丢失个人数据。

定位到问题后,解决的办法就很多了:
1、在IDEA中override settings.xml路径以及repository的路径
2、命令行中执行mvn命令式添加-s C:\Users\jack\.m2\settings.xml
3、把C:\Users\jack\.m2 复制到D:\Documents\目录下

你可能感兴趣的:(java,jdk,user.home)