Spring Boot应用部署Google App Engine执行appengineRun时遇Jetty异常
gradlew appengineRun时的Windows注册表权限警告 嘿,我之前也踩过这个Windows偏好设置警告的坑,先帮你理清楚情况:
首先你遇到的完整输出是这样的:
Starting a Gradle Daemon (subsequent builds will be faster)
2018年3月26日 下午5:47:48 java.util.prefs.WindowsPreferencesWARNING: 无法打开/创建首选项根节点Software\JavaSoft\Prefs,根节点为0x80000002。Windows RegCreateKeyEx(...)返回错误码5。
2018-03-26 17:47:51.665:INFO::main: Logging initialized @3872ms
2018-03-26 17:47:53.727:INFO:oejs.Server:main: jetty-9.3.18.v20170406
2018-03-26 17:48:01.040:WARN:oeja....
问题根源
这个警告里的错误码5就是「权限拒绝」,Java尝试访问Windows注册表的HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs路径来创建偏好设置节点,但当前用户没有足够的写入权限。不过别太担心——这个警告大多时候只是日志噪音,不会阻止你的Jetty/GAE本地服务器启动,只是看着闹心而已。
三种解决办法,按需选:
方法1:临时救急——管理员身份运行命令行
找到你的CMD或者PowerShell,右键选「以管理员身份运行」,再执行gradlew appengineRun。管理员权限会允许Java创建注册表节点,警告直接消失。方法2:一劳永逸——手动配置注册表权限
如果不想每次都开管理员窗口,直接手动搞定注册表:- 按
Win+R输入regedit打开注册表编辑器 - 导航到
HKEY_LOCAL_MACHINE\Software - 右键
Software→ 新建 → 项,命名为JavaSoft - 右键
JavaSoft→ 新建 → 项,命名为Prefs - 右键
Prefs→ 权限,给你的当前用户分配「写入」或者「完全控制」权限 - 关掉注册表,重新运行命令就ok了
- 按
方法3:规避注册表——让Java用本地目录存偏好
要是不想碰注册表,也可以让Java把偏好设置存在本地文件夹:
要么在项目根目录的gradle.properties里加一行:org.gradle.jvmargs=-Djava.util.prefs.systemRoot=C:\temp\java-prefs -Djava.util.prefs.userRoot=C:\temp\java-prefs要么直接在命令里加参数:
gradlew appengineRun -Djava.util.prefs.systemRoot=C:\temp\java-prefs -Djava.util.prefs.userRoot=C:\temp\java-prefs记得先创建
C:\temp\java-prefs这个文件夹哦~
另外,如果你后面的Jetty警告还有完整内容导致服务器启动失败,那得把完整错误贴出来,但目前这个注册表警告本身不是致命问题。
内容的提问来源于stack exchange,提问作者Vinay

