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>

Reply via email to