[ 
https://issues.apache.org/jira/browse/CAMEL-16943?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Freeman Yue Fang resolved CAMEL-16943.
--------------------------------------
    Resolution: Fixed

> MainPropertyPlaceholderWithEnvTest failed with JDK17
> ----------------------------------------------------
>
>                 Key: CAMEL-16943
>                 URL: https://issues.apache.org/jira/browse/CAMEL-16943
>             Project: Camel
>          Issue Type: Sub-task
>          Components: camel-main
>            Reporter: Freeman Yue Fang
>            Assignee: Freeman Yue Fang
>            Priority: Major
>             Fix For: Future
>
>
> get exception like
> {code}
> Suppressed: java.lang.reflect.InaccessibleObjectException: Unable to make 
> field private final java.util.Map java.util.Collections$UnmodifiableMap.m 
> accessible: module java.base does not "opens java.util" to unnamed module 
> @bf20622
>               at 
> java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
>               at 
> java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
>               at 
> java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:178)
>               at 
> java.base/java.lang.reflect.Field.setAccessible(Field.java:172)
>               at 
> org.apache.camel.main.MainPropertyPlaceholderWithEnvTest.getFieldValue(MainPropertyPlaceholderWithEnvTest.java:276)
>               at 
> org.apache.camel.main.MainPropertyPlaceholderWithEnvTest.getEditableMapOfVariables(MainPropertyPlaceholderWithEnvTest.java:226)
>               at 
> org.apache.camel.main.MainPropertyPlaceholderWithEnvTest.doEnvVariable(MainPropertyPlaceholderWithEnvTest.java:206)
>               at 
> org.apache.camel.main.MainPropertyPlaceholderWithEnvTest.tearDown(MainPropertyPlaceholderWithEnvTest.java:182)
>               at 
> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>               at 
> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
>               at 
> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>               at java.base/java.lang.reflect.Method.invoke(Method.java:568)
> {code}
> This is because System.getEnv() returns a 
> java.util.Collections$UnmodifiableMap which isn't supposed to be changed 
> during runtime code. To workaround this, normally we need to use reflection 
> way to make a private field in java.util.Collections$UnmodifiableMap 
> accessible.
> But this is kind of against the encapsulation(Strongly Encapsulate JDK 
> Internals ) rule of java Modules since JDK9. Before JDK17,  it is it  
> possible to access internal APIs via the --illegal-access command line option 
> which is enabled by default. However, since JDK17 this --illegal-access is 
> removed and we need to either explicitly use --add-opens modules to enable 
> deep reflection for JDK internal code, or we need to get rid of the way to 
> use JDK Internals



--
This message was sent by Atlassian Jira
(v8.20.7#820007)

Reply via email to