Maven从错误的位置读取用户配置

Svi*_*ish 5 maven-3 maven

我刚刚发现为什么Maven在我的机器上无法正常工作.出于某种原因,它从完全错误的位置读取用户配置.我不明白为什么.当我使用-X交换机运行maven时,我在开始时得到以下输出:

[DEBUG] Reading global settings from D:\dev\maven\active\conf\settings.xml
[DEBUG] Reading user settings from D:\.m2\settings.xml
[DEBUG] Using local repository at D:\dev\maven_repo
Run Code Online (Sandbox Code Playgroud)

为什么D:\.m2它通常应该读取用户设置而不是我的实际用户目录?它在我的旧电脑上运行良好.这次与我在不同的驱动器上安装了maven有什么关系吗?在我的旧电脑上,它安装在C盘上.

D:\.m2从哪里得到的?如何让它从实际的默认位置读取用户设置文件%userprofile%\.m2

Svi*_*ish 8

终于想通了.在这篇博文中找到了解决方案.要在Java中查找主目录,请执行以下操作:

System.getProperty("user.home");
Run Code Online (Sandbox Code Playgroud)

问题是,由于某些愚蠢的原因,Java没有使用Windows环境变量或类似的东西来查找此路径.它实际上使用Desktop目录的父目录.由于我喜欢将我的用户目录中的某些主文件夹保存在单独的驱动器(文档,下载,音乐,桌面等)上,因此我已将桌面目录移至D:\Desktop.然后Java接受该目录,向上升级并使Maven和其他Java应用程序认为D:\是我的主目录.

总而言之,我越是习惯使用Java,我就越讨厌它......无论如何,希望这可能有助于为其他人节省一些时间.


更新

最初的博客帖子已经消失了,但是在WaybackMachine上找到了(网址已经更新),但是这里也是该帖子的要点,以防万一...

问题:那么Java如何发挥所有这一切?嗯,Java开发人员有时希望将其应用程序的设置存储在用户配置文件目录中的文件夹中.这是Linux的方式,Java倾向于以Linux的方式做事.(如前所述,Windows的"AppData"文件夹服务器具有相同的用途,对数据有一些额外的分离,取决于它是否应该与用户的配置文件一起漫游.)出于某种原因,Java不使用Windows环境变量来确定用户配置文件的位置,而是访问引用用户桌面文件夹的注册表项.然后它获取桌面的父目录并假定它是用户的配置文件文件夹(假设用户使用Windows选择的默认设置).

本质上,当程序员调用Java命令时:

System.getProperty("user.home");
Run Code Online (Sandbox Code Playgroud)

Java使用以下想法来确定我的用户配置文件文件夹的位置:

PATH_TO_DESKTOP_FOLDER_AS_SET_IN_THE_REGISTRY + "\..\"
Run Code Online (Sandbox Code Playgroud)

修改桌面文件夹时会出现故障.

因此,使用我的设置,而不是保存设置:

c:\users\tim\
Run Code Online (Sandbox Code Playgroud)

Java应用程序倾向于将数据保存到:

t:\tim\
Run Code Online (Sandbox Code Playgroud)

实际上,Java应用程序应将设置保存到:

c:\users\tim\AppData\Roaming\
Run Code Online (Sandbox Code Playgroud)

或类似的东西.

为了增加侮辱伤害,Java应用程序继续遵循Linux方式,并在文件夹名称的开头使用一段时间来尝试"隐藏"该文件夹(就像在Linux上一样).对于Windows用户,这只是确保这些文件夹首先列在目录列表中.(通过设置文件的隐藏属性,可以在Windows上隐藏文件夹.)

看起来NetBeans已针对其应用程序解决了该问题,但根本问题仍然是一个未解决的低优先级错误.不知怎的,我敢打赌,如果用于确定用户在Linux上的主路径的机制是错误的,它会得到更快的修复.