pyjnius icon indicating copy to clipboard operation
pyjnius copied to clipboard

Unrecognized option: --add-exports / --add-opens

Open bowensong opened this issue 1 year ago • 2 comments

On newer JDK versions, the options --add-exports and --add-opens are sometimes needed to break the encapsulation. See https://openjdk.org/jeps/261

This works with the java command:

$ java --add-exports java.base/jdk.internal.misc=ALL-UNNAMED --add-opens java.base/java.lang.module=ALL-UNNAMED -version
openjdk version "11.0.22" 2024-01-16
OpenJDK Runtime Environment (build 11.0.22+7-post-Debian-1deb11u1)
OpenJDK 64-Bit Server VM (build 11.0.22+7-post-Debian-1deb11u1, mixed mode, sharing)

However, this doesn't work with pyjnius:

$ cat test.py
import jnius_config
jnius_config.add_options(
    '--add-exports', 'java.base/jdk.internal.misc=ALL-UNNAMED',
    '--add-opens', 'java.base/java.lang.module=ALL-UNNAMED',
)
import jnius

$ python test.py
Unrecognized option: --add-exports
Traceback (most recent call last):
  File "/path/to/test.py", line 6, in <module>
    import jnius
  File "/path/to/ve/lib/python3.9/site-packages/jnius/__init__.py", line 45, in <module>
    from .reflect import *  # noqa
  File "/path/to/ve/lib/python3.9/site-packages/jnius/reflect.py", line 19, in <module>
    class Class(JavaClass, metaclass=MetaJavaClass):
  File "jnius/jnius_export_class.pxi", line 117, in jnius.MetaJavaClass.__new__
  File "jnius/jnius_export_class.pxi", line 177, in jnius.MetaJavaClass.resolve_class
  File "jnius/jnius_env.pxi", line 11, in jnius.get_jnienv
  File "jnius/jnius_jvm_dlopen.pxi", line 95, in jnius.get_platform_jnienv
  File "jnius/jnius_jvm_dlopen.pxi", line 87, in jnius.create_jnienv
SystemError: JVM failed to start: -1

This was tested with pyjnius 1.6.1 on Python 3.9.2 with openjdk-11-jdk 11.0.22u7 on Debian 11.

bowensong avatar Jul 23 '24 19:07 bowensong

I found this after some digging around.

The module related options, --add-reads, --add-exports, --add-opens, --add-modules, --limit-modules, --module-path, --patch-module, and --upgrade-module-path must be passed as option strings using their “option=value” format instead of their “option value” format. (Note the required = between “option” and “value”.) For example, to export java.management/sun.management to ALL-UNNAMED pass option string "--add-exports=java.management/sun.management=ALL-UNNAMED".

The code below works fine in pyjnius:

import jnius_config
jnius_config.add_options(
    '--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED',
    '--add-opens=java.base/java.lang.module=ALL-UNNAMED',
)
import jnius

I believe this should be documented here, and the add_options() method should warn the user about it if the options contains any of the --add-reads, --add-exports, --add-opens, --add-modules, --limit-modules, --module-path, --patch-module, and --upgrade-module-path in the unsupported format.

bowensong avatar Jul 24 '24 10:07 bowensong

Can you make a PR for the maintainers?

cmacdonald avatar Jul 24 '24 11:07 cmacdonald

This issue has been automatically closed because there has been no response to our request for more information from the original author. With only the information that is currently in the issue, we don't have the means to take action. Please reach out if you have or find the answers we need so that we can investigate further.

github-actions[bot] avatar Jan 18 '25 04:01 github-actions[bot]