【问题标题】:karaf / filter:="(&(osgi.wiring.package=org.apache.logging.log4j)(version>=2.17.0)karaf / filter:="(&(osgi.wiring.package=org.apache.logging.log4j)(version>=2.17.0)
【发布时间】:2021-12-30 23:12:43
【问题描述】:

我正在从 log4j-slf4j-impl 2.12.0 升级到 2.17.1。在我之前的代码中,除了

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>${slf4j.version}</version>
    </dependency>

现在我已经升级到 2.17.1 我收到以下错误:

org.apache.felix.resolver.reason.ReasonException:无法解析 org.apache.logging.log4j.slf4j-impl/2.17.1:缺少要求 [org.apache.logging.log4j.slf4j-impl/2.17 .1] osgi.wiring.package; filter:="(&(osgi.wiring.package=org.apache.logging.log4j)(version>=2.17.0)(!(version>=3.0.0)))" 在 org.apache.felix.resolver.Candidates$MissingRequirementError.toException(Candidates.java:1343) 在 org.apache.felix.resolver.ResolverImpl.doResolve(ResolverImpl.java:420) 在 org.apache.felix.resolver.ResolverImpl.resolve(ResolverImpl.java:378) 在 org.apache.felix.resolver.ResolverImpl.resolve(ResolverImpl.java:332) 在 org.apache.karaf.features.internal.region.SubsystemResolver.resolve(SubsystemResolver.java:257) 在 org.apache.karaf.features.internal.service.Deployer.deploy(Deployer.java:393) 在 org.apache.karaf.features.internal.service.FeaturesServiceImpl.doProvision(FeaturesServiceImpl.java:1062) 在 org.apache.karaf.features.internal.service.FeaturesServiceImpl.lambda$doProvisionInThread$13(FeaturesServiceImpl.java:998) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 在 java.lang.Thread.run(Thread.java:748)

所以我在 pom.xml 中包含了另外两个依赖项,以检查是否可以解决问题。这另外两个依赖项是:

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.17.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.17.1</version>
    </dependency>   

但这无济于事。编译过程很好。运行是问题所在。

这是我的 pom.xml 的一部分:

    <slf4j.version>2.17.1</slf4j.version>
    <sonar.coverage.exclusions>**/Activator.java</sonar.coverage.exclusions>
</properties>
<dependencies>
    <!-- test scoped dependencies -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <scope>test</scope>
    </dependency>
    <!-- logger dependencies -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.17.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.17.1</version>
    </dependency>       
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>${slf4j.version}</version>
    </dependency>

我还缺少什么?

【问题讨论】:

    标签: java log4j2 apache-karaf


    【解决方案1】:

    如果您希望解决 logshell 安全问题,最简单的方法是安装最新版本的 Apache karaf 4.3.x 或 4.2.X,因为 4.3.5 和 4.2.14 版本应该可以解决问题。

    您的异常是由于在 2.17.0 - 3.0.0 版本范围内安装的包都没有导出以下包 org.apache.logging.log4j。

    如果您是 OSGi 新手,那么最好了解 默认情况下包不包含任何依赖项,而是包包含告诉 OSGi 运行时提供最新的导入包信息捆绑包所依赖的包在指定的版本范围内。

    这意味着为了启动捆绑包,您必须通过导出捆绑包所依赖的任何包或 osgi 服务来安装满足其依赖关系的捆绑包。

    要查看捆绑包是否正在导出特定的包,您可以使用命令:

    package:exports -p <package>
    package:exports -p org.apache.logging.log4j
    

    这会打印有关哪些包导出指定包的哪个版本的详细信息,这将有助于解决 osgi.wiring.package 错误。

    要查看已安装包导出的包,您可以使用:

    package:exports -b <bundle ID>
    

    Apache Karaf 使用pax-logging 为包提供日志记录支持。因此,您可能会考虑安装更新版本的 pax-logging-api,它会导出 log4j 包以供捆绑使用。


    Apache karaf 在首次启动时会安装一些版本的 pax-logging-api 和 pax-logging-log4j2。如果您希望 karaf 安装这些捆绑包的更新版本,您可以通过添加以下捆绑包(jar)的更新版本来实现:

    • pax-logging-api
    • pax-logging-log4j2
    • pax-logging-logback

    到karaf/system/org/ops4j/pax/logging/&lt;artifact-name&gt;/&lt;version&gt;/ 然后修改startup.properties 以安装这些版本。请注意,有两个可用的 pax-logging 版本 1.x.x 和 2.x.x,因此请检查 karaf 使用哪个版本来查看是使用最新的 1.x.x 还是 2.x.x 的 pax-logging。

    还可以将 org.apache.karaf.features.xml 中的包列入黑名单,以防止它们被安装。

    <!-- blacklist versions 1.0 - 1.11.11 -->
    <blacklistedBundles>
       <bundle>mvn:org.ops4j.pax.logging/pax-logging-api/[1,1.11.12)</bundle>
       <bundle>mvn:org.ops4j.pax.logging/pax-logging-log4j2/[1,1.11.12)</bundle>
       <bundle>mvn:org.ops4j.pax.logging/pax-logging-logback/[1,1.11.12)</bundle>
    </blacklistedBundles>
    

    删除数据文件夹以将 karaf 重置为干净状态,启动 karaf,它应该安装了更新版本的 pax-logging。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      • 2023-03-26
      • 1970-01-01
      • 2022-01-25
      相关资源
      最近更新 更多