我试图在osgi模式下使用log4j-jcl桥,发现应该使用java.util.ServiceLoader从桥接jar获取LogFactoryImpl。我是OSGi的新手,所以在参考了一些教程后尝试了它,但它似乎没有用。捆绑处于RESOLVED状态。
LoggingActivator.java
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import java.util.ServiceLoader;
public class LoggingActivator implements BundleActivator{
private static Log log;
ServiceLoader<LogFactory> serviceLoader = ServiceLoader.load(LogFactory.class);
LogFactory service = serviceLoader.iterator().next();
public LoggingActivator(){
if (service != null){
log = service.getLog(LoggingActivator.class);
}
}
@Override
public void start(BundleContext bundleContext) throws Exception {
log.info("Activated Logging");
}
@Override
public void stop(BundleContext bundleContext) throws Exception {
log.info("Deactivated Logging");
}
}
的pom.xml
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jcl</artifactId>
<version>2.8.2</version>
</dependency>
<Export-Package>
org.apache.logging.log4j.*,
org.apache.commons.logging.*
</Export-Package>
<Import-Package>
!org.apache.logging.log4j.*,
!org.apache.commons.logging.*,
*;resolution:=optional
</Import-Package>
答案 0 :(得分:0)
ServiceLoader在OSGi中不能很好地工作。我建议试试Apache Karaf。您以后不需要它,但它已经正确配置了日志记录,因此与从头开始设置所有内容相比,它更容易入手。
在你的包中只需初始化一个像OSGi之外的公共记录记录器。
class MyClass {
private Log log = LogFactory.getLog(MyClass.class);
...
}
将maven-bundle-plugin保留为默认值。结果是一个bundle,它导入了commons logging API包,这正是你所需要的。
然后启动karaf并部署您的捆绑包。日志记录应该开箱即用。有关详细信息,请参阅karaf logging guide。
Karaf使用pax-logging。如果你想自己设置它,你需要捆绑包pax-logging-api和pax-logging-service,felix config admin和felix fileinstall。后端是log4j。您可以使用ConfigAdmin和名为etc / org.ops4j.pax.logging.cfg的配置对其进行配置。配置是标准的log4j配置文件。
答案 1 :(得分:0)
如果您想使用ServiceLoader,那么您应该查看Service Loader Mediator规范(OSGi纲要的第133章)。在Apache Aries上有一个名为SPI Fly的实现。
这个想法是Service Loader中介在运行时扩展了bundle的类,确保它正确设置了Thread Context ClassLoader,以便您使用ServiceLoader
来查找实现。 Service Loader Mediator还为它找到的每个已注册的实现注册OSGi服务,因此如果您愿意,可以通过使用OSGi服务注册表完全避免使用ServiceLoader
。