If you are explicitly passing around ClassLoaders then it would probably work 
correctly. But here we have Module B calling Module A to load a class in Module 
B using the default ClassLoader, which will be Module A’s ClassLoader.

We are currently not passing ClassLoaders to LoaderUtil.

Ralph

> On Oct 5, 2018, at 11:21 AM, Matt Sicker <boa...@gmail.com> wrote:
> 
> Say module A calls a method in module B which provides a ClassLoader
> argument. Module A provides its own CL to module B. Then module B invokes
> load() from there. Does this mean module B is loading classes using its own
> CL (which doesn't make sense), or is it loading module A's classes on
> behalf of it? I haven't looked into the exact implementation, but I feel as
> though such a security check to make sure the caller class is in the
> ClassLoader being invoked would break even more programs and be inefficient
> anyways.
> 
> On Thu, 4 Oct 2018 at 16:08, Ralph Goers <ralph.go...@dslextreme.com> wrote:
> 
>> Matt, I don’t think that makes a difference when running in OSGi. The
>> problem is that core is calling API and asking it to load a core class.
>> Unless it has access to the class it can’t do it. In OSGi it will only have
>> access if log4j-core exposes it.
>> 
>> Ralph
>> 
>>> On Oct 4, 2018, at 9:01 AM, Matt Sicker <boa...@gmail.com> wrote:
>>> 
>>> LoaderUtil is using the thread context class loader by default. If it's
>> not
>>> set right, you can use of the methods there to specify the correct
>>> ClassLoader, or you can even push and pop TCCLs essentially.
>>> 
>>> On Wed, 3 Oct 2018 at 16:46, Ralph Goers <ralph.go...@dslextreme.com>
>> wrote:
>>> 
>>>> Personally, I would rather duplicate the code, as much as it pains me to
>>>> do that.
>>>> 
>>>> Ralph
>>>> 
>>>>> On Oct 3, 2018, at 1:37 PM, Rob Gansevles <rgansev...@gmail.com>
>> wrote:
>>>>> 
>>>>> This patch is not effective in case of the BasicContextSelector because
>>>>> package org.apache.logging.log4j.core.selector was not included in the
>>>>> imports.
>>>>> Only org.apache.logging.log4j.core.osgi,
>>>> org.apache.logging.log4j.core.util
>>>>> and org.apache.logging.log4j.core.async are includes as optional
>> imports
>>>> in
>>>>> log4j-api.
>>>>> 
>>>>> If org.apache.logging.log4j.core.selector was added as well,
>>>>> BasicContextSelector could be used in an OSGI application.
>>>>> 
>>>>> 
>>>>> I agree that it is weird that log4j-api depends on log4j-core.
>>>>> The only reason this is needed because the utility methods in log4j-api
>>>> are
>>>>> used to load the classes.
>>>>> I did a small experiment where I copied
>>>>> LoaderUtil.newCheckedInstanceOfProperty() from log4j-api to a utility
>>>> class
>>>>> in log4j-core.
>>>>> This also fixes the problem because then dynamic classes are loaded
>> from
>>>>> core and can be found (since they are defined in core).
>>>>> 
>>>>> It unfortunately introduces a lot of code duplication (5 methods from
>>>>> LoaderUtil).
>>>>> 
>>>>> What do you think, would this be a good idea instead and remove all
>>>>> dependencies from log4j-api to log4j-core?
>>>>> 
>>>>> Rob
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> On Fri, Sep 28, 2018 at 7:38 PM Ralph Goers <
>> ralph.go...@dslextreme.com>
>>>>> wrote:
>>>>> 
>>>>>> Despite what I said below, it seems that the patch for LOG4J2-920 was
>>>>>> applied over 2 years ago so this should not be happening with 2.11.1.
>>>>>> 
>>>>>> Ralph
>>>>>> 
>>>>>>> On Sep 28, 2018, at 10:34 AM, Ralph Goers <
>> ralph.go...@dslextreme.com>
>>>>>> wrote:
>>>>>>> 
>>>>>>> It sounds related to LOG4J2-920 but the solution provided there has
>> to
>>>>>> be incorrect. There is no way the Log4j API should be declaring any
>>>>>> requirements on Log4j Core stuff, especially since the Log4j API
>> doesn’t
>>>>>> have a clue what a ContextSelector is. That is only use by the
>>>>>> Log4jContextFactory. I suspect the problem is that LoaderUtil resides
>> in
>>>>>> log4j-api and since it is actually doing the loading it is causing the
>>>>>> problem. That means we are either doing the loading wrong or there is
>>>>>> something broken in OSGi.
>>>>>>> 
>>>>>>> Ralph
>>>>>>> 
>>>>>>>> On Sep 28, 2018, at 10:20 AM, Rob Gansevles <rgansev...@gmail.com>
>>>>>> wrote:
>>>>>>>> 
>>>>>>>> Yes, that makes sense, but it seems they are still loaded by the
>>>>>> log4j-api.
>>>>>>>> I guess this is the reason there are a few optional import-package
>>>>>>>> declarations in the manifest-generation in the pom for log4j-api:
>>>>>>>> 
>>>>>>>>  <plugin>
>>>>>>>>    <groupId>org.apache.felix</groupId>
>>>>>>>>    <artifactId>maven-bundle-plugin</artifactId>
>>>>>>>>    <configuration>
>>>>>>>>      <instructions>
>>>>>>>>        <Export-Package>org.apache.logging.log4j.*</Export-Package>
>>>>>>>>        <Import-Package>
>>>>>>>>          sun.reflect;resolution:=optional,
>>>>>>>>          org.apache.logging.log4j.core.osgi;resolution:=optional,
>>>>>>>>          org.apache.logging.log4j.core.util;resolution:=optional,
>>>>>>>>          org.apache.logging.log4j.core.async;resolution:=optional,
>>>>>>>>          *
>>>>>>>>        </Import-Package>
>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> <Bundle-Activator>org.apache.logging.log4j.util.Activator</Bundle-Activator>
>>>>>>>>        <_fixupmessages>"Classes found in the wrong
>>>>>>>> directory";is:=warning</_fixupmessages>
>>>>>>>>      </instructions>
>>>>>>>>    </configuration>
>>>>>>>>  </plugin>
>>>>>>>> 
>>>>>>>> I get the error below when I use the BasicContextSelector, and when
>> I
>>>>>> add
>>>>>>>> org.apache.logging.log4j.core.selector to the imports in the
>> manifest
>>>> it
>>>>>>>> works.
>>>>>>>> 
>>>>>>>> Maybe it is the same issue as discussed in LOG4J2-920 but then
>>>>>>>> for BundleContextSelector and should a similar patch being applied.
>>>>>>>> What do you think?
>>>>>>>> 
>>>>>>>> ERROR StatusLogger Unable to create custom ContextSelector. Falling
>>>>>> back to
>>>>>>>> default.
>>>>>>>> java.lang.ClassNotFoundException:
>>>>>>>> org.apache.logging.log4j.core.selector.BasicContextSelector cannot
>> be
>>>>>> found
>>>>>>>> by org.apache.logging.log4j.api_2.11.2.SNAPSHOT
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:508)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:419)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:411)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:150)
>>>>>>>> at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
>>>>>>>> at java.lang.Class.forName0(Native Method)
>>>>>>>> at java.lang.Class.forName(Class.java:264)
>>>>>>>> at
>>>>>> 
>> org.apache.logging.log4j.util.LoaderUtil.loadClass(LoaderUtil.java:168)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.logging.log4j.util.LoaderUtil.newInstanceOf(LoaderUtil.java:207)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.logging.log4j.util.LoaderUtil.newCheckedInstanceOf(LoaderUtil.java:228)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.logging.log4j.util.LoaderUtil.newCheckedInstanceOfProperty(LoaderUtil.java:253)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.logging.log4j.core.impl.Log4jContextFactory.createContextSelector(Log4jContextFactory.java:98)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.logging.log4j.core.impl.Log4jContextFactory.<init>(Log4jContextFactory.java:59)
>>>>>>>> at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
>>>> Method)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
>>>>>>>> at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
>>>>>>>> at java.lang.Class.newInstance(Class.java:442)
>>>>>>>> at org.apache.logging.log4j.LogManager.<clinit>(LogManager.java:94)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.logging.log4j.spi.AbstractLoggerAdapter.getContext(AbstractLoggerAdapter.java:121)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.logging.slf4j.Log4jLoggerFactory.getContext(Log4jLoggerFactory.java:49)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:46)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29)
>>>>>>>> at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:355)
>>>>>>>> at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:380)
>>>>>>>> at com.servoy.j2db.server.main.Activator.<clinit>(Activator.java:44)
>>>>>>>> at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
>>>> Method)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
>>>>>>>> at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
>>>>>>>> at java.lang.Class.newInstance(Class.java:442)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> org.eclipse.osgi.internal.framework.BundleContextImpl.loadBundleActivator(BundleContextImpl.java:763)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:716)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:1002)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:354)
>>>>>>>> at org.eclipse.osgi.container.Module.doStart(Module.java:581)
>>>>>>>> at org.eclipse.osgi.container.Module.start(Module.java:449)
>>>>>>>> at
>>>>>> 
>>>> 
>> org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:468)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:114)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:505)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:328)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:392)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> org.eclipse.osgi.internal.loader.sources.SingleSourcePackage.loadClass(SingleSourcePackage.java:36)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:466)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:419)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:411)
>>>>>>>> at
>>>>>>>> 
>>>>>> 
>>>> 
>> org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:150)
>>>>>>>> at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
>>>>>>>> 
>>>>>>>> 
>>>>>>>> On Fri, Sep 28, 2018 at 6:01 PM Ralph Goers <
>>>> ralph.go...@dslextreme.com
>>>>>>> 
>>>>>>>> wrote:
>>>>>>>> 
>>>>>>>>> All ContextSelectors are part of log4j-core, not log4j-api.
>>>>>>>>> 
>>>>>>>>> Ralph
>>>>>>>>> 
>>>>>>>>>> On Sep 28, 2018, at 7:59 AM, Rob Gansevles <rgansev...@gmail.com>
>>>>>> wrote:
>>>>>>>>>> 
>>>>>>>>>> Hi,
>>>>>>>>>> 
>>>>>>>>>> I would like to use the BasicContextSelector in our OSGI
>> application
>>>>>> so
>>>>>>>>>> have a single global log4j connfiguration as described in
>>>>>>>>>> http://logging.apache.org/log4j/2.x/manual/logsep.html
>>>>>>>>>> 
>>>>>>>>>> However, BasicContextSelector lives in
>>>>>>>>>> package org.apache.logging.log4j.core.selector which does not seem
>>>> to
>>>>>> be
>>>>>>>>>> usable from log4j-api.
>>>>>>>>>> 
>>>>>>>>>> This package is not imported in the manifest of log4j-api like
>> other
>>>>>>>>>> packages (for example org.apache.logging.log4j.core.async).
>>>>>>>>>> 
>>>>>>>>>> Is this missing, or am I missing something?
>>>>>>>>>> 
>>>>>>>>>> I am using log4j 2.11.1
>>>>>>>>>> 
>>>>>>>>>> Regards,
>>>>>>>>>> 
>>>>>>>>>> Rob
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>> ---------------------------------------------------------------------
>>>>>>>>> To unsubscribe, e-mail: log4j-user-unsubscr...@logging.apache.org
>>>>>>>>> For additional commands, e-mail:
>> log4j-user-h...@logging.apache.org
>>>>>>>>> 
>>>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> ---------------------------------------------------------------------
>>>>>>> To unsubscribe, e-mail: log4j-user-unsubscr...@logging.apache.org
>>>>>>> For additional commands, e-mail: log4j-user-h...@logging.apache.org
>>>>>>> 
>>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> ---------------------------------------------------------------------
>>>>>> To unsubscribe, e-mail: log4j-user-unsubscr...@logging.apache.org
>>>>>> For additional commands, e-mail: log4j-user-h...@logging.apache.org
>>>>>> 
>>>>>> 
>>>> 
>>>> 
>>>> 
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: log4j-user-unsubscr...@logging.apache.org
>>>> For additional commands, e-mail: log4j-user-h...@logging.apache.org
>>>> 
>>>> 
>>> 
>>> --
>>> Matt Sicker <boa...@gmail.com>
>> 
>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: log4j-user-unsubscr...@logging.apache.org
>> For additional commands, e-mail: log4j-user-h...@logging.apache.org
>> 
>> 
> 
> -- 
> Matt Sicker <boa...@gmail.com>



---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-user-unsubscr...@logging.apache.org
For additional commands, e-mail: log4j-user-h...@logging.apache.org

Reply via email to