在Maven中创建依赖项组以供重用-包括“提供的”依赖项

如何解决在Maven中创建依赖项组以供重用-包括“提供的”依赖项

|| 我是Maven的新手,正在建立我的第一个Maven项目。我还以一些poms的形式创建了一些maven资产,这些pom可以从任何将来的项目中继承或用作依赖项。我想将依赖项分组在一起,并能够根据需要有选择地将它们添加到项目中。 我阅读了有关pom最佳实践的这篇文章。我喜欢将相关的依赖项组合到poms中,然后根据需要将pom作为依赖项添加到项目中的想法。这种方法非常适合编译范围内的依赖项。但是,它对于提供的作用域对象失败,因为作为传递依赖项,它们被忽略了。 这是我的意思的示例:可以说,我将项目的Web依赖项归为一个web-deps pom.xml。其中包括ѭ0范围的spring框架依赖关系,以及include1范围的javaee依赖关系:
<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>mvn-web-deps</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${org.springframework.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${org.springframework.version}</version>
    </dependency>
    <dependency>
        <groupId>javaee</groupId>
        <artifactId>javaee-api</artifactId>
        <version>${javaee.version}</version>
        <scope>provided</scope>
    </dependency>
</dependencies>
然后,我将此pom作为依赖项添加到另一个项目中:
<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>project-a</artifactId>
<version>0.0.1-SNAPSHOT</version>

<dependency>
    <groupId>com.xyz</groupId>
    <artifactId>mvn-web-deps</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <type>pom</type>
</dependency>
mvn-web-deps
中的依赖项现在变为可传递的。由于上面的依赖项引用的作用域是“ 0”,因此省略了“ 1”传递依赖项。 我想避免将它们添加到父级的“ 7”部分,因为只能有一个父级,而一个项目可能只需要其中一些依赖项组,而不是全部。我也许可以将它们添加到“ 8”部分,但随后我将不得不在每个子项目中重新声明每个依赖项(不依赖版本)。 在避免上述问题的同时,对依赖项进行分组的正确/更好的方法是什么?     

解决方法

这个问题的简短答案是,您只应在代码需要编译的地方本地包含“提供的”依赖项,而不能在父pom.xml或其他结构中包含。指示您在全局pom.xml中具有\'provided \'依赖性对于maven而言是无意义的,因为它不需要在此类pom.xml中进行编译。 这是一个很长的答案: 当我开始使用Maven时,我有一个相同的想法,就是尝试将工件和依赖项分组到pom.xml模块中,希望它们将来会有用。现在,我有了更多的经验,我了解到这完全是浪费时间。对我来说,这是过度设计的形式。 我已经学会了将大型项目分成单独的模块,每个模块都在各自的Subversion存储库中。我在其pom.xml中包括了每个本地模块所需的依赖项。我在编写代码时并根据需要(即经过测试且稳定时)发布每个模块的版本标记。 我通过使用自己的pom.xml创建一个单独的maven项目来构建大型项目,并将模块导入为依赖项。发布后,我会不时更新依赖关系中模块的版本。然后,在编译/发布大项目时,我让maven进行拉动,而不是拉动。 Maven允许pom.xmls之间进行各种复杂的构造和层次结构,但是恕我直言,此功能会造成不必要的混乱和复杂性。到目前为止,对我来说,这还没有被证明是真正的好处。一开始,我希望编译一个pom.xml可以以级联的方式正确编译其余部分。我确实得到了一些结果,但是在所有全局pom.xml中都需要维护。 分别发布模块的工件并在这些发行版上构建项目为我节省了很多时间,我只能推荐它。总的来说,我需要维护的pom.xml更少,并且它们的复杂性也更低。对于相同的最终结果... 因此,如果构建全局/结构pom.xml的唯一理由是希望节省时间,那么我建议您放弃这个想法...在单独的项目中分离代码,然后在全球范围内发行和然后进行编译。     ,我得出的结论是,Maven不是针对这种用例设计的。我最终有了一个父级
pom.xml
,并将我使用的所有库添加到了
<dependencyManagement>
部分。我创建的所有新项目/模块都从父级
pom.xml
继承其
pom.xml
,并将需要的每个依赖项添加到自己的
<dependencies>
部分中,减去版本。这种方案使我可以在一个地方管理我使用的库的版本及其所需的存储库声明。另一个优点(相对于尝试以某种方式创建依赖项捆绑包)是,这可以对添加到子poms的库进行更细粒度的控制-仅添加实际需要的依赖项。     ,提供范围的依赖关系确实是从父POM继承的,但不是从定义为依赖关系的POM继承的,我认为这是Maven的弱点。 鉴于Maven在添加模块作为跨模块层次结构的依存关系方面也有困难,我不能说Maven是管理多模块项目的复杂工具。 Maven期望严格的单根层次结构仅适用于最简单的项目。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-