Java : java.util.Preferences 실패
내 프로그램은 암호화 된 제품 키 데이터를 java.util.Preferences
클래스 (사용자가 아닌 시스템 기본 설정) 와 함께 컴퓨터에 저장합니다 . 문제는 Windows와 Linux (OSX에서 테스트하지 않았지만 아마도 동일 할 것임)에서 sudo
관리자 권한 으로 또는 관리자 권한으로 프로그램을 실행하지 않으면 읽기를 시도 할 때마다 예외 또는 경고가 발생한다는 것입니다. 데이터를 저장하십시오.
사용자에게 관리자 권한으로 프로그램을 실행하도록 요구하는 것은 비실용적입니다. 최적으로 운영 체제에서 사용자에게 권한을 요청하고 싶습니다.
이것은 매우 어리석은 일이며의 목적의 절반을 제거합니다 Preferences
. 이 문제를 어떻게 해결할 수 있습니까?
다음은 필요한 사항을 요약 한 것 입니다. 시스템 설정을 저장하기 위해 운영 체제에서 권한을 요청하려면 프로그램이 필요합니다.
오류 정보는 다음과 같습니다.
노드를 읽으려고 할 때 (노드가 존재하지 않기 때문에) 오류는 다음과 같습니다.
Mar 18, 2011 9:41:15 AM java.util.prefs.WindowsPreferences <init>
WARNING: Could not create windows registry node Software\JavaSoft\Prefs\myapp at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.
Mar 18, 2011 9:41:15 AM java.util.prefs.WindowsPreferences WindowsRegOpenKey1
WARNING: Trying to recreate Windows registry node Software\JavaSoft\Prefs\myapp at root 0x80000002.
Mar 18, 2011 9:41:15 AM java.util.prefs.WindowsPreferences openKey
WARNING: Could not open windows registry node Software\JavaSoft\Prefs\myapp at root 0x80000002. Windows RegOpenKey(...) returned error code 2.
Mar 18, 2011 9:41:15 AM java.util.prefs.WindowsPreferences WindowsRegOpenKey1
WARNING: Trying to recreate Windows registry node Software\JavaSoft\Prefs\myapp\subpackage at root 0x80000002.
Mar 18, 2011 9:41:15 AM java.util.prefs.WindowsPreferences openKey
WARNING: Could not open windows registry node Software\JavaSoft\Prefs\myapp\subpackage at root 0x80000002. Windows RegOpenKey(...) returned error code 2.
그리고 이것은 노드에 쓰려고 할 때 일어나는 일입니다.
Mar 18, 2011 9:43:11 AM java.util.prefs.WindowsPreferences WindowsRegOpenKey1
WARNING: Trying to recreate Windows registry node Software\JavaSoft\Prefs\myapp\subpackage at root 0x80000002.
Mar 18, 2011 9:43:11 AM java.util.prefs.WindowsPreferences openKey
WARNING: Could not open windows registry node Software\JavaSoft\Prefs\myapp\subpackage at root 0x80000002. Windows RegOpenKey(...) returned error code 2.
불행히도 여기에서 얻은 대부분의 답변은 잘못되었습니다 ... 적어도 약간. 원인이 아니라 증상이 치료되고 있다는 의미에서.
요약하자. Java 환경 설정에는 사용자 트리 와 시스템 트리의 두 가지 "트리" 가 있습니다 . Java 환경 설정 (백킹 저장소라고 함)에 고유 한 백엔드를 작성할 수 있지만 개발자는 거의 없으므로 JDK의 기본 백업 저장소로 끝납니다. Windows 플랫폼에서 이것은 Win 레지스트리를 의미합니다.
- 사용자 트리가 에 기록
HKEY_CURRENT_USER\Software\JavaSoft\Prefs
(OS 사용자는 항상 여기에 쓰기 액세스 할 수 있습니다) - 시스템 트리가 에 기록됩니다
HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
(관리자 privs 및 만하는 OS 사용자는 여기에 쓰기 액세스 할 수 있습니다)
요약하자면 : 코드가 시스템 트리를 사용하지 않는 한 괜찮아 야하며 OS 수준에서 권한을 할당하는 것을 망칠 필요가 없습니다. 시스템 트리는 "호스트의 모든 사용자"를위한 것이고 사용자 트리는 특정 로그인 사용자를위한 것입니다. 귀하의 경우에는 사용자 트리로 충분할 수 있다고 확신하므로 이것이 실제로 귀하의 솔루션입니다. 관리자 권한으로 실행하는 등 권한을 엉망으로 만들지 마십시오.
....하지만 더 있습니다. 지침에 따라 코드가 의도적으로 Java 기본 설정 시스템 트리를 건드리지 않는다고 가정합니다. 그러면 Windows에서이 경고가 계속 표시됩니다.
WARNING [java.util.prefs]: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.
그래서 무슨 일이 일어나고 있습니까? 내가 잘못된 충고를 했나요? 별로. 나와 함께있어.
JDK 소스 코드를 살펴보면 0x80000002가 HKLM을 의미한다는 것을 알 수 있습니다. 즉, Windows 레지스트리에서 건 드리면 안되는 위치입니다. 코드는 시스템 트리를 참조하지 않지만 여전히이 경고가 표시됩니다! ?? (이 시점에서 당신은 내가 한 것처럼 머리카락을 모두 찢어 야합니다.)
글쎄, 이것은 실제로 JDK 버그 가있는 드문 경우 중 하나입니다 . 내가 수년간 JDK에서 미묘한 버그가 발견되지 않는 이유에 관심이 있다면 이 답변 에서 더 많은 것을 읽을 수 있습니다. 이 버그는 JDK 1.4 이후로 존재했지만 최근에야 수정되었으며 아직 JDK 8로 백 포트되지 않았습니다.
최고의 조언
- 코드가 시스템 트리가 아닌 사용자 트리 만 참조하는지 확인하십시오. OS가 시스템 전체 위치에 쓰기 위해 모든 종류의 priv를 요구하는 것은 공정합니다. 당신이 경우 정말 그때가 같은 위치에 작성해야 정말 privs 및 할당 관리자 권한으로 실행 또는 무엇을하지 않는 것보다 다른 해결책은 없다.
- 경고를 무시하십시오. Java 9를 사용하거나 Oracle이 버그 수정을 Java 8로 백 포트하기로 결정하면 사라집니다. 경고는 무시해도됩니다.
또는 프로그래밍 방식으로 경고를 무시할 수 있습니다. JDK의 Platform Logger에서 제공되므로 직접 시도하지는 않았지만 다음과 같이 작동합니다.
sun.util.logging.PlatformLogger platformLogger = PlatformLogger.getLogger("java.util.prefs"); platformLogger.setLevel(PlatformLogger.Level.OFF);
이 링크 는 나를 위해 작동합니다.
문제 해결 해결 방법은로 로그인 administrator
하고 키를 만드는 것입니다.HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
레지스트리 항목의 액세스 권한을 변경할 수 있습니다. HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs
모든 사람에게 전체 액세스 권한을 허용 하면 모든 사람이 동일한 기본 설정 집합을 볼 수 있으며 모든 사람이이를 전역 적으로 변경할 수 있습니다. 이것은 고객이 설치 한 소프트웨어에 대한 솔루션이 아니라 누군가에게 유용 할 수 있다는 것을 알고 있습니다.
피드백을 기반으로 답변 수정. 이 솔루션은 아마도 과잉이지만 ...
- 레지스트리 대신 파일에 쓰도록 상점을 변경하는 것이 좋습니다 ( 예 ).
- 많은 Java 기반 제품은 자체 JVM과 함께 제공됩니다. 사용자 지정 정책 파일 (일반 위치에 쓰기 위해 필요한 경우)으로 실행하고 지원 문제 (예 : 오래된 / 예상되지 않은 JVM 사용)를 절약 할 수 있도록이를 수행합니다.
Especially with Windows 7, the JVM has not by default the permission to write into the Windows registry where the backing store for java.util.prefs.preferences is located under MS-Windows.
When executing either the ReverseXSL transformer, or even the Regex tester program, one can get errors like: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx
This does prevent registering a license. It does not prevent the software to perform transformations in the free software mode.
Fixing the issue is simply a matter of granting the necessary permissions to the registry root key at stake.
Run regedit.exe as administrator (regedit.exe is located in the c:\Windows operating system root directory). Go to key HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs. Right click to set permissions. Check a mark in the Full Control check box for the user(s) that need executing the reverseXSL software.
Just Run the application as administrator, or if using eclipse, run eclipse as administrator.
The Answer by peterh already elaborated on the background, but I was searching for a fix and found it!
Since you can't touch the PlatformLogger itself, you have to void its message:
// get rid of the bugged Preferences warning
PrintStream err = System.err;
System.setErr(new PrintStream(new OutputStream() {
public void write(int b) {}
}));
Preferences PREFS = Preferences.userNodeForPackage(Settings.class);
System.setErr(err);
This way the annoying Warning is gone without leaving any traces. Note that you only need to do this at the point where you are referencing the Preferences API for the first time in your program.
This has finally been patched, in January 2019, in Java SE Development Kit 8u202.
This is the Patch Set Update (PSU), as opposed to the Critical Patch Update (CPU), 8u201. The difference is explained here. (The page uses Java 7 as an example, but it gets the point across.)
The download can be found lower down on the "Java SE Development Kit 8" page. (https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)
The fix is to run JMeter as Administrator, it will create the registry key for you, then you can restart JMeter as a normal user and you won't have the warning anymore.JMeter official site - changes
The solution for me was not obvious - it was to update my cryptography security jars from Oracle as it seems to be a key length restriction (I didn't believe it was related, until I tried it).
The download contains instructions and explains:
Due to import control restrictions of some countries, the version of the JCE policy files that are bundled in the Java Runtime Environment, or JRE(TM), 8 environment allow "strong" but limited cryptography to be used. This download bundle (the one including this README file) provides "unlimited strength" policy files which contain no restrictions on cryptographic strengths.
This apparently applies to Registry keys too
Go to your registry and create JavaSoft\Prefs\myapp
under HKEY_LOCAL_MACHINE-->SOFTWARE
Create key name as Prefs and in that create a sub key as myapp, this will resolve the issue.
참고URL : https://stackoverflow.com/questions/5354838/java-java-util-preferences-failing
'program tip' 카테고리의 다른 글
SQL 바꾸기 함수 내부의 정규식 패턴? (0) | 2020.11.18 |
---|---|
무한 루프는 컴파일 오류없이 메서드 서명을 중단합니다. (0) | 2020.11.18 |
Android : GridView auto_fit은 열 수를 어떻게 찾습니까? (0) | 2020.11.18 |
루비 : define_method 대 def (0) | 2020.11.17 |
UITextField에서 리턴 키를 비활성화 / 활성화하는 방법은 무엇입니까? (0) | 2020.11.17 |