[jboss-jira] [JBoss JIRA] (JBLOGGING-111) LoggerProvider configured with new ServiceLoader crash

David Lloyd (Jira) issues at jboss.org
Sat Oct 6 16:14:00 EDT 2018


    [ https://issues.jboss.org/browse/JBLOGGING-111?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13644323#comment-13644323 ] 

David Lloyd commented on JBLOGGING-111:
---------------------------------------

It sounds more like what you want is a way to use some configuration other than a system property in order to choose one of the preexisting providers.  You are trying to use service loader as this configuration mechanism, though that's not really an appropriate solution for choosing a provider because it's meant for _providing_ a provider.

I think it's reasonable to open a new JIRA which is a feature request to support the specification of a preexisting provider on a class loader (aka per-application) basis.  I don't think it's a good idea to make implementation classes public in order to facilitate that feature.  But that discussion can be had in the new JIRA.

> LoggerProvider configured with new ServiceLoader crash
> ------------------------------------------------------
>
>                 Key: JBLOGGING-111
>                 URL: https://issues.jboss.org/browse/JBLOGGING-111
>             Project: JBoss Logging
>          Issue Type: Bug
>    Affects Versions: 3.2.0.Beta1
>         Environment: Weblogic 10.3.2.0
> Configured in ejb jar, deployed by an ear file
>            Reporter: Frederic Allard
>            Assignee: James Perkins
>            Priority: Major
>             Fix For: 3.2.0.Final
>
>
> There is a new feature in the beta which uses the ServiceLoader to specify a LoggerProvider to be used by JBoss Logging.
> org.jboss.logging.LoggerProviders snippet :
> {code}
> // Next try for a service provider
>         try {
>             final ServiceLoader<LoggerProvider> loader = ServiceLoader.load(LoggerProvider.class, cl);
>             if (loader.iterator().hasNext()) {
>                 return loader.iterator().next();
>             }
>         } catch (Throwable ignore) {
>             // TODO consider printing the stack trace as it should only happen once
>         }
> {code}
> When you try to configure a provider (ex. org.jboss.logging.Slf4jLoggerProvider), the ServiceLoader crash silently and ignore the provider.
> {code}
> java.util.ServiceConfigurationError: org.jboss.logging.LoggerProvider: Provider org.jboss.logging.Slf4jLoggerProvider could not be instantiated: java.lang.IllegalAccessException: Class java.util.ServiceLoader$LazyIterator can not access a member of class org.jboss.logging.Slf4jLoggerProvider with modifiers ""
> 	at java.util.ServiceLoader.fail(ServiceLoader.java:207)
> 	at java.util.ServiceLoader.access$100(ServiceLoader.java:164)
> 	at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:353)
> 	at java.util.ServiceLoader$1.next(ServiceLoader.java:421)
> 	at org.jboss.logging.LoggerProviders.findProvider(LoggerProviders.java:70)
> 	at org.jboss.logging.LoggerProviders.find(LoggerProviders.java:32)
> 	at org.jboss.logging.LoggerProviders.<clinit>(LoggerProviders.java:29)
> 	at org.jboss.logging.Logger.getLogger(Logger.java:2177)
> 	at org.jboss.logging.Logger$1.run(Logger.java:2277)
> 	at java.security.AccessController.doPrivileged(Native Method)
> 	at org.jboss.logging.Logger.getMessageLogger(Logger.java:2241)
> 	at org.jboss.logging.Logger.getMessageLogger(Logger.java:2228)
> 	at org.hibernate.cfg.Configuration.<clinit>(Configuration.java:176)
>         ...
> {code}
> This is caused by the fact that all JBoss providers are not public classes and are instead package classes.



--
This message was sent by Atlassian Jira
(v7.12.1#712002)


More information about the jboss-jira mailing list