热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

maven子module与工程管理

实际项目过程中,我们的工程往往是多个模块组合在一起,甚至相互之间也会有依赖关系,如何管理好这些依赖是一个很重要的技能。举个简单的场景&#x

  实际项目过程中,我们的工程往往是多个模块组合在一起,甚至相互之间也会有依赖关系,如何管理好这些依赖是一个很重要的技能。

  举个简单的场景,web工程mavenWeb与java工程mavenJava都属于一个项目里的模块,而且mavenWeb依赖于mavenJava,通常,我们会建立一个父pom来管理这样的工程。

---------------------------->

  绝大多数时候我都会直接用eclipse插件所提供的快速建maven工程来选择新建web或者java,但命令还是很重要的。创建过程中遇到了问题:

mvn archetype:create -DgroupId=com.changjiang.test -DartifactId=mavenJava -DpackageName=com.changjiang.test

但出现报错:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-archetype-plugin:2.4:create (default-cli) on project standalone-pom: Unable to pars
e configuration of mojo org.apache.maven.plugins:maven
-archetype-plugin:2.4:create for parameter #: Abstract class or interface 'org.apache.maven
.artifact.repository.ArtifactRepository' cannot be instantiated -> [Help 1]

参照了网上的解决方案:

* JAVA_HOME没有设置或者设置有误、m2_home设置有误
* 删除/org/apache/maven/plugins/下的maven-archetype-plugin
* archetype:create命令已经过期,需要使用 archetype:generate 来进行代替(方案可行)
* maven-archetype-plugin 2.3版本的插件有问题,换其它版本进行创建(方案可行)

于是改用generate替代create(maven版本3.0.5),命令行交互mode出现,选择一些基本信息后,创建成功:

mvn archetype:generate -DgroupId=com.changjiang.test -DartifactId=mavenJava -DpackageName=com.changjiang.test

---------------------------->

  接着用命令创建一个mavenWeb工程:

mvn archetype:generate -DgroupId=com.changjiang.web -DartifactId=mavenWeb -DpackageName=com.changjiang.web -DarchetypeArtifactId=maven-archetype-webapp

其过程与mavenJava类似;

 ---------------------------->

  接下来,我们将工程修改符合eclipse要求的结构:

mvn eclipse:eclipse
=====================================
mvn eclipse:eclipse -DwtpVersion=2.0

导入eclipse。结构如下:

  ---------------------------->

  如果我们不用一个父pom来管理这两个模块,那么当mavenWeb需要依赖mavenJava时,就必须在打包多次,如果有多个模块,这个操作就会非常复杂。这里引入pom对这两个模块进行管理。

...
pom1.0mavenWebmavenJavajunitjunit4.11test

子项目里:

...4.0.0com.changjiang.mavenmavenParent1.0
...

这样,只要在mavenParent中进行mvn install的操作,它就会对所有的模块进行自动打包处理。

  除了子模块的统一入口,父pom另一个作用就是依赖的遗传,设置统一的并在中标注版本,即可统一管理所有的公共依赖和它们的版本。

...CHiQ3-webCHiQ3-rest2.03.0.16.Final2.8.41.21.7.74.111.9.51.2.73.2.04.2.4.RELEASE2.0.81.8.2.RELEASE1.0.143.4.60.51.8.73.20.0-GA5.1.384.5.13.2.12.6.3UTF-81.7UTF-8UTF-83.1-b08javax.ws.rsjavax.ws.rs-api${javax.ws.rs-api.version}org.jboss.resteasyresteasy-client
...

子pom中也可以像在父pom中确定依赖的版本。

  如果各个子模块之间也有依赖关系,比如我们提到的这个场景,mavenWeb依赖于mavenJava,那么也可以在父pom中用进行管理。

 需要特别注意的是,父pom中所定义的各种参数,子pom可以用${}来引用,但是里面不能用通配符。

 ---------------------------->

  当然,父pom中的也是会被继承的。相对的,也会有可以保证子pom中所有的版本,配置一致。

  另外,对于maven依赖冲突时,maven有自己的规则来进行排序,比如同级的相同依赖,按在pom中出现的先后排序;不同级的依赖,就近原则。

  如果在继承的过程中,发现有依赖中部分的依赖不想被继承,就要用到:

...org.hibernatehibernate-core5.1.0.Finaljavax.transactionjta

---------------------------->

  在添加诸如spring等的依赖时,往往会用到一些依赖所依赖的jar包,这个时候最好能够将已经引用到,但是没有放到pom中的依赖放到pom中去。可以用mvn dependency:resolve来查询已经依赖的jar包和文件:

E:\Users\BruceChan\workspace\dev01\mavenParent>mvn dependency:resolve
[INFO] Scanning
for projects...
[INFO]
------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] mavenParent
[INFO] mavenJava
[INFO] mavenWeb Maven Webapp
[INFO]
[INFO]
------------------------------------------------------------------------
[INFO] Building mavenParent
1.0
[INFO]
------------------------------------------------------------------------
[INFO]
[INFO]
--- maven-dependency-plugin:2.1:resolve (default-cli) @ mavenParent ---
[INFO]
[INFO] The following files have been resolved:
[INFO] antlr:antlr:jar:
2.7.7:compile
[INFO] com.fasterxml:classmate:jar:
1.3.0:compile
[INFO] dom4j:dom4j:jar:
1.6.1:compile
[INFO] junit:junit:jar:
4.11:test
[INFO] org.apache.geronimo.specs:geronimo
-jta_1.1_spec:jar:1.1.1:compile
[INFO] org.hamcrest:hamcrest
-core:jar:1.3:test
[INFO] org.hibernate:hibernate
-core:jar:5.1.0.Final:compile
[INFO] org.hibernate.common:hibernate
-commons-annotations:jar:5.0.1.Final:compile
[INFO] org.hibernate.javax.persistence:hibernate
-jpa-2.1-api:jar:1.0.0.Final:compile
[INFO] org.javassist:javassist:jar:
3.20.0-GA:compile
[INFO] org.jboss:jandex:jar:
2.0.0.Final:compile
[INFO] org.jboss.logging:jboss
-logging:jar:3.3.0.Final:compile
[INFO] xml
-apis:xml-apis:jar:1.0.b2:compile
[INFO]
[INFO]
[INFO]
------------------------------------------------------------------------
[INFO] Building mavenJava
1.0
[INFO]
------------------------------------------------------------------------
[INFO]
[INFO]
--- maven-dependency-plugin:2.1:resolve (default-cli) @ mavenJava ---
[INFO]
[INFO] The following files have been resolved:
[INFO] antlr:antlr:jar:
2.7.7:compile
[INFO] com.fasterxml:classmate:jar:
1.3.0:compile
[INFO] dom4j:dom4j:jar:
1.6.1:compile
[INFO] junit:junit:jar:
4.11:test
[INFO] org.apache.geronimo.specs:geronimo
-jta_1.1_spec:jar:1.1.1:compile
[INFO] org.hamcrest:hamcrest
-core:jar:1.3:test
[INFO] org.hibernate:hibernate
-core:jar:5.1.0.Final:compile
[INFO] org.hibernate.common:hibernate
-commons-annotations:jar:5.0.1.Final:compile
[INFO] org.hibernate.javax.persistence:hibernate
-jpa-2.1-api:jar:1.0.0.Final:compile
[INFO] org.javassist:javassist:jar:
3.20.0-GA:compile
[INFO] org.jboss:jandex:jar:
2.0.0.Final:compile
[INFO] org.jboss.logging:jboss
-logging:jar:3.3.0.Final:compile
[INFO] xml
-apis:xml-apis:jar:1.0.b2:compile
[INFO]
[INFO]
[INFO]
------------------------------------------------------------------------
[INFO] Building mavenWeb Maven Webapp
1.0
[INFO]
------------------------------------------------------------------------
[INFO]
[INFO]
--- maven-dependency-plugin:2.1:resolve (default-cli) @ mavenWeb ---
[INFO]
[INFO] The following files have been resolved:
[INFO] antlr:antlr:jar:
2.7.7:compile
[INFO] com.changjiang.test:mavenJava:jar:
1.0:compile
[INFO] com.fasterxml:classmate:jar:
1.3.0:compile
[INFO] dom4j:dom4j:jar:
1.6.1:compile
[INFO] javax.servlet:javax.servlet
-api:jar:3.1.0:provided
[INFO] junit:junit:jar:
4.11:test
[INFO] org.apache.geronimo.specs:geronimo
-jta_1.1_spec:jar:1.1.1:compile
[INFO] org.hamcrest:hamcrest
-core:jar:1.3:test
[INFO] org.hibernate:hibernate
-core:jar:5.1.0.Final:compile
[INFO] org.hibernate.common:hibernate
-commons-annotations:jar:5.0.1.Final:compile
[INFO] org.hibernate.javax.persistence:hibernate
-jpa-2.1-api:jar:1.0.0.Final:compile
[INFO] org.javassist:javassist:jar:
3.20.0-GA:compile
[INFO] org.jboss:jandex:jar:
2.0.0.Final:compile
[INFO] org.jboss.logging:jboss
-logging:jar:3.3.0.Final:compile
[INFO] xml
-apis:xml-apis:jar:1.0.b2:compile
[INFO]
[INFO]
------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] mavenParent ....................................... SUCCESS [
1.148s]
[INFO] mavenJava ......................................... SUCCESS [
0.216s]
[INFO] mavenWeb Maven Webapp ............................. SUCCESS [
0.220s]
[INFO]
------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO]
------------------------------------------------------------------------
[INFO] Total time:
2.210s
[INFO] Finished at: Thu Aug
25 15:18:28 CST 2016
[INFO] Final Memory: 9M
/244M
[INFO]
------------------------------------------------------------------------

  ---------------------------->

对于平时用到比较多的依赖,可以整理一个专门的pom来存放这些依赖,在使用的时候,直接引用这个pom就可以了。

com.xxxxxxxxxpom

不过采用这种方式存在依赖性的问题。

  这种依赖性的问题,总体来说就是有共享的信息,多用依赖,没有共享的信息,就用多模块处理。

转:https://www.cnblogs.com/bruceChan0018/p/5793923.html



推荐阅读
  • Java EE 平台集成了多种服务、API 和协议,旨在支持基于 Web 的多层应用程序开发。本文将详细介绍 Java EE 中的 13 种关键技术规范,帮助开发者更好地理解和应用这些技术。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • java解析json转Map前段时间在做json报文处理的时候,写了一个针对不同格式json转map的处理工具方法,总结记录如下:1、单节点单层级、单节点多层级json转mapim ... [详细]
  • 解决Jenkins编译过程中ERROR: Failed to Parse POMs的问题
    在使用Jenkins进行自动化构建时,有时会遇到“ERROR: Failed to parse POMs”的错误。本文将详细分析该问题的原因,并提供有效的解决方案。 ... [详细]
  • 面试题总结_2019年全网最热门的123个Java并发面试题总结
    面试题总结_2019年全网最热门的123个Java并发面试题总结 ... [详细]
  • 本文介绍了如何在 Spring Boot 项目中使用 spring-boot-starter-quartz 组件实现定时任务,并将 cron 表达式存储在数据库中,以便动态调整任务执行频率。 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • 本文将介绍如何在混合开发(Hybrid)应用中实现Native与HTML5的交互,包括基本概念、学习目标以及具体的实现步骤。 ... [详细]
  • 本文介绍了Spring 2.0引入的TaskExecutor接口及其多种实现,包括同步和异步执行任务的方式。文章详细解释了如何在Spring应用中配置和使用这些线程池实现,以提高应用的性能和可管理性。 ... [详细]
  • 如何高效查看Java API和源码
    在Java学习过程中,查看API文档和源码是提高编程能力的重要手段。本文将详细介绍如何使用各种工具和方法高效地查看Java API和源码。 ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • 探讨异步 Rust 中多线程代码无法实现并行化的原因及解决方案。 ... [详细]
  • 本文深入探讨了 Git 与 SVN 的高效使用技巧,旨在帮助开发者轻松应对版本控制中的各种挑战。通过详细解析两种工具的核心功能与最佳实践,读者将能够更好地掌握版本管理的精髓,提高开发效率。 ... [详细]
author-avatar
手机用户2502858701
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有