maven 模块之间的依赖没有模块的代码可以吗

Maven实战(二)---多模块开发---缺少Jar包 - CSDN博客
Maven实战(二)---多模块开发---缺少Jar包
Maven里面的Jar包经常出现Missing的情况,无外乎几种情况:
1、私服里面没有相应的版本号的Jar包或者Jar包没写版本号
2、Jar包引错了,相应的依赖关系也就错了
3、引入了依赖的Jar包,没被管理起来
& & & &第一二个问题解决起来挺简单的,第三个问题对于不理解Maven的还需要解决一番。
& & & &其实第三个问题就存在与Maven的&dependencies&节点与&dependencymanagement&节点。
& & & & & & & & & &&&&dependencies&节点是项目依赖,项目所依赖的Jar包;
& & & & & & & & & & &dependencymanagement&节点是多模块Maven项目开发的时候的依赖管理控制的。
&&&&&&&&&在多模块开发的时候,利用项目继承可以将结构信息、部署信息,将共同的依赖放在一个父类中。每个子项目的pom继承父类的pom中的依赖关系。这样就解决了所有的子项目的依赖项统一版本。所以为了项目的正确运行,必须让而在父类中将这些Jar包管理起来,在父项目的pom中定义共同的依赖关系。这就是依赖管理。
来看一下这两个节点的代码:
&modelVersion&4.0.0&/modelVersion&
&groupId&maven&/groupId&
&artifactId&A&/artifactId&
&packaging&pom&/packaging&
&name&A&/name&
&version&1.0&/version&
&dependencyManagement&
&dependencies&
&dependency&
&groupId&test&/groupId&
&artifactId&a&/artifactId&
&version&1.2&/version&
&/dependency&
&dependency&
&groupId&test&/groupId&
&artifactId&b&/artifactId&
&version&1.0&/version&
&scope&compile&/scope&
&/dependency&
&dependency&
&groupId&test&/groupId&
&artifactId&c&/artifactId&
&version&1.0&/version&
&scope&compile&/scope&
&/dependency&
&dependency&
&groupId&test&/groupId&
&artifactId&d&/artifactId&
&version&1.2&/version&
&/dependency&
&/dependencies&
&/dependencyManagement&
&/project&
&modelVersion&4.0.0&/modelVersion&
&groupId&maven&/groupId&
&artifactId&B&/artifactId&
&packaging&pom&/packaging&
&name&B&/name&
&version&1.0&/version&
&dependencyManagement&
&dependencies&
&dependency&
&groupId&maven&/groupId&
&artifactId&A&/artifactId&
&version&1.0&/version&
&type&pom&/type&
&scope&import&/scope&
&/dependency&
&dependency&
&groupId&test&/groupId&
&artifactId&d&/artifactId&
&version&1.0&/version&
&/dependency&
&/dependencies&
&/dependencyManagement&
&dependencies&
&dependency&
&groupId&test&/groupId&
&artifactId&a&/artifactId&
&version&1.0&/version&
&scope&runtime&/scope&
&/dependency&
&dependency&
&groupId&test&/groupId&
&artifactId&c&/artifactId&
&scope&runtime&/scope&
&/dependency&
&/dependencies&
&/project&
& & & & &&dependencies&中的jar直接加到项目中,管理的是依赖关系(如果有父pom,子pom,则子pom中只能被动接受父类的版本);&dependencyManagement&主要管理版本,对于子类继承同一个父类是很有用的,集中管理依赖版本不添加依赖关系,对于其中定义的版本,子pom不一定要继承父pom所定义的版本。
本文已收录于以下专栏:
相关文章推荐
项目右键maven->update project。
如果还有 missing 的jar,再项目右键maven->update project,但是这次勾选 Force Update ...那一行,...
话不多说直接上图
上图是我通过git导入项目后, Maven Dependencies Library中很多包出现missing错误, 变动pom.xml文件再保存也不能自动...
一般maven多模块工程结构如下图
如上图中分为dao数据层和上层web层(当然还可以有service层),在进行多模块划分的时候,一般将dao层采用jar进行打包,web层进行wa...
在所有的关于Maven多模块项目的配置完成以后,针对子类项目之间的依赖配置进行特殊处理,
配置完所有的配置以后,需要进行父类项目的进行如下操作:
首先需要针对所有的子类项目进行编译,如下:
转载地址: /tibit/p/6185704.html
idea 创建多模块依赖Maven项目
本来网上的教程还算多...
MyEclipse maven jar missing 解决方案
当maven 中有Jar包没有下载下来的时候,myexlipse会给出 错误提示,此时根据丢失的jar包所显示出的路径,找到那个位置,删除掉。然后右键 你的项目,选择Maven4Myeclipse
以前用Eclipse测试maven 的web工程,在eclipse内部tomcat右键上点一下“clean”就可以把工作空间的web项目代码自动发布到“F:\IWorkspace\.metadata\...
在Myeclipse中导入其他人的工程时有时会出现Maven Dependencies中的jar包丢失,这时需要将jar包下载到本地的仓库,通常自己手动下载是不成功的
右键项目选择Run A...
经常遇到奇葩问题,就是导入了maven项目,也没报错,但是运行的时候,各种奇葩报错,xxx.class not found;等等;
这种问题根源项目没有把maven管理的Jar包依赖进去;
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)基于Maven 分模块开发实践
1.1 背景问题
我们在java 开发中,最常用的模式是MVC, 根据理论讲到 各层完全独立,犹如组件一样,比如:今天DAO层用的Hibernate,明天你可以替换成Mybatis, 控制层今天用struts,也可以替换成springmvc,或者swing项目.这些我们只是强调这种思想,但是我们从来没有真正理解过,因为项目开发我们很少遇到这样场景,代码中我经常会为了寻求简便,或者没注意,各层交叉调用,都会导致后期维护困难。学习maven模块分层是一个电商项目中,一个平台会分为很多个子系统,比如会分为:前台、运营管理后台、卖家管理后台、监控、统计、定时任务等辅助系统。这些子系统之间独立部署切又有一定联系。对于这些系统 通常我们业务层和持久层代码重用比较多,但是系统如果独立,我们需要把相关代码copy一份过去,这样带来代码的维护难度。
1.2 maven 模块介绍
用Maven管理的真实的项目都应该是分模块的,每个模块都对应着一个pom.xml。它们之间通过继承和聚合(也称作多模块,multi-module)相互关联.模块之间关系结构比较清晰。例如:
一个简单的Maven模块结构是这样的:
---- app-parent
|-- pom.xml (pom)
|-- app-util
|-- pom.xml (jar)
|-- app-dao
|-- pom.xml (jar)
|-- app-service
|-- pom.xml (jar)
|-- app-web
|-- pom.xml (war)
上述简单示意图中,有一个父项目(app-parent)聚合很多子项目(app-util, app-dao, app-service, app-web)。每个项目,不管是父子,都含有一个pom.xml文件。而且要注意的是,小括号中标出了每个项目的打包类型。父项目是pom,也只能是pom。子项目有jar,或者war。根据它包含的内容具体考虑。
这些模块的依赖关系如下:
--& app-util
app-service --& app-dao
--& app-service
注意依赖的传递性(大部分情况是传递的,除非你配置了特殊的依赖scope),app-dao依赖于app-util,app-service依赖于app-dao,于是app-service也依赖于app-util。同理,app-web依赖于app-dao,app-util。
用项目层次的划分替代包层次的划分能给我们带来如下好处:
方便重用,如果你有一个新的swing项目需要用到app-dao和app-service,添加对它们的依赖即可,你不再需要去依赖一个WAR。而有些模块,如app-util,完全可以渐渐进化成公司的一份基础工具类库,供所有项目使用。这是模块化最重要的一个目的。
由于你现在划分了模块,每个模块的配置都在各自的pom.xml里,不用再到一个混乱的纷繁复杂的总的POM中寻找自己的配置。
如果你只是在app-dao上工作,你不再需要build整个项目,只要在app-dao目录运行mvn命令进行build即可,这样可以节省时间,尤其是当项目越来越复杂,build越来越耗时后。
某些模块,如app-util被所有人依赖,但你不想给所有人修改,现在你完全可以从这个项目结构出来,做成另外一个项目,svn只给特定的人访问,但仍提供jar给别人使用。
多模块的Maven项目结构支持一些Maven的更有趣的特性(如DepencencyManagement),这留作以后讨论。
2.Maven模块配置
这里我们通过eclipse来快速创建maven, 如果使用eclipse创建 预先要安装 M2E - Maven Integration for Eclipse 组件。
2.1 创建父工程 app-parent
点击右键New-选择Maven,选择
Maven project. 这Maven project 和 Maven Module 区别 在
project 是父工程 ,Module
是创建子工程.
group id, artifact id 这里packageing 选择 pom
2.2 创建子工程 app-service, app-dao, app-util,app-web
点击app-parent 右键
创建 maven module 子工程,这里除了app-web 选择 war, 其它类型都选择jar
几个子工程创建完后,结构目录如下所示:
3. pom.xml 配置文件
3.1 app-parent
&modelVersion&4.0.0&/modelVersion&
&groupId&com.bswan&/groupId&
&artifactId&app-parent&/artifactId&
&version&0.0.1-SNAPSHOT&/version&
&packaging&pom&/packaging&
&module&app-web&/module&
&module&app-service&/module&
&module&app-dao&/module&
&module&app-util&/module&
&/modules&
&defaultGoal&compile&/defaultGoal&
3.2 app-web
&modelVersion&4.0.0&/modelVersion&
&groupId&com.bswan&/groupId&
&artifactId&app-parent&/artifactId&
&version&0.0.1-SNAPSHOT&/version&
&artifactId&app-web&/artifactId&
&packaging&war&/packaging&
&name&app-web Maven Webapp&/name&
&url&http://maven.apache.org&/url&
&dependencies&
&dependency&
&groupId&junit&/groupId&
&artifactId&junit&/artifactId&
&version&3.8.1&/version&
&scope&test&/scope&
&/dependency&
&dependency&
&groupId&javax.servlet&/groupId&
&artifactId&javax.servlet-api&/artifactId&
&version&3.1.0&/version&
&/dependency&
&dependency&
&groupId&com.bswan&/groupId&
&artifactId&app-service&/artifactId&
&version&${project.version}&/version&
&/dependency&
&/dependencies&
&defaultGoal&compile&/defaultGoal&
&finalName&app-web&/finalName&
&groupId&org.mortbay.jetty&/groupId&
&artifactId&jetty-maven-plugin&/artifactId&
&version&8.1.8.v&/version&
&configuration&
&stopKey&stop&/stopKey&
&stopPort&5599&/stopPort&
&webAppConfig&
&contextPath&/&/contextPath&
&/webAppConfig&
&scanIntervalSeconds&5&/scanIntervalSeconds&
&connectors&
&connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector"&
&port&8080&/port&
&maxIdleTime&60000&/maxIdleTime&
&/connector&
&/connectors&
&/configuration&
&/plugins&
3.3 app-service
&modelVersion&4.0.0&/modelVersion&
&groupId&com.bswan&/groupId&
&artifactId&app-parent&/artifactId&
&version&0.0.1-SNAPSHOT&/version&
&artifactId&app-service&/artifactId&
&dependencies&
&dependency&
&groupId&com.bswan&/groupId&
&artifactId&app-dao&/artifactId&
&version&0.0.1-SNAPSHOT&/version&
&/dependency&
&/dependencies&
3.4 app-dao
3.5 app-util
4. 案例演示
案例下载地址:/blackswan/app-parent/attach_files
app-parent.zip
下载后,可以导入eclipse,也可以直接运行执行,
在app-parent目录下执行
mvn clean package -Dmaven.test.skip=true
进入 app-web
mvn jetty:run
打开浏览器访问:http://localhost:8080/
当然这个过程还有很多要调整和布置,并且一开始使用会非常别扭。导入,编译,执行都不方便,但这些都不是问题,可以在此基础上慢慢摸索.
3.相关资料
《Maven 实战》 这本书对maven很好阐述
/link?url=VDL184uo91EwqTobUjUgDe2ST8PDpAH7omMzHuz2mV7qOVYfHbMXTxMsnZjq4ogFPAYkbFOSutEb9cgRjjB8PeywojICZJwK-Ka8FtFk4F3
《Mavn最佳实践:划分模块》/blog/305865
Copyright (C) , All Rights Reserved.
版权所有 闽ICP备号
processed in 0.033 (s). 10 q(s)博客分类:
Fixflow,做中国最好的开源流程引擎!项目地址
此文章适合maven初学者或想接触maven的用户,讲的只是皮毛,高手请自觉略过。
最近一直在搞fixflow5.2的升级工作,以前只知道maven好用,但是一直没机会接触,这次由于工作需要,终于有空看下maven了。
由于以前项目使用linksource来管理项目结构,用tomcat来调试,习惯了,所以虽然决定用maven,但是还是习惯用tomcat来调试。所以就一直在网上搜maven tomcat
多web,发现都是一些转载的文章,而且都需要这插件,那插件的,感觉新手无从下手,不过几天研究下来,觉得其实网上的方案都不是我想要的,其实有更简单的,下面我就来简单说下fixflow用maven来构建多web的过程。
关于fixflow的maven结构介绍,可以参考我的另一篇博客,这也是我们这篇文章的目标。
这篇文章,我准备分3个部分来介绍:
maven多模块项目。
maven多web合并项目。
maven多web合并项目在eclipse+tomcat环境下部署和调试。
maven多模块项目
maven多模块项目需要一个父工程来聚合各个子模块,不过其实就是需要一个父pom.xml,主要作用是声明子模块,代码如下:
&module&modules/fixflow-core&/module&
&module&modules/fixflow-expand&/module&
&module&modules/fixflow-common-api&/module&
&module&modules/fixflow-common-servlet&/module&
&module&modules/fixflow-manage-servlet&/module&
&module&modules/fixflow-webapp-common&/module&
&module&modules/fixflow-webapp-taskcenter&/module&
&module&modules/fixflow-webapp-managecenter&/module&
&module&modules/fixflow-webapp-explorer&/module&
&module&modules/fixflow-converter&/module&
&module&modules/fixflow-webapp-editor&/module&
&/modules&
然后在子模块中,声明父工程,子模块中代码如下:
&groupId&com.founder.fix.fixflow&/groupId&
&artifactId&fixflow-root&/artifactId&
&version&5.0&/version&
&relativePath&../..&/relativePath&
关于多模块的文章,网上有很多,也都很详细,这里不再多说。
maven多web合并项目
多web项目合并,主要是我在网上找到的资料都不是我最终想要的效果,所以这里就介绍下我最终使用的方案,网上有很多方案都是介绍用caro插件,我到现在也不明白为什么要使用这个插件。
maven的多web模块maven-war-plugin插件的overlays属性来处理,最终主web项目pom.xml代码如下
&finalName&bpmcenter&/finalName&
&!-- 合并多个war --&
&groupId&org.apache.maven.plugins&/groupId&
&artifactId&maven-war-plugin&/artifactId&
&configuration&
&packagingExcludes&WEB-INF/web.xml&/packagingExcludes&
&overlays&
&groupId&com.founder.fix.fixflow&/groupId&
&artifactId&fixflow-webapp-taskcenter&/artifactId&
&/overlay&
&/overlays&
&/configuration&
&/plugins&
这里使用到了maven-war-plugin,用overlay属性已经足够将多web合并了,只是用的过程中需要注意以下几点:
被合并的子web项目packaging属性必须是war
被合并的子web项目,必须在主项目中添加依赖关系。
被合并的子web项目中,如果没有web.xml,则需要在pom.xml中声明
&finalName&fixflow-webapp-editor&/finalName&
&groupId&org.apache.maven.plugins&/groupId&
&artifactId&maven-war-plugin&/artifactId&
&configuration&
&failOnMissingWebXml&false&/failOnMissingWebXml&
&/configuration&
&/plugins&
做完以上几点,多web项目合并就基本上做完了,运行mvn install就会发现打出的war包中已经存在了其他子模块的项目。
多web项目在eclipse+tomcat环境下部署调试
在eclipse里面使用,其实更简单,只是网上的说法太复杂了而已,对于习惯了tomcat开发的用户来说。
对于maven项目,一个环境到另一个环境应该只有pom.xml文件和src文件夹就够了,其他都是用户根据自己的环境来做的。
打开eclipse,修改本地maven仓库地址,导入maven项目,等待构建结束。
创建server,打开window-prefrences-server-runTime Environment-new ....选择tomcat路径,jdk信息,这一步和原来完全一样。
打开server视图,new server,这里选中刚才创建的tomcat,点击next,这步只需要主web项目添加进来即可。
双击创建的server,选择将项目发布到tomcat的webapps目录下,点击pushlish,完成。
再去tomcat目录,发现已经将合并后的web发布到对应目录下了。引用的其他Java项目已经被打包成jar发布到lib下了,不过你可以打个断点试试,依然可以调试,修改一段代码,发现热部署也是可以的,这样就和原来的开发习惯完全一样了。
细心的用户会发现,其实这完全和我们原来的构建,部署方式完全一样,是的,maven没有那么复杂,m2eclipse maven plugin已经帮我们做好了太多的事情,maven只会让我们项目之间的迁移更方便,更简洁,这也是我喜欢上maven的重要原因。
我是一个绝对的maven新手,上面的文章用的也只是maven的皮毛而已,maven更多的构建功能还需要深入去研究,上面文章只是想告诉那些想尝试maven的新手,其实maven不但对代码管理带来了很大的方便,而且完全可以不改变我们原有的开发习惯。所以,尽情的拥抱maven吧!
浏览: 39389 次
fixflow项目为什么就停了呢
我就想知道,这个项目还有人在维护吗?
大哥,看到你这篇文章,就像看到了一盏指路的明灯,可惜结果svn ...
大哥,看到你这篇文章,就像看到了一盏指路的明灯,可惜结果svn ...
6.0版本什么时候出稳定版啊?现在项目中使用6.0的,没问题吧 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'20:39 提问
(求助帖)模块化的Maven项目怎么自定义的选择模块打包?
我想给模块化的Maven项目打包,怎么样才能通过自定义的选择多个模块来打包。不通过模块的依赖关系而是自己自定义的去选择模块。
按赞数排序
首先即使是自定义的模块如果有依赖关系也需要打包进去,不然项目会应为缺少jar包而无法启动;
其次,自己定义去选择模块也可以通过pom.xml文件进行配置,不需要的可以去掉,只选择需要的,然后通过maven命令进行打包即可。
谢谢你的回答,
我在打包的时候想通过Goals里配置-Dname= 选择多个个性化的模块,但是pom.xml里对应的${name}只有一个,怎样能通过配置Goals里属性把多个个性化模块也一起打包进去?org.codehaus.mojobuild-helper-maven-plugin1.7add-sourcegenerate-sourcesadd-sourcesrc/main/java${name}/src/java
上面代码有点乱,看这里
&groupId&org.codehaus.mojo&/groupId&
&artifactId&build-helper-maven-plugin&/artifactId&
&version&1.7&/version&
&executions&
&execution&
&id&add-source&/id&
&phase&generate-sources&/phase&
&goal&add-source&/goal&
&configuration&
&source&src/main/java&/source&
&source&${name}/src/java&/source&
&/sources&
&/configuration&
&/execution&
&/executions&
其他相关推荐9212人阅读
研究成果(42)
开发技巧(9)
团队开发(1)
本文出处:http://blog.csdn.net/chaijunkun/article/details/,转载请注明。由于本人不定期会整理相关博文,会对相应内容作出完善。因此强烈建议在原始出处查看此文。这两天一直在整理一些旧的代码,将原来的混乱东西升级到maven管理。这其中也免不了将大项目拆分成若干个module来管理。然而为了在测试的时候图省事,在各个模块都引用的基础module中src/test/java中建立了一个BaseTest,package net.csdn.blog.chaijunkun.
import org.junit.T
import org.junit.runner.RunW
import org.springframework.test.context.ContextC
import org.springframework.test.context.junit4.SpringJUnit4ClassR
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations=&classpath:applicationContext*.xml&)
public abstract class BaseTest {
public abstract void doTest();
}然后我希望其它module中的所有单元测试类都继承自BaseTest,规范化代码。然而,在执行测试时出现了NoClassDefFoundError: net/csdn/blog/chaijunkun/util/BaseTest。引入公共单元的src/main/java代码都能正常加载。经过参考一些Maven的资料得知,其工作机制实际上是包的依赖管理。在规定的标准目录下,能够在模块之间引用的代码只能存在于main目录下。而单元测试(test目录下的代码)模型是建立在“独立”的思想之上的,目的就是不受其他环境的干扰从而纯粹地验证自身模块的可用性和正确性。因此单元测试代码之间是不能被其他模块引用的。将其他模块的单元测试代码解除src/test/java级引用后,项目成功build。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1139130次
积分:8731
积分:8731
排名:第2391名
原创:63篇
转载:12篇
评论:550条
【我是谁】:一个有点文艺范的软件工程师
【怎么交流】:如有疑问,请在相关文章后提出问题或私信给我,我基本每天都上线
在CSDN代码库中我将分享比较完整的代码示例和开源项目,欢迎大家fork或向我索取commit权限
阅读:17469}

我要回帖

更多关于 maven 模块之间的依赖 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信