`
bruce008
  • 浏览: 172873 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Maven 在项目中的依赖管理

阅读更多

现在基于Java的企业开发如果不是太土或者太前卫基本上都会基于maven 来对项目进行版本管理。 其实用maven 来进行版本管理跟源代码管理和项目的开发流程相关发布,issue管理都有非常紧密的关系。

 

其实目前的项目层次划分还是比较清晰的。 基本上分为三层: 最底层的框架层,应用层 和最上面的use case层。

    1, 框架层提供的是一个基本的框架。由于现在这个系统是要运行在特有的cloud 环境,最悲催的是不能用Spring,所以这个framework层做了很多Spring 干的事情,IOC, 生命周期的组件, 事务管理。 封装了最核心的基于jms消息机制的proactor 模式。另外框架层还定义了很多常用的模块来封装了基础的功能。

    2, 应用层当然是基于框架层定义了系统特有的流程,规则匹配机制,工作引擎。 它也是分为N个不同的模块。

 

    3,  Use case 层则基于应用层根据业务的不同划分成不同的use case。

 

这样看下来, 最起码可以给framework, application 和use case 分别定义一个顶层的pom parent, 然后每一个子模块定义自己的pom。 那怎么来定义pom 里面的版本呢, 一种是顶层的pom 有自己的版本,子模块有自己的版本号。这种管理方法支持不同模块有不同的版本,可以单独release。另外一种是在每一个相同的层次上只有一个版本, 比如整个framework 层只有一个版本号。 划分成不同的模块只是功能方面的划分, 不需要单独release 管理。所以我们还是选择一层一个版本吧。

 

让我们回头看看Maven 解析dependency的rule是:

1,   nearest definition。 如果一个库在依赖树上不同版本被依赖, 在最靠近当前pom 的层次上那个版本获胜。 如果两个都处于相同的层次, 那么谁先定义谁获胜。  这样dependency 出现的先后也很重要了。 

 

2,  如果我们想自己来解决这种多重依赖的问题, 我们可以在自己的pom 来显示定义下这个库的依赖。 这个定义当然就满足它的nearest definition的要求了,  就按我们自己的pom中的版本来了。 

 

3,  我们还可以用exclusive 来排除某个依赖库的依赖。   

 

4,  optional  的依赖 是不会传递的。  

 

 

再看看怎么来定义我们的各个层中pom 的依赖呢:

1, 在各层的pom parent 中 指定dependencyManagement 元素 这层中公共的依赖都放在这里, 常用的依赖的版本在properties 来指定。  子模块中就指定dependency 就可以了。不用知道版本。

 

2,  针对那种依赖不想传递下去, 我们需要加optional 不再传递下去。  比如在我们的framework 层封装了 ibmmq, oracleaq 不同的message queue 实现 那么在application 或者 use case 层 我们不需要同时使用这两种不同的实现, 我们就把ibmmq , oracleaq 的jar  指定成 optional。 这样client 具体使用时再来显式指定。

 

3,  application 可依赖framework, 所以它的有些dependency 是framework 传递下来的, 我们就不再application parent pom 中 指定了。 同样原则也用于 use case 的parent pom。

 

4,  framework, application 跟 use case 三层分别属于不同的svn repository, 它们有不同的版本。 不同的版本发布周期。  基本上是framework 最稳定, application 次之。use case 变化反映了业务,变化最频繁。 

 

 

由于公司,项目性质决定了这个地方是没有任何代码的, 只有些原则方面的东西出现在这个地方了。  

 

 

 

 

 

 

分享到:
评论
1 楼 bruce008 2012-11-13  
其实这个optional 为true 的时候还有个很管用的用法。 比如我们在打war 包的时候, 如果很多jar 包都依赖log4j , 基于这样依赖传递我们用exclusion 在每一个jar 上面排除太麻烦了。  只需要定义一个对log4j 的dependency, optional 为true。 这个时候log4j 的依赖链是最短的,因为我们就是直接依赖。 但同时optional 为true 就不会将log4j 打进来了。  这种用法还是蛮管用的, 呵呵。


另外 <version> </version> 元素可以用parent 中定义的 property。 我们采用这种来做 continous release 还是很爽的。 唯一的要求是对Jenkins server 硬盘容量的限制。 

相关推荐

    ​实现maven项目中多版本依赖兼容使用解决方案

    以下是如何实现Maven项目中多版本依赖兼容的解决方案: 1. **理解Maven依赖管理**: Maven依赖管理遵循“传递性”原则,即项目可以直接依赖其他项目,间接依赖也会被自动引入。当出现相同类路径的冲突时,Maven会...

    Maven 多项目依赖关系

    本文将深入探讨Maven如何处理多项目依赖关系,并结合标签“源码”和“工具”,探讨其在实际开发中的应用。 一、Maven项目结构与POM.xml 每个Maven项目都有一个核心配置文件——`pom.xml`,它定义了项目的元数据,...

    maven 中引入依赖的包

    本文将深入探讨如何在Maven项目中引入依赖的包,并结合相关源码和工具,帮助开发者更好地理解和使用这一功能。 首先,理解Maven的核心概念——`pom.xml`。这是每个Maven项目的心脏,它定义了项目的配置信息,包括...

    idea使用maven创建web项目详细教程

    Maven 依赖管理是通过 pom.xml 文件来管理的,例如可以在 pom.xml 文件中添加依赖关系,以便在项目中使用相应的库。 9. Maven 项目结构 Maven 项目结构主要包括 src/main/java、src/main/resources、src/test/java...

    添加非托管到Maven项目依赖关系.doc

    Maven 项目依赖关系管理是 Java 应用程序开发中非常重要的一步。Maven 是一种流行的项目管理工具,可以帮助开发者快速构建和管理项目。然而,在实际开发中,我们常常会遇到一些不可以在公共 Maven 存储库中的依赖...

    Maven的依赖验证项目

    【Maven的依赖验证项目】是一个关于Maven项目管理和依赖管理的实践案例,它与CSDN博主songdeitao的一篇文章《Maven依赖管理详解》相关联。在这个项目中,我们将深入理解Maven如何处理项目的依赖关系,以及如何有效地...

    Maven中的依赖

    7. **依赖管理和继承**:在大型项目中,可以通过创建父POM来集中管理公共依赖和插件,子项目通过继承父POM来继承这些配置。 8. **版本管理和生命周期**:Maven的版本管理允许我们轻松地升级或降级依赖版本。生命...

    maven依赖+继承+聚合

    聚合(Aggregation)是指在单个Maven项目中管理多个子项目的能力。在`pom.xml`中定义`modules`标签,可以将多个子项目包含进来。这样,当我们在顶层项目上执行命令时,Maven会递归地构建所有子项目。例如: ```xml ...

    maven依赖小例子

    本示例旨在向你展示如何在Maven项目中处理依赖管理,这对于理解和优化你的开发流程至关重要。 Maven依赖管理是Maven的核心功能之一,它允许开发者声明项目所依赖的库,并自动下载这些库到本地仓库,以便于构建和...

    Maven在eclipse中的项目启动命令

    在Eclipse中管理和运行Maven项目时,可能会遇到一些常见的问题及其解决方法: ##### 常见问题 - **Web.xml和index.properties问题**: 这些文件是Web项目的关键配置文件,如果缺失或损坏,会导致项目无法正常运行。...

    maven项目转换WEB项目

    1. **导入Maven项目到Eclipse**:在Eclipse中选择“File” &gt; “Import” &gt; “Maven” &gt; “Existing Maven Projects”,然后导航到Maven项目的根目录,选择`pom.xml`文件导入。 2. **转换为Dynamic Web Project**:...

    Maven依赖管理项目构建工具.pdf

    2. Idea构建Maven Java SE工程 在IDEA中创建Maven项目,选择New -&gt; Project -&gt; Maven,填写GAVP信息,IDEA会自动生成基本的Maven项目结构,包括pom.xml配置文件。 3. Idea构建Maven Java Web工程 类似于Java SE工程...

    maven项目管理工具

    一个Maven项目可以包含多个子项目,通过设置parent POM,可以实现子项目共享公共配置,便于大型项目的管理。 Maven的缺点也值得提及,例如,其配置文件POM.xml可能会变得复杂,特别是当项目依赖关系繁多时。另外,...

    maven管理的web项目

    2. **依赖管理**:Maven通过POM中的`&lt;dependencies&gt;`标签来管理项目所需的外部库。它会自动下载并管理这些库,避免了类路径冲突的问题。Maven仓库(Central Repository)存储了大量的开源组件,使得开发者可以方便地...

    Maven项目管理软件

    2. **依赖管理**:在Maven项目中,所有的外部依赖都通过POM(Project Object Model)文件来管理。POM是Maven的核心,它包含了项目的基本信息、构建指令以及依赖关系。通过Maven的中央仓库,可以自动下载并管理项目所...

    java中maven,管理项目依赖,如pom.xml

    2. **坐标**: Maven项目依赖于其他库时,通过一组唯一的标识来定位,这组标识包括groupId、artifactId和version,也就是所谓的Maven坐标。 3. **依赖管理**: Maven会自动管理项目的依赖关系,根据POM文件中的声明,...

    maven_package 依赖包(完整)

    Maven是Java开发中的一款项目管理和综合工具,它简化了构建、依赖管理以及项目生命周期的流程。在本"maven_package"压缩包中,包含了完整的Maven依赖包,这些包广泛适用于各种Java项目,确保了项目的正常运行和高效...

    构建基于Maven的SSH原型项目

    1. **初始化项目**:创建一个新的Maven项目,设置POM.xml文件,这是Maven项目的配置中心,包含项目的基本信息和依赖。 2. **添加SSH框架依赖**:在POM.xml中,你需要指定SSH框架的版本号,并添加相应的依赖。 3. *...

    maven构建项目工程

    这样,在依赖管理中引用这些属性,可以方便地统一更新所有相关库的版本,保持一致性。 在`&lt;dependencies&gt;`标签内,列举了项目所依赖的库,如Spring、Hibernate、JDBC驱动等,每个依赖都包含`&lt;groupId&gt;`、`...

Global site tag (gtag.js) - Google Analytics