如何在另一个具有更高Spring版本的Spring项目中使用具有Spring作为打包依赖项的jar?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在另一个具有更高Spring版本的Spring项目中使用具有Spring作为打包依赖项的jar?相关的知识,希望对你有一定的参考价值。

[关于如何将一个Spring项目作为依赖项添加到另一个Spring项目中,有很多问题。但是,一旦我们成功回答了“操作方法”部分,我正在寻找的是解决特定问题。

假设我们有两个基于Spring的多模块Maven项目。项目A和项目B。Project-A中使用的SpringFramework版本为4.2.3。使用具有NO特殊配置的shade-plugin,将Project-A中的某些模块组合并内置到uber-jar中。这意味着,如果我打开uber-jar,我可以找到所有依赖项(我认为甚至是传递性依赖项)都打包到了uber-jar中。 (当然,这可能很丑陋,但我无法更改此超级容器。出于x,y,z的原因,将其重构并分解为较小的消耗性依赖项是毫无疑问的)。对基础资源的访问是通过uber-jar中的模块之一公开的API进行的。所以我坚持了这一点。

现在,我想使用项目A中的这个uber-jar作为项目B中的依赖项。我使用了安装插件,并在验证阶段附加了安装此uber-jar的内容。

但是,在项目B中,我希望使用spring-data-jdbc。现在,spring-data-jdbc是一个相当新的项目,如参考文档中的here中所述,所需的最小spring-framework版本为5.2.6.RELEASE。

因此,当我添加uber-jar作为依赖项时,尽管我可以成功完成maven全新安装,但还是遇到了一些NoSuchMethodException,如下所示:java.lang.nosuchmethoderror:org.springframework.util.reflectionutils.accessibleconstructor(ljava/lang/class;[ljava/lang/class;)当工件被部署到tomcat 8.5中时

this问题中描述的问题相似。因此,使用Maven依赖插件,我查看了Project-B的依赖树,但看不到列出了spring-version 4.2.3。 uber-jar下未列出任何传递依赖项。

我什至查看了不同目标下的构建类路径,仍然只能从列出的Project-B中找到spring-version 5.2.6.RELEASE。但是,很明显,在部署期间,我仅使用uber-jar中的spring-farmework 4.2.3。因为无法找到的方法仅从Spring 5.0起可用,如java-doc here

中所述

无法升级Project-A的spring-version(再次出于x,y,z的原因)。在将uber-jar添加为依赖项时,我尝试从uber-jar中排除所有依赖项,但这无济于事。

问题:

  1. 我们可以告诉项目B使用其项目的spring-framework依赖项(5.2.6.RELEASE)而不使用来自uber-jar的那个,同时让project-A(在uber的jar中)的类使用打包在uber-jar中的spring-framework?
  2. 甚至提出上述问题都令人不安,因为我想我知道两个版本都已添加到类路径中。并且在部署过程中,容器正在拾取导致该问题的第一个容器。这是正确的吗?
  3. 在我描述的模型中,(如构建uber-jar一样)依赖管理如何工作?意思是,因为我可以看到打包到uber-jar中的所有依赖项,所以当我将该uber-jar用作依赖项时,是否也将所有打包的依赖项(jar)也添加到使用中的项目类路径中?
  4. 我在验证阶段在builindg project-b时安装了uber-jar,然后编译了project-b,这是什么引起了问题?
  5. 如果这是一个混乱的情况,我可以得到关于spring-data-jdbc替代方案的建议吗?这样我就可以完全放弃在project-b中使用更高版本的Spring的想法。我不需要Java Persistence API的所有功能,例如延迟加载,缓存等等。我只想使用存储库模式来通过简单的事务管理轻松地执行某些CRUD操作,这就是为什么我选择spring-data-jdbc。

我花了一整天的时间阅读,学习,研究所有内容,包括如何解决maven依赖关系,shadow插件如何工作等等。感觉就像一个大难题,我无法将其全部融合在一起。感谢您的指导。

更新:因此依赖关系树如下所示:

  • Project-A,Uber-Jar模块依赖关系树
org.railomaya.uberJarModule:uberJar:jar:2.0
[INFO] +- org.railomaya:OtherModule_1:jar:2.0
[INFO] \- org.railomaya:OtherModule_2:jar:1.0:compile
[INFO] +- org.railomaya:otherModule_3:jar:1.0-SNAPSHOT:compile
[INFO] |  +- org.springframework:spring-jms:jar:4.2.3.RELEASE:compile
[INFO] |  |  +- org.springframework:spring-messaging:jar:4.2.3.RELEASE:compile
[INFO] |  |  \- org.springframework:spring-tx:jar:4.2.3.RELEASE:compile
[INFO] |  \- org.apache.activemq:activemq-spring:jar:5.13.2:compile
[INFO] +- org.springframework:spring-context-support:jar:4.2.3.RELEASE:compile
[INFO] |  +- org.springframework:spring-beans:jar:4.2.3.RELEASE:compile
[INFO] |  +- org.springframework:spring-context:jar:4.2.3.RELEASE:compile
[INFO] |  |  +- org.springframework:spring-aop:jar:4.2.3.RELEASE:compile
[INFO] |  |  |  \- aopalliance:aopalliance:jar:1.0:compile
[INFO] |  |  \- org.springframework:spring-expression:jar:4.2.3.RELEASE:compile
[INFO] |  \- org.springframework:spring-core:jar:4.2.3.RELEASE:compile
[INFO] |     \- commons-logging:commons-logging:jar:1.2:compile
[INFO] +- org.springframework.boot:spring-boot-starter:jar:1.5.1.RELEASE:compile
[INFO] |  +- org.springframework.boot:spring-boot:jar:1.5.1.RELEASE:compile
[INFO] |  +- org.springframework.boot:spring-boot-autoconfigure:jar:1.5.1.RELEASE:compile
[INFO] |  +- org.springframework.boot:spring-boot-starter-logging:jar:1.5.1.RELEASE:compile
[INFO] |  |  +- ch.qos.logback:logback-classic:jar:1.1.9:compile
[INFO] |  |  |  \- ch.qos.logback:logback-core:jar:1.1.9:compile
[INFO] |  |  +- org.slf4j:jcl-over-slf4j:jar:1.7.22:compile
[INFO] |  |  +- org.slf4j:jul-to-slf4j:jar:1.7.22:compile
[INFO] |  |  \- org.slf4j:log4j-over-slf4j:jar:1.7.22:compile
[INFO] |  \- org.yaml:snakeyaml:jar:1.17:runtime
[INFO] +- org.springframework:spring-test:jar:4.2.3.RELEASE:test
[INFO] +- javax.servlet:servlet-api:jar:2.5:compile
[INFO] +- org.apache.commons:commons-lang3:jar:3.3.1:compile
[INFO] +- commons-io:commons-io:jar:2.4:compile

其中以上uber-jar被用作依赖项的Project-B依赖关系树:

org.railomaya:project-B:war:2.0-SNAPSHOT
[INFO] +- org.railomaya.uberJarModule:uberJar:jar:2.0:compile
[INFO] +- org.apache.commons:commons-dbcp2:jar:2.0.1:compile
[INFO] |  \- commons-logging:commons-logging:jar:1.1.3:compile
[INFO] +- org.apache.commons:commons-pool2:jar:2.2:compile
[INFO] +- org.apache.logging.log4j:log4j-api:jar:2.1:compile
[INFO] +- org.apache.logging.log4j:log4j-core:jar:2.1:compile
[INFO] +- org.apache.logging.log4j:log4j-web:jar:2.1:compile
[INFO] +- javax.mail:mail:jar:1.4.5:compile
[INFO] |  \- javax.activation:activation:jar:1.1:compile
[INFO] +- javax.servlet:servlet-api:jar:2.5:provided
[INFO] +- mysql:mysql-connector-java:jar:5.1.26:compile
[INFO] +- org.quartz-scheduler:quartz:jar:2.2.1:compile
[INFO] |  +- c3p0:c3p0:jar:0.9.1.1:compile
[INFO] |  \- org.slf4j:slf4j-api:jar:1.6.6:compile
[INFO] +- org.springframework:spring-beans:jar:5.2.6.RELEASE:compile
[INFO] +- org.springframework:spring-context:jar:5.2.6.RELEASE:compile
[INFO] |  \- org.springframework:spring-aop:jar:5.2.6.RELEASE:compile
[INFO] +- org.springframework:spring-context-support:jar:5.2.6.RELEASE:compile
[INFO] +- org.springframework:spring-core:jar:5.2.6.RELEASE:compile
[INFO] |  \- org.springframework:spring-jcl:jar:5.2.6.RELEASE:compile
[INFO] +- org.springframework:spring-expression:jar:5.2.6.RELEASE:compile
[INFO] +- org.springframework:spring-jdbc:jar:5.2.6.RELEASE:compile
[INFO] +- org.springframework:spring-test:jar:5.2.6.RELEASE:test
[INFO] +- org.springframework:spring-tx:jar:5.2.6.RELEASE:compile
[INFO] +- org.springframework:spring-web:jar:5.2.6.RELEASE:compile
[INFO] \- org.springframework:spring-webmvc:jar:5.2.6.RELEASE:compile
答案

我们可以告诉项目B使用其项目的spring-framework依赖项(5.2.6.RELEASE),而不使用uber-jar中的依赖项,而让project-A(在uber jar中)的类使用spring。 -framework打包在uber-jar中?

不容易。见下文。

我想我知道两个版本都已添加到类路径中。并且在部署过程中,容器正在拾取导致该问题的第一个容器。这是正确的吗?

当我使用这个uber-jar作为依赖项时,是否也将所有打包的依赖项(jar)添加到使用方项目的类路径中?

我在验证阶段在builindg project-b时安装了uber-jar,然后编译了project-b,这是什么引起了问题?

如果这是一个混乱的情况,我可以得到关于spring-data-jdbc的替代建议吗?

您始终可以使用Springs JdbcTemplate并使用它自己实现您的存储库。您甚至可以像对Spring Data JDBC那样考虑对聚合建模。

返回第一个问题:

首先要明确地说,不能保证Project A可以与较新的Spring版本一起使用,但是假设它可以。

[您需要做的是拆开ueber-jar,即删除不是Project A本身的所有内容,然后将其安装在您的maven存储库中,然后依赖于它,还取决于Spring的正确版本(TM)以及所有其他依赖项。

以上是关于如何在另一个具有更高Spring版本的Spring项目中使用具有Spring作为打包依赖项的jar?的主要内容,如果未能解决你的问题,请参考以下文章

Spring DAO 测试失败 - 说“需要 JUnit 4.12 或更高版本”

如何从 Spring Boot 项目创建 jar,这个 jar 我们想在另一个 Spring Boot 应用程序中使用?

如何确保 Spring Boot 额外的 Jackson 模块具有相同的版本?

Spring认证指南:了解如何构建一个多文件上传的 Spring 应用程序

如何使用 spring boot 插件 2.0.x 从一个具有不同依赖项的 gradle 项目生成 2 个 jars

如何使用spring boot plugin 2.0.x从一个具有不同依赖项的gradle项目生成2个jar