如何在库中配置 sl4j API 同时使客户端可以使用自己的日志记录实现?
How to configure sl4j API in library while making it possible for clients to use own logging implementation?
我目前正在为一个库使用 Logback,现在我想进行更改以改用 sl4j,这样我的库的用户就不会被迫使用 Logback。
根据我目前所读的内容,在我的配置中我应该有 SL4J-api
logback-classic
,所以基本上是这样的:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>{sl4j-api.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>{logback.version}</version>
</dependency>
这意味着在库中我会使用 sl4j API 而实际的记录器实现将是 log4j。
但这也意味着当我的客户使用该库时,log4j jar 也将作为依赖项包含在内。而且我不知道有什么方法可以防止这种情况。
我认为使用 sl4j 的目的是为了防止库的客户端不得不处理他们不需要的记录器的 jar。但好像不是这样。
这意味着如果他们想改用 log4j,他们仍然必须在他们的 pom 中编写 <exclusion>
排除 logback-classic
.
的规则
或者是否有任何其他方法可以使用 sl4j 和库 jar 中的特定记录器,并使特定记录器 jar 不包含在客户端依赖的打包 jar 中。这样客户就不需要排除库附带的那些,而只需要插入自己的特定记录器?
如果可以做到这一点,配置会是什么样子?
你说得对,在库中使用 slf4j 的目的是让库的使用者选择日志记录后端实现。实现这一目标的方法是从库中删除对 logback-classic
的依赖。 slf4j-api
依赖项提供了编写日志语句所需的所有类型,库不应依赖于具体的日志记录实现。
如果在 运行 测试时需要使用日志记录实现,您可以指定 test
范围的依赖:
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>{logback.version}</version>
<scope>test</scope>
</dependency>
这将导致 Maven 仅在编译和 运行 测试时将依赖项放在类路径上。在这种情况下,库的下游消费者不会继承对 logback-classic
的传递依赖。
我目前正在为一个库使用 Logback,现在我想进行更改以改用 sl4j,这样我的库的用户就不会被迫使用 Logback。
根据我目前所读的内容,在我的配置中我应该有 SL4J-api
logback-classic
,所以基本上是这样的:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>{sl4j-api.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>{logback.version}</version>
</dependency>
这意味着在库中我会使用 sl4j API 而实际的记录器实现将是 log4j。
但这也意味着当我的客户使用该库时,log4j jar 也将作为依赖项包含在内。而且我不知道有什么方法可以防止这种情况。
我认为使用 sl4j 的目的是为了防止库的客户端不得不处理他们不需要的记录器的 jar。但好像不是这样。
这意味着如果他们想改用 log4j,他们仍然必须在他们的 pom 中编写 <exclusion>
排除 logback-classic
.
或者是否有任何其他方法可以使用 sl4j 和库 jar 中的特定记录器,并使特定记录器 jar 不包含在客户端依赖的打包 jar 中。这样客户就不需要排除库附带的那些,而只需要插入自己的特定记录器?
如果可以做到这一点,配置会是什么样子?
你说得对,在库中使用 slf4j 的目的是让库的使用者选择日志记录后端实现。实现这一目标的方法是从库中删除对 logback-classic
的依赖。 slf4j-api
依赖项提供了编写日志语句所需的所有类型,库不应依赖于具体的日志记录实现。
如果在 运行 测试时需要使用日志记录实现,您可以指定 test
范围的依赖:
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>{logback.version}</version>
<scope>test</scope>
</dependency>
这将导致 Maven 仅在编译和 运行 测试时将依赖项放在类路径上。在这种情况下,库的下游消费者不会继承对 logback-classic
的传递依赖。