Ehcache 2 maven 依赖
Ehcache 2 maven dependency
在我的 pom 中我有 ehcache 2 依赖项
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>${ehcache.version}</version>
</dependency>
问题是在应用程序构建期间,我们有一个 grype 检查漏洞,它检测到此依赖项中的几个库:
NAME INSTALLED FIXED-IN VULNERABILITY SEVERITY
jackson-databind 2.11.1 2.12.6.1 GHSA-57j2-w4cx-62h2 High
jersey-common 2.31 2.34 GHSA-c43q-5hpj-4crv Medium
jetty-server 9.4.39.v20210325 9.4.41 GHSA-m6cp-vxjx-65j6 Low
这有点令人困惑,因为库以非常奇怪的方式添加到 ehcache jar - 不像依赖项,而是扩展名为 *.class_terracotta 的文件,位于文件夹“rest-management-private-classpath”中,显示在
screenshot
由于这种方法,无法在 pom 文件中覆盖或排除库版本。
可能正确的方法是从 ehcache 2 迁移到 3,但这可能需要一些时间,我想知道是否有任何快速解决方案可以从 ehcache jar 中排除此库或覆盖它们的版本?
P.S。
当我检查 ehcache 文档时,它说应该添加 pom
类型的依赖项
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.10.4</version>
<type>pom</type>
</dependency>
但是如果我在我的 pom 中将其更改为这种类型 - 缓存管理器未初始化并且我收到此错误
Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'sessionRepositoryFilterRegistration' defined in class path resource [org/springframework/boot/autoconfigure/session/SessionRepositoryFilterConfiguration.class]: Unsatisfied dependency expressed through method 'sessionRepositoryFilterRegistration' parameter 1; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.boot.autoconfigure.session.JdbcSessionConfiguration$SpringBootJdbcHttpSessionConfiguration': Unsatisfied dependency expressed through method 'setTransactionManager' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: 'entityManagerFactory' depends on missing bean 'cacheManager'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'cacheManager' available
有时库工件以多种方式发布。
一种方法是打包所有需要的依赖项,这样就可以使用它 as-is 而无需添加额外的依赖项。挑战正是您在这里观察到的 - 无法排除或更改那些嵌入式依赖项。 org.hamcrest:hamcrest-all
是一个例子。
一些库也有一个“较轻”的版本——一个只包含特定工件的 类 等的版本。然后,我们可以显式添加其他依赖项以获得所需的功能 - 我们完全可以控制使用的版本等。 org.hamcrest:hamcrest-core
和 org.hamcrest:hamcrest-library
是 hamcrest-all
的部分替代品(可能需要更多依赖项才能获得 -all
版本提供的完整功能)。
我个人更喜欢第二种方式,因为遇到的问题很难找到和调试。
因此,这里的解决方法是查看是否有 Ehcache 版本 2 的“轻型”版本,然后改用它(以及核心功能所需的任何其他依赖项)。
如果没有,而且你绝对不能切换到版本 3,那么你可以继续使用 maven-shade-plugin 重建 ehcache jar,过滤掉额外的依赖项。我强烈建议不要这样做,因为谁想在每次版本更新时重建 ehcache 罐子?并且(现在损坏的)库无论如何也有可能无法正常工作。此外,它必须手动上传到团队的工件存储库,最好使用分类器或不同的组 ID 来明确这不是官方版本。如果所有这些都让您头晕目眩,那就是进行升级的一个很好的理由。 :)
在我的 pom 中我有 ehcache 2 依赖项
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>${ehcache.version}</version>
</dependency>
问题是在应用程序构建期间,我们有一个 grype 检查漏洞,它检测到此依赖项中的几个库:
NAME INSTALLED FIXED-IN VULNERABILITY SEVERITY
jackson-databind 2.11.1 2.12.6.1 GHSA-57j2-w4cx-62h2 High
jersey-common 2.31 2.34 GHSA-c43q-5hpj-4crv Medium
jetty-server 9.4.39.v20210325 9.4.41 GHSA-m6cp-vxjx-65j6 Low
这有点令人困惑,因为库以非常奇怪的方式添加到 ehcache jar - 不像依赖项,而是扩展名为 *.class_terracotta 的文件,位于文件夹“rest-management-private-classpath”中,显示在 screenshot
由于这种方法,无法在 pom 文件中覆盖或排除库版本。
可能正确的方法是从 ehcache 2 迁移到 3,但这可能需要一些时间,我想知道是否有任何快速解决方案可以从 ehcache jar 中排除此库或覆盖它们的版本?
P.S。 当我检查 ehcache 文档时,它说应该添加 pom
类型的依赖项 <dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.10.4</version>
<type>pom</type>
</dependency>
但是如果我在我的 pom 中将其更改为这种类型 - 缓存管理器未初始化并且我收到此错误
Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'sessionRepositoryFilterRegistration' defined in class path resource [org/springframework/boot/autoconfigure/session/SessionRepositoryFilterConfiguration.class]: Unsatisfied dependency expressed through method 'sessionRepositoryFilterRegistration' parameter 1; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.boot.autoconfigure.session.JdbcSessionConfiguration$SpringBootJdbcHttpSessionConfiguration': Unsatisfied dependency expressed through method 'setTransactionManager' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: 'entityManagerFactory' depends on missing bean 'cacheManager'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'cacheManager' available
有时库工件以多种方式发布。
一种方法是打包所有需要的依赖项,这样就可以使用它 as-is 而无需添加额外的依赖项。挑战正是您在这里观察到的 - 无法排除或更改那些嵌入式依赖项。 org.hamcrest:hamcrest-all
是一个例子。
一些库也有一个“较轻”的版本——一个只包含特定工件的 类 等的版本。然后,我们可以显式添加其他依赖项以获得所需的功能 - 我们完全可以控制使用的版本等。 org.hamcrest:hamcrest-core
和 org.hamcrest:hamcrest-library
是 hamcrest-all
的部分替代品(可能需要更多依赖项才能获得 -all
版本提供的完整功能)。
我个人更喜欢第二种方式,因为遇到的问题很难找到和调试。
因此,这里的解决方法是查看是否有 Ehcache 版本 2 的“轻型”版本,然后改用它(以及核心功能所需的任何其他依赖项)。
如果没有,而且你绝对不能切换到版本 3,那么你可以继续使用 maven-shade-plugin 重建 ehcache jar,过滤掉额外的依赖项。我强烈建议不要这样做,因为谁想在每次版本更新时重建 ehcache 罐子?并且(现在损坏的)库无论如何也有可能无法正常工作。此外,它必须手动上传到团队的工件存储库,最好使用分类器或不同的组 ID 来明确这不是官方版本。如果所有这些都让您头晕目眩,那就是进行升级的一个很好的理由。 :)