Steps to reproduce
- Install Java 11
- Install prunsrv.exe using jvm.dll and specify stdout and stderr file.
- Using prunmgr, add a Java Option '-invalid'
- Start the service
- stdout and stderr files are empty!
- Install Java 10
- Using prunmgr, switch the Java Virtual Machine to Java 10
- Start the service
- It works for Java 8, 9 and 10, fails for 11, 12 and 13-ea.
- I followed this guide: Redirecting standard I/O from within a program (see set-stdout.patch), but it didn't help.
- Even when I compile prunsrv with Visual Studio 2017 15.9 (linker 14.16) and test with Java 13-ea, which is also compiled with the same version (hence using the same C-runtime library) it does not work.
- The guide ends with what the probably causing the issue:
... the one problem that remains with redirecting Win32 file handles:
It doesn't affect anything in the program using a different C runtime library (such as a third-party DLL, for example).
- Setting registry value Log/LogJniMessages=1, which is using the vfprintf option of the JNI_CreateJavaVM does not help. Maybe because is is added after the user-specified Java Options?
- Make vfprintf the first parameter
Downside of vfprintf is that it is hard to distinct between stdout and stderr. Maybe make a JNI call to System.out and System.err to be able to recognize the *File pointer and map to stdout and stderr accordingly.
And I think that javajni.c/apxJavaSetOut() should not be required.
- Log a bug for OpenJDK and try to get it fixed.
|OS||Daemon version (built with)||Java vendor and version (built with)||Result|
|Windows 7||1.1.x HEAD (9.00)||AdoptOpenJDK 11.0.3+7 (14.15)||OK|
|Windows 2008R2||1.1.x HEAD (9.00)||AdoptOpenJDK 11.0.3+7 (14.15)||OK|
|Windows 2012R2||1.1.x HEAD (9.00)||AdoptOpenJDK 11.0.3+7 (14.15)||OK|
|Windows 2016||1.1.x HEAD (9.00)||AdoptOpenJDK 11.0.2+9 (12.00)||OK|
|Windows 2016||1.1.x HEAD (9.00)||AdoptOpenJDK 11.0.3+7 (14.15)||Fail|
Note: It is assumed the OS is fully patched unless otherwise stated.