You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@netbeans.apache.org by Ernie Rael <er...@raelity.com> on 2022/02/26 21:15:28 UTC

Gui Builder fail when log4j

Hi all,

I'm looking at a problem between log4j and gui builder (not Matisse) for 
someone.
NB13-rc3, jdk-17 (also fails with NB-12.2, jdk-15)

The following trivial and tiny NB project runs fine (for example under 
the debugger).
https://github.com/bpangburn/swingset/files/8146641/GuiFormTest.zip

Comment out this line (log4j stuff) in the play.MyTextField constructor 
and all is well.
     final Logger logger = LogManager.getLogger();

One way to reproduce the problem (if it doesn't just happen). Open 
NewJFrame.jav in the designer
     ContextMenu: AddFromPalette > Beans > ChooseBean
     enter: play.MyTextField

Get the exception seen at the end of this message. Seems that log4j is 
doing something weird that NB detects as a problem (security manager?).

I took a quick look at CreationFactory.createDefaultInstance(Class) it 
does a weird dance with classloaders (yes plural), but there's
         CreationDescriptor cd = getDescriptor(cls);
         ...
         Object instance = cd != null ?
                               cd.createDefaultInstance() :
                               cls.newInstance();

And I was hoping there would be a way to get some BeanInfo thing (I 
don't really know about BeanInfo's) as the CreationDescriptor but I 
didn't find anything like that. And I don't really think that's the problem.

-ernie


This project was created with beanbinding plugin, but that's not 
required to get the exception.

INFO [org.netbeans.modules.form.MetaComponentCreator]: Failed to create 
an instance of play.MyTextField class.
The class itself was loaded, but instantiating failed.
This typically happens due to an exception in constructor/initializer 
code, or failure in loading an additional class needed by the component. 
Check the attached exception.
java.lang.UnsupportedOperationException: No class provided, and an 
appropriate one cannot be found.
     at org.apache.logging.log4j.LogManager.callerClass(LogManager.java:573)
     at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:598)
     at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:585)
     at play.MyTextField.<init>(MyTextField.java:15)
     at 
java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native 
Method)
     at 
java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
     at 
java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
     at 
java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
     at 
java.base/java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:128)
     at 
java.base/jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:347)
     at java.base/java.lang.Class.newInstance(Class.java:645)
     at 
org.netbeans.modules.form.CreationFactory.createDefaultInstance(CreationFactory.java:155)
     at 
org.netbeans.modules.form.RADComponent.createBeanInstance(RADComponent.java:227)
     at 
org.netbeans.modules.form.RADComponent.initInstance(RADComponent.java:166)

The above stack is consistent no matter how the exception is exactly 
generated (RADComponent.initInstance) get called from multiple places.


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@netbeans.apache.org
For additional commands, e-mail: dev-help@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists




Re: Gui Builder fail when log4j

Posted by Ernie Rael <er...@raelity.com>.
Hey Christian,

Thanks for the pointer. In the case I'm looking at, the gui builder is 
instantiating the component which uses LogManager.getLogger(). The code 
is not part of a plugin.

-ernie

On 2/26/22 2:44 PM, Christian Oyarzun wrote:
> Hi Ernie,
>
> The classloader does support multi-release log4j jar file.
> https://issues.apache.org/jira/browse/NETBEANS-3679
>
> --Christian
>
> On Sat, Feb 26, 2022 at 4:16 PM Ernie Rael <er...@raelity.com> wrote:
>
>> Hi all,
>>
>> I'm looking at a problem between log4j and gui builder (not Matisse) for
>> someone.
>> NB13-rc3, jdk-17 (also fails with NB-12.2, jdk-15)
>>
>> The following trivial and tiny NB project runs fine (for example under
>> the debugger).
>> https://github.com/bpangburn/swingset/files/8146641/GuiFormTest.zip
>>
>> Comment out this line (log4j stuff) in the play.MyTextField constructor
>> and all is well.
>>       final Logger logger = LogManager.getLogger();
>>
>> One way to reproduce the problem (if it doesn't just happen). Open
>> NewJFrame.jav in the designer
>>       ContextMenu: AddFromPalette > Beans > ChooseBean
>>       enter: play.MyTextField
>>
>> Get the exception seen at the end of this message. Seems that log4j is
>> doing something weird that NB detects as a problem (security manager?).
>>
>> I took a quick look at CreationFactory.createDefaultInstance(Class) it
>> does a weird dance with classloaders (yes plural), but there's
>>           CreationDescriptor cd = getDescriptor(cls);
>>           ...
>>           Object instance = cd != null ?
>>                                 cd.createDefaultInstance() :
>>                                 cls.newInstance();
>>
>> And I was hoping there would be a way to get some BeanInfo thing (I
>> don't really know about BeanInfo's) as the CreationDescriptor but I
>> didn't find anything like that. And I don't really think that's the
>> problem.
>>
>> -ernie
>>
>>
>> This project was created with beanbinding plugin, but that's not
>> required to get the exception.
>>
>> INFO [org.netbeans.modules.form.MetaComponentCreator]: Failed to create
>> an instance of play.MyTextField class.
>> The class itself was loaded, but instantiating failed.
>> This typically happens due to an exception in constructor/initializer
>> code, or failure in loading an additional class needed by the component.
>> Check the attached exception.
>> java.lang.UnsupportedOperationException: No class provided, and an
>> appropriate one cannot be found.
>>       at
>> org.apache.logging.log4j.LogManager.callerClass(LogManager.java:573)
>>       at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:598)
>>       at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:585)
>>       at play.MyTextField.<init>(MyTextField.java:15)
>>       at
>> java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native
>>
>> Method)
>>       at
>>
>> java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
>>       at
>>
>> java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
>>       at
>>
>> java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
>>       at
>>
>> java.base/java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:128)
>>       at
>>
>> java.base/jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:347)
>>       at java.base/java.lang.Class.newInstance(Class.java:645)
>>       at
>>
>> org.netbeans.modules.form.CreationFactory.createDefaultInstance(CreationFactory.java:155)
>>       at
>>
>> org.netbeans.modules.form.RADComponent.createBeanInstance(RADComponent.java:227)
>>       at
>> org.netbeans.modules.form.RADComponent.initInstance(RADComponent.java:166)
>>
>> The above stack is consistent no matter how the exception is exactly
>> generated (RADComponent.initInstance) get called from multiple places.
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: dev-unsubscribe@netbeans.apache.org
>> For additional commands, e-mail: dev-help@netbeans.apache.org
>>
>> For further information about the NetBeans mailing lists, visit:
>> https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists
>>
>>
>>
>>


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@netbeans.apache.org
For additional commands, e-mail: dev-help@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists




Re: Gui Builder fail when log4j

Posted by Christian Oyarzun <co...@oyarzun.net>.
Hi Ernie,

The classloader does support multi-release log4j jar file.
https://issues.apache.org/jira/browse/NETBEANS-3679

--Christian

On Sat, Feb 26, 2022 at 4:16 PM Ernie Rael <er...@raelity.com> wrote:

> Hi all,
>
> I'm looking at a problem between log4j and gui builder (not Matisse) for
> someone.
> NB13-rc3, jdk-17 (also fails with NB-12.2, jdk-15)
>
> The following trivial and tiny NB project runs fine (for example under
> the debugger).
> https://github.com/bpangburn/swingset/files/8146641/GuiFormTest.zip
>
> Comment out this line (log4j stuff) in the play.MyTextField constructor
> and all is well.
>      final Logger logger = LogManager.getLogger();
>
> One way to reproduce the problem (if it doesn't just happen). Open
> NewJFrame.jav in the designer
>      ContextMenu: AddFromPalette > Beans > ChooseBean
>      enter: play.MyTextField
>
> Get the exception seen at the end of this message. Seems that log4j is
> doing something weird that NB detects as a problem (security manager?).
>
> I took a quick look at CreationFactory.createDefaultInstance(Class) it
> does a weird dance with classloaders (yes plural), but there's
>          CreationDescriptor cd = getDescriptor(cls);
>          ...
>          Object instance = cd != null ?
>                                cd.createDefaultInstance() :
>                                cls.newInstance();
>
> And I was hoping there would be a way to get some BeanInfo thing (I
> don't really know about BeanInfo's) as the CreationDescriptor but I
> didn't find anything like that. And I don't really think that's the
> problem.
>
> -ernie
>
>
> This project was created with beanbinding plugin, but that's not
> required to get the exception.
>
> INFO [org.netbeans.modules.form.MetaComponentCreator]: Failed to create
> an instance of play.MyTextField class.
> The class itself was loaded, but instantiating failed.
> This typically happens due to an exception in constructor/initializer
> code, or failure in loading an additional class needed by the component.
> Check the attached exception.
> java.lang.UnsupportedOperationException: No class provided, and an
> appropriate one cannot be found.
>      at
> org.apache.logging.log4j.LogManager.callerClass(LogManager.java:573)
>      at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:598)
>      at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:585)
>      at play.MyTextField.<init>(MyTextField.java:15)
>      at
> java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native
>
> Method)
>      at
>
> java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
>      at
>
> java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
>      at
>
> java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
>      at
>
> java.base/java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:128)
>      at
>
> java.base/jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:347)
>      at java.base/java.lang.Class.newInstance(Class.java:645)
>      at
>
> org.netbeans.modules.form.CreationFactory.createDefaultInstance(CreationFactory.java:155)
>      at
>
> org.netbeans.modules.form.RADComponent.createBeanInstance(RADComponent.java:227)
>      at
> org.netbeans.modules.form.RADComponent.initInstance(RADComponent.java:166)
>
> The above stack is consistent no matter how the exception is exactly
> generated (RADComponent.initInstance) get called from multiple places.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@netbeans.apache.org
> For additional commands, e-mail: dev-help@netbeans.apache.org
>
> For further information about the NetBeans mailing lists, visit:
> https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists
>
>
>
>

Re: Gui Builder fail when log4j

Posted by Ernie Rael <er...@raelity.com>.
I'm guessing that Class.newInstance()'s constructor call doesn't have a 
caller on the stack. So log4j throws this exception because it can't 
find it's caller. Looks like the convienient "LogManager.getLogger()" 
can't be used in a component's constructor/static-init if that component 
is going to be used as a gui bean. Sigh!

-ernie

On 2/26/22 1:15 PM, Ernie Rael wrote:
> Hi all,
>
> I'm looking at a problem between log4j and gui builder (not Matisse) 
> for someone.
> NB13-rc3, jdk-17 (also fails with NB-12.2, jdk-15)
>
> The following trivial and tiny NB project runs fine (for example under 
> the debugger).
> https://github.com/bpangburn/swingset/files/8146641/GuiFormTest.zip
>
> Comment out this line (log4j stuff) in the play.MyTextField 
> constructor and all is well.
>     final Logger logger = LogManager.getLogger();
>
> One way to reproduce the problem (if it doesn't just happen). Open 
> NewJFrame.jav in the designer
>     ContextMenu: AddFromPalette > Beans > ChooseBean
>     enter: play.MyTextField
>
> Get the exception seen at the end of this message. Seems that log4j is 
> doing something weird that NB detects as a problem (security manager?).
>
> I took a quick look at CreationFactory.createDefaultInstance(Class) it 
> does a weird dance with classloaders (yes plural), but there's
>         CreationDescriptor cd = getDescriptor(cls);
>         ...
>         Object instance = cd != null ?
>                               cd.createDefaultInstance() :
>                               cls.newInstance();
>
> And I was hoping there would be a way to get some BeanInfo thing (I 
> don't really know about BeanInfo's) as the CreationDescriptor but I 
> didn't find anything like that. And I don't really think that's the 
> problem.
>
> -ernie
>
>
> This project was created with beanbinding plugin, but that's not 
> required to get the exception.
>
> INFO [org.netbeans.modules.form.MetaComponentCreator]: Failed to 
> create an instance of play.MyTextField class.
> The class itself was loaded, but instantiating failed.
> This typically happens due to an exception in constructor/initializer 
> code, or failure in loading an additional class needed by the 
> component. Check the attached exception.
> java.lang.UnsupportedOperationException: No class provided, and an 
> appropriate one cannot be found.
>     at 
> org.apache.logging.log4j.LogManager.callerClass(LogManager.java:573)
>     at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:598)
>     at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:585)
>     at play.MyTextField.<init>(MyTextField.java:15)
>     at 
> java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native 
> Method)
>     at 
> java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
>     at 
> java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
>     at 
> java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
>     at 
> java.base/java.lang.reflect.ReflectAccess.newInstance(ReflectAccess.java:128)
>     at 
> java.base/jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:347)
>     at java.base/java.lang.Class.newInstance(Class.java:645)
>     at 
> org.netbeans.modules.form.CreationFactory.createDefaultInstance(CreationFactory.java:155)
>     at 
> org.netbeans.modules.form.RADComponent.createBeanInstance(RADComponent.java:227)
>     at 
> org.netbeans.modules.form.RADComponent.initInstance(RADComponent.java:166)
>
> The above stack is consistent no matter how the exception is exactly 
> generated (RADComponent.initInstance) get called from multiple places.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@netbeans.apache.org
> For additional commands, e-mail: dev-help@netbeans.apache.org
>
> For further information about the NetBeans mailing lists, visit:
> https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists
>
>
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@netbeans.apache.org
For additional commands, e-mail: dev-help@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists