- 浏览: 1843859 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (665)
- 闲话 (17)
- ruby (1)
- javascript (40)
- linux (7)
- android (22)
- 开发过程 (11)
- 哥也读读源代码 (13)
- JVM (1)
- ant (2)
- Hibernate (3)
- jboss (3)
- web service (17)
- https (4)
- java基础 (17)
- spring (7)
- servlet (3)
- 杂记 (39)
- struts2 (10)
- logback (4)
- 多线程 (2)
- 系统诊断 (9)
- UI (4)
- json (2)
- Java EE (7)
- eclipse相关 (4)
- JMS (1)
- maven (19)
- 版本管理 (7)
- sso (1)
- ci (1)
- 设计 (18)
- 戒烟 (4)
- http (9)
- 计划 (4)
- HTML5 (3)
- chrome extensions (5)
- tomcat源码阅读 (4)
- httpd (5)
- MongoDB (3)
- node (2)
最新评论
-
levin_china:
勾选了,还是找不到
用spring annotation声明的bean,当打包在jar中时,无法被扫描到 -
GGGGeek:
我用的maven-3.5.0,还没有遇到这种情况,使用jar ...
用spring annotation声明的bean,当打包在jar中时,无法被扫描到 -
GGGGeek:
受益匪浅,从组织项目结构,到技术细节,讲的很到位,只是博主不再 ...
一个多maven项目聚合的实例 -
Aaron-Joe-William:
<?xml version="1.0" ...
hibernate逆向工程 -
li272355201:
http://archive.apache.org/dist/ ...
tomcat源码阅读(一)——环境搭建
本文介绍一个多maven项目的实例demo,展示了聚合、继承、工程依赖、单元测试、多war聚合、cargo发布等场景
一、工程介绍
该项目由5个maven项目组成
task-aggregator是父工程,同时承担聚合模块和父模块的作用,没有实际代码和资源文件
task-common是基础工程,里面是公共的代码
task-sla是某一个业务子模块,不包含web内容
task-sla-web是某一个web子模块
task-web-dist是最外围的web工程,聚合多个web工程,形成最终的war包
依赖关系是:task-common <-- task-sla <-- task-sla-web <-- task-web-dist
二、task-aggregator
这个工程是起到聚合作用,并充当parent pom,所以没有任何实际代码和资源文件。我这里选择了平行结构,另外一种方式是树形结构,我个人感觉平行结构看起来更舒服一点
下面是pom,有所简化:
基本上是一目了然,只是有几点注意下:
1、这里配置了<distributionManagement>,这样子项目就不需要重复配置了
2、通过<pluginManagement>,对一些插件进行了公共的配置,这里主要是为了消除构建时的告警
3、配置tools,是因为实际中发现,其他开发人员从svn上check out工程以后,有的人会报错,找不到tools.jar,这样配置以后就好了
三、task-common
该工程是公共工程,提供了项目中的公共代码,这里只包括了通用的DAO组件,作为示例。
该工程不依赖任何其他工程
该工程里有几点要点:
1、在代码内部用了Spring的注解
这里用到了@Autowired注解,所以最终形成的war包,必须在spring配置文件中声明HibernateTemplate类型的bean,否则会报错
我这里用的maven环境是maven3.0.4,这个版本打出的jar包,带有Directory Entries信息,所以spring的注解即使在jar包中也可生效,如果是比较老的版本,spring的注解在jar包中不好用,关于这个问题的详细描述,见另外一篇博客:http://kyfxbl.iteye.com/blog/1675368
2、单元测试的写法
这里用到了几个注解,@RunWith是为了在spring容器环境下跑这个单元测试类,以支持依赖注入。@ContextConfiguration是声明spring配置文件的位置。@Transactional注解之后,在单元测试方法中的事务会自动回滚,这个比较方便,这样在前面执行的方法,不会对后面的方法造成影响
这个单元测试类,可以直接在maven里跑起来,让我比较惊喜。之前这样写,在ant里跑没有成功,可能是我没有找到合适的插件的原因
3、除了测试的java代码之外,还有3个资源文件,都是放在src/test/resources下,这些资源文件只在test阶段生效,package阶段不会被打包,也就是专门供测试阶段使用
这个各有利弊,优点是测试的配置文件与开发的配置文件隔离,互不干扰。缺点是配置文件似乎缺少了集中放置的地点,这样如果多个maven工程都需要跑单元测试,要共享测试用配置文件,比较麻烦一点
不过从我个人来看,也算是利大于弊。只是在每个maven项目下,都需要独立的测试相关资源文件,其实也有利于分别修改
另外,可以看到这里的hibernate映射文件,不是和model类放在一个package下,而是放在resources目录下的,这样做可以避免一些潜在的问题,也有利于后续的聚合
4、pom文件没有什么特别的,只是要引入<scope>为test的junit和spring-test
四、task-sla
该工程依赖task-common(因为用到了GenericDAO),是某一个业务模块的逻辑部分,包含了数据库访问层和业务逻辑层,但是不包括web相关的部分
这里没有什么特别要注意的,目录结构和task-common基本一样。比较特别的是可以看到Maven Dependencies里,有一个task-common工程,所以task-common里的任何修改,都可以第一时间在这个工程里体现出来,是比较方便的
关于这个问题,见另外一篇博客:http://kyfxbl.iteye.com/blog/1679806
另外就是前面说过的,hibernate的映射文件,应该放在src/main/resources下,而不是与Model类放在一起
五、task-sla-web
这个工程是上述task-sla工程的web层,依赖于task-sla,由于task-sla又依赖task-common,所以这个工程最终会同时依赖task-common和task-sla
然后这个工程里包含了web层的东西,包括Action类、jsp、图片、struts2的配置文件等,这些东西放在web工程里是最合适的
这里需要注意2点:
1、这个工程的packaging类型是war,而不是jar。但是最终它不会独立打出war包来,其src/main/webapp里的所有文件,都会被最外围的task-web-dist工程聚合成一个总的war
2、这个工程的WEB-INF目录下,没有web.xml(有也没用,最终会被覆盖)。默认情况下,packaging类型为war的项目,如果没有web.xml,则构建会失败,因此需要在pom里做一个配置
该项目的pom如下,省略了依赖部分:
上面的<failOnMissingWebXml>,就是配置缺少web.xml也不使构建失败
六、task-web-dist
这个工程是最外围的web工程,起到聚合的作用,即把所有的web项目,打成最终的war包。同时,在这个工程里,放置里公共的配置文件,比如struts.xml、ssoconfig.properties等
这个工程的聚合意图十分明显,比如struts.xml
提供了项目通用的配置,并把各子项目的struts2配置文件聚合起来。war包中的web.xml也是在这里提供的
下面是该工程的pom,也省略了依赖的配置:
这里主要是对maven-war-plugin和cargo-maven2-plugin这2个插件进行了配置,以起到聚合war,以及通过cargo启动容器的作用
关于多war聚合,以及cargo,见另外2篇博客:http://kyfxbl.iteye.com/blog/1678121、http://kyfxbl.iteye.com/blog/1677608
七、启动构建
在task-aggregator目录下,执行mvn clean deploy或者mvn clean install,就可启动整个构建过程,并将容器启动起来,跑最终生成的war包
有没有泄露机密,如果你看完了帖子,又知道maven的话,自然会有判断
建议你看帖子还是看内容,不用太关注涂黑不涂黑什么的。既然被涂黑,自然说明不重要。你看片的时候也关注马赛克吗?
我只是开个玩笑,你没必要这么认真。文章很好,我很有所得
呵呵,兄弟,我知道你没有恶意。但是这不是可以开玩笑的事。你也是职业人,肯定也知道泄露公司机密不是好玩的
有没有泄露机密,如果你看完了帖子,又知道maven的话,自然会有判断
建议你看帖子还是看内容,不用太关注涂黑不涂黑什么的。既然被涂黑,自然说明不重要。你看片的时候也关注马赛克吗?
我只是开个玩笑,你没必要这么认真。文章很好,我很有所得
有没有泄露机密,如果你看完了帖子,又知道maven的话,自然会有判断
建议你看帖子还是看内容,不用太关注涂黑不涂黑什么的。既然被涂黑,自然说明不重要。你看片的时候也关注马赛克吗?
哦,这样啊,那我明白了
最终打成的.war里,配置文件应该只有一份(多了是错的)。公共的可以放在project-web-dist里,或者project-common里。子工程特有的配置文件放在自己的src/main/resources里。最后打包之后,都会出现在WEB-INF/classes里面
但是你现在说的是每个子工程自己做单元测试需要的配置文件。那这种情况下,我建议就把配置文件复制多份放在各自的子工程里就好了
这个没有问题,因为不是在src/main/resources下,而是src/test/resources下面,即使你有多份重复的配置文件,也不会影响部署,只会在单元测试的时候用到
而且我觉得这样也是有道理的。因为项目拆分成多个子工程以后,一般子工程就是由单独的人或者小组来维护了,自己维护自己的单元测试配置文件,比多个小组共用一份要方便。你现在因为是自己一个人开发,会觉得重复了;但是在多人开发的场景下,不共享配置文件或许是更合理的
谢谢你的回复,可能我不够明白,我再补充一下,我的子工程多为jar,我的子工程同样需要单元测试,这样的话,子工程src/main/resources目录下,就有hibernate+spring的配置文件,甚至还有log4j的配置文件,我考虑的是,这种子工程能否引用别的项目下的配置文件,比如war项目中的配置文件,因为配置文件都大同小异。我的期望是所有的模块共享一份配置文件,而不是每个module都存有一份。
你分析的有道理,不过奇怪的是jar型子项目编译又没问题,即便父项目没有install到本地
一、工程介绍
该项目由5个maven项目组成
task-aggregator是父工程,同时承担聚合模块和父模块的作用,没有实际代码和资源文件
task-common是基础工程,里面是公共的代码
task-sla是某一个业务子模块,不包含web内容
task-sla-web是某一个web子模块
task-web-dist是最外围的web工程,聚合多个web工程,形成最终的war包
依赖关系是:task-common <-- task-sla <-- task-sla-web <-- task-web-dist
二、task-aggregator
这个工程是起到聚合作用,并充当parent pom,所以没有任何实际代码和资源文件。我这里选择了平行结构,另外一种方式是树形结构,我个人感觉平行结构看起来更舒服一点
下面是pom,有所简化:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <!-- 定义公共变量 --> <properties> <spring.version>3.1.0.RELEASE</spring.version> <struts2.version>2.3.1</struts2.version> <hibernate.version>3.2.7.ga</hibernate.version> </properties> <modelVersion>4.0.0</modelVersion> <groupId>com.xxx.task</groupId> <artifactId>task-aggregator</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <!-- 待聚合模块 --> <modules> <module>../task-common</module> <module>../task-sla</module> <module>../task-sla-web</module> <module>../task-web-dist</module> </modules> <!-- 配置部署的远程仓库 --> <distributionManagement> <snapshotRepository> <id>nexus-snapshots</id> <name>nexus distribution snapshot repository</name> <url>http://10.78.68.122:9090/nexus-2.1.1/content/repositories/snapshots/</url> </snapshotRepository> </distributionManagement> <build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.6</version> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.5.1</version> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </pluginManagement> </build> <dependencyManagement> <dependencies> <dependency> <groupId>com.sun</groupId> <artifactId>tools</artifactId> <version>1.6.0</version> <scope>system</scope> <systemPath>${env.JAVA_HOME}/lib/tools.jar</systemPath> </dependency> </dependencies> </dependencyManagement> </project>
基本上是一目了然,只是有几点注意下:
1、这里配置了<distributionManagement>,这样子项目就不需要重复配置了
2、通过<pluginManagement>,对一些插件进行了公共的配置,这里主要是为了消除构建时的告警
3、配置tools,是因为实际中发现,其他开发人员从svn上check out工程以后,有的人会报错,找不到tools.jar,这样配置以后就好了
三、task-common
该工程是公共工程,提供了项目中的公共代码,这里只包括了通用的DAO组件,作为示例。
该工程不依赖任何其他工程
该工程里有几点要点:
1、在代码内部用了Spring的注解
public abstract class GenericDAO<T> implements IGenericDAO<T> { private Class<T> entityClass; public GenericDAO(Class<T> clazz) { this.entityClass = clazz; } @Autowired private HibernateTemplate hibernateTemplate; }
这里用到了@Autowired注解,所以最终形成的war包,必须在spring配置文件中声明HibernateTemplate类型的bean,否则会报错
我这里用的maven环境是maven3.0.4,这个版本打出的jar包,带有Directory Entries信息,所以spring的注解即使在jar包中也可生效,如果是比较老的版本,spring的注解在jar包中不好用,关于这个问题的详细描述,见另外一篇博客:http://kyfxbl.iteye.com/blog/1675368
2、单元测试的写法
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:spring-test.xml") @Transactional public class GenericDAOTest { @Autowired private IBookDAO bookDAO; @Test public void testInsert() { Book book = new Book(); book.setName("thinking in java"); book.setIsbn("111"); bookDAO.insert(book); } }
这里用到了几个注解,@RunWith是为了在spring容器环境下跑这个单元测试类,以支持依赖注入。@ContextConfiguration是声明spring配置文件的位置。@Transactional注解之后,在单元测试方法中的事务会自动回滚,这个比较方便,这样在前面执行的方法,不会对后面的方法造成影响
这个单元测试类,可以直接在maven里跑起来,让我比较惊喜。之前这样写,在ant里跑没有成功,可能是我没有找到合适的插件的原因
3、除了测试的java代码之外,还有3个资源文件,都是放在src/test/resources下,这些资源文件只在test阶段生效,package阶段不会被打包,也就是专门供测试阶段使用
这个各有利弊,优点是测试的配置文件与开发的配置文件隔离,互不干扰。缺点是配置文件似乎缺少了集中放置的地点,这样如果多个maven工程都需要跑单元测试,要共享测试用配置文件,比较麻烦一点
不过从我个人来看,也算是利大于弊。只是在每个maven项目下,都需要独立的测试相关资源文件,其实也有利于分别修改
另外,可以看到这里的hibernate映射文件,不是和model类放在一个package下,而是放在resources目录下的,这样做可以避免一些潜在的问题,也有利于后续的聚合
4、pom文件没有什么特别的,只是要引入<scope>为test的junit和spring-test
四、task-sla
该工程依赖task-common(因为用到了GenericDAO),是某一个业务模块的逻辑部分,包含了数据库访问层和业务逻辑层,但是不包括web相关的部分
这里没有什么特别要注意的,目录结构和task-common基本一样。比较特别的是可以看到Maven Dependencies里,有一个task-common工程,所以task-common里的任何修改,都可以第一时间在这个工程里体现出来,是比较方便的
关于这个问题,见另外一篇博客:http://kyfxbl.iteye.com/blog/1679806
另外就是前面说过的,hibernate的映射文件,应该放在src/main/resources下,而不是与Model类放在一起
五、task-sla-web
这个工程是上述task-sla工程的web层,依赖于task-sla,由于task-sla又依赖task-common,所以这个工程最终会同时依赖task-common和task-sla
然后这个工程里包含了web层的东西,包括Action类、jsp、图片、struts2的配置文件等,这些东西放在web工程里是最合适的
这里需要注意2点:
1、这个工程的packaging类型是war,而不是jar。但是最终它不会独立打出war包来,其src/main/webapp里的所有文件,都会被最外围的task-web-dist工程聚合成一个总的war
2、这个工程的WEB-INF目录下,没有web.xml(有也没用,最终会被覆盖)。默认情况下,packaging类型为war的项目,如果没有web.xml,则构建会失败,因此需要在pom里做一个配置
该项目的pom如下,省略了依赖部分:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <parent> <groupId>com.xxx.task</groupId> <artifactId>task-aggregator</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../task-aggregator</relativePath> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>task-sla-web</artifactId> <packaging>war</packaging> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> </plugins> </build> <!-- 配置依赖 --> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </dependency> </dependencies> </project>
上面的<failOnMissingWebXml>,就是配置缺少web.xml也不使构建失败
六、task-web-dist
这个工程是最外围的web工程,起到聚合的作用,即把所有的web项目,打成最终的war包。同时,在这个工程里,放置里公共的配置文件,比如struts.xml、ssoconfig.properties等
这个工程的聚合意图十分明显,比如struts.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.objectFactory" value="spring" /> <constant name="struts.ui.theme" value="simple" /> <constant name="struts.i18n.encoding" value="UTF-8" /> <constant name="struts.action.extension" value="action" /> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="true" /> <include file="struts2/struts-sla.xml" /> </struts>
提供了项目通用的配置,并把各子项目的struts2配置文件聚合起来。war包中的web.xml也是在这里提供的
下面是该工程的pom,也省略了依赖的配置:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <parent> <groupId>com.xxx.task</groupId> <artifactId>task-aggregator</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath>../task-aggregator</relativePath> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>task-web-dist</artifactId> <packaging>war</packaging> <build> <finalName>task</finalName> <plugins> <!-- 合并多个war --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <packagingExcludes>WEB-INF/web.xml</packagingExcludes> <overlays> <overlay> <groupId>com.huawei.inoc.wfm.task</groupId> <artifactId>task-sla-web</artifactId> </overlay> </overlays> </configuration> </plugin> <!-- 利用cargo启动容器 --> <plugin> <groupId>org.codehaus.cargo</groupId> <artifactId>cargo-maven2-plugin</artifactId> <version>1.2.3</version> <configuration> <container> <containerId>tomcat7x</containerId> <home>D:\apache-tomcat-7.0.29</home> </container> <configuration> <type>standalone</type> <home>${project.build.directory}/tomcat7.0.29</home> <properties> <cargo.jvmargs> -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8787 </cargo.jvmargs> </properties> </configuration> </configuration> <executions> <execution> <id>cargo-run</id> <phase>pre-integration-test</phase> <goals> <goal>run</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
这里主要是对maven-war-plugin和cargo-maven2-plugin这2个插件进行了配置,以起到聚合war,以及通过cargo启动容器的作用
关于多war聚合,以及cargo,见另外2篇博客:http://kyfxbl.iteye.com/blog/1678121、http://kyfxbl.iteye.com/blog/1677608
七、启动构建
在task-aggregator目录下,执行mvn clean deploy或者mvn clean install,就可启动整个构建过程,并将容器启动起来,跑最终生成的war包
评论
18 楼
kyfxbl
2013-08-06
rzy2009 写道
kyfxbl 写道
rzy2009 写道
如果这是你公司正式的项目,建议你可以写一些简单的例子,没必要再把包名之类涂上,即影响视觉,又有泄露公司机密的嫌疑
有没有泄露机密,如果你看完了帖子,又知道maven的话,自然会有判断
建议你看帖子还是看内容,不用太关注涂黑不涂黑什么的。既然被涂黑,自然说明不重要。你看片的时候也关注马赛克吗?
我只是开个玩笑,你没必要这么认真。文章很好,我很有所得
呵呵,兄弟,我知道你没有恶意。但是这不是可以开玩笑的事。你也是职业人,肯定也知道泄露公司机密不是好玩的
17 楼
rzy2009
2013-08-05
kyfxbl 写道
rzy2009 写道
如果这是你公司正式的项目,建议你可以写一些简单的例子,没必要再把包名之类涂上,即影响视觉,又有泄露公司机密的嫌疑
有没有泄露机密,如果你看完了帖子,又知道maven的话,自然会有判断
建议你看帖子还是看内容,不用太关注涂黑不涂黑什么的。既然被涂黑,自然说明不重要。你看片的时候也关注马赛克吗?
我只是开个玩笑,你没必要这么认真。文章很好,我很有所得
16 楼
kyfxbl
2013-08-03
rzy2009 写道
如果这是你公司正式的项目,建议你可以写一些简单的例子,没必要再把包名之类涂上,即影响视觉,又有泄露公司机密的嫌疑
有没有泄露机密,如果你看完了帖子,又知道maven的话,自然会有判断
建议你看帖子还是看内容,不用太关注涂黑不涂黑什么的。既然被涂黑,自然说明不重要。你看片的时候也关注马赛克吗?
15 楼
rzy2009
2013-08-03
如果这是你公司正式的项目,建议你可以写一些简单的例子,没必要再把包名之类涂上,即影响视觉,又有泄露公司机密的嫌疑
14 楼
sendreams
2013-07-29
你说的也有道理,谢谢你的回复
13 楼
kyfxbl
2013-07-28
sendreams 写道
关于消除这种重复配置的方法,以前我做net开发的时候,vs中用快捷方式来解决,也就是link的方式,实际上是引用一个文件,而不是重复拷贝一份文件,就是不懂这在maven中是否也可以这么操作。现在每个module下的src/test/resources下都有一份配置拷贝,可能只是稍有不同,但绝大部分大是相同的,如何避免这种重复?
哦,这样啊,那我明白了
最终打成的.war里,配置文件应该只有一份(多了是错的)。公共的可以放在project-web-dist里,或者project-common里。子工程特有的配置文件放在自己的src/main/resources里。最后打包之后,都会出现在WEB-INF/classes里面
但是你现在说的是每个子工程自己做单元测试需要的配置文件。那这种情况下,我建议就把配置文件复制多份放在各自的子工程里就好了
这个没有问题,因为不是在src/main/resources下,而是src/test/resources下面,即使你有多份重复的配置文件,也不会影响部署,只会在单元测试的时候用到
而且我觉得这样也是有道理的。因为项目拆分成多个子工程以后,一般子工程就是由单独的人或者小组来维护了,自己维护自己的单元测试配置文件,比多个小组共用一份要方便。你现在因为是自己一个人开发,会觉得重复了;但是在多人开发的场景下,不共享配置文件或许是更合理的
12 楼
sendreams
2013-07-28
关于消除这种重复配置的方法,以前我做net开发的时候,vs中用快捷方式来解决,也就是link的方式,实际上是引用一个文件,而不是重复拷贝一份文件,就是不懂这在maven中是否也可以这么操作。现在每个module下的src/test/resources下都有一份配置拷贝,可能只是稍有不同,但绝大部分大是相同的,如何避免这种重复?
11 楼
sendreams
2013-07-28
kyfxbl 写道
不好意思,我不太清楚你这个项目最终的部署形态是什么样的,所以给不出准确的建议
听起来你这个项目是在jetty中运行的,那我想应该是一个WEB应用,最终是打成一个.war包
那么你的子工程应该是会变成一个个.jar,放到最终的/WEB-INF/lib里的,不妨把所有的配置文件都放到比如xxx-web-dist工程的src/main/resources目录下,最终聚合以后都会在/WEB-INF/classes/下出现,这样有什么问题吗?
听起来你这个项目是在jetty中运行的,那我想应该是一个WEB应用,最终是打成一个.war包
那么你的子工程应该是会变成一个个.jar,放到最终的/WEB-INF/lib里的,不妨把所有的配置文件都放到比如xxx-web-dist工程的src/main/resources目录下,最终聚合以后都会在/WEB-INF/classes/下出现,这样有什么问题吗?
谢谢你的回复,可能我不够明白,我再补充一下,我的子工程多为jar,我的子工程同样需要单元测试,这样的话,子工程src/main/resources目录下,就有hibernate+spring的配置文件,甚至还有log4j的配置文件,我考虑的是,这种子工程能否引用别的项目下的配置文件,比如war项目中的配置文件,因为配置文件都大同小异。我的期望是所有的模块共享一份配置文件,而不是每个module都存有一份。
10 楼
kyfxbl
2013-07-28
不好意思,我不太清楚你这个项目最终的部署形态是什么样的,所以给不出准确的建议
听起来你这个项目是在jetty中运行的,那我想应该是一个WEB应用,最终是打成一个.war包
那么你的子工程应该是会变成一个个.jar,放到最终的/WEB-INF/lib里的,不妨把所有的配置文件都放到比如xxx-web-dist工程的src/main/resources目录下,最终聚合以后都会在/WEB-INF/classes/下出现,这样有什么问题吗?
听起来你这个项目是在jetty中运行的,那我想应该是一个WEB应用,最终是打成一个.war包
那么你的子工程应该是会变成一个个.jar,放到最终的/WEB-INF/lib里的,不妨把所有的配置文件都放到比如xxx-web-dist工程的src/main/resources目录下,最终聚合以后都会在/WEB-INF/classes/下出现,这样有什么问题吗?
9 楼
sendreams
2013-07-28
有一个问题还要请教,我现在用maven搭建多moudle项目,几乎每个moudle下都有hibernate和spring的配置文件,感觉重复很多,更麻烦的是,jetty在启动过程中,会自动把moudle下的配置文件引入进来,导致实际运行时,web项目使用的不是web自己的配置文件,而可能是某个moudle的配置文件,如下片段为jetty的启动信息:
ProjectClassLoader: entry=C:\Users\CHN\.m2\repository\log4j\log4j\1.2.17\log4j-1.2.17.jar
ProjectClassLoader: entry=C:\Users\CHN\Workspaces\eclipse\SBP\org.ware4u.framework\target\classes
ProjectClassLoader: entry=C:\Users\CHN\.m2\repository\com\googlecode\genericdao\dao\1.2.0\dao-1.2.0.jar
第二项就把“framework”moudle中的配置文件引入进来了。
有没有办法解决这种配置文件存放的问题?我现在的解决办法很粗暴,直接把所有的配置文件做成一样的。
ProjectClassLoader: entry=C:\Users\CHN\.m2\repository\log4j\log4j\1.2.17\log4j-1.2.17.jar
ProjectClassLoader: entry=C:\Users\CHN\Workspaces\eclipse\SBP\org.ware4u.framework\target\classes
ProjectClassLoader: entry=C:\Users\CHN\.m2\repository\com\googlecode\genericdao\dao\1.2.0\dao-1.2.0.jar
第二项就把“framework”moudle中的配置文件引入进来了。
有没有办法解决这种配置文件存放的问题?我现在的解决办法很粗暴,直接把所有的配置文件做成一样的。
8 楼
sendreams
2013-07-28
看来不能偷懒,要搭建一个私服了,看看你的文章先,实为前人种树,后人乘凉,呵呵,感谢先
7 楼
sendreams
2013-07-28
kyfxbl 写道
你没有使用私服,就是很重要的一个原因呀,呵呵
你没有私服,父工程就没有办法deploy到私服上,子工程就只能从本地获取。这就是你为什么需要install到本地的原因
一般是需要一个私服的,即使你是一个人做开发,用私服也会比较方便,呵呵,我的另一篇博客有图文介绍怎么搭建nexus私服
你没有私服,父工程就没有办法deploy到私服上,子工程就只能从本地获取。这就是你为什么需要install到本地的原因
一般是需要一个私服的,即使你是一个人做开发,用私服也会比较方便,呵呵,我的另一篇博客有图文介绍怎么搭建nexus私服
你分析的有道理,不过奇怪的是jar型子项目编译又没问题,即便父项目没有install到本地
6 楼
kyfxbl
2013-07-26
你没有使用私服,就是很重要的一个原因呀,呵呵
你没有私服,父工程就没有办法deploy到私服上,子工程就只能从本地获取。这就是你为什么需要install到本地的原因
一般是需要一个私服的,即使你是一个人做开发,用私服也会比较方便,呵呵,我的另一篇博客有图文介绍怎么搭建nexus私服
你没有私服,父工程就没有办法deploy到私服上,子工程就只能从本地获取。这就是你为什么需要install到本地的原因
一般是需要一个私服的,即使你是一个人做开发,用私服也会比较方便,呵呵,我的另一篇博客有图文介绍怎么搭建nexus私服
5 楼
sendreams
2013-07-26
终于搞定了,过程中有几项没有讲到,不过可能是因为我机器环境不一样,我没有使用私服,最终用offline命令搞定。
另外,父项目需要install到本地,否则war型子项目会编译错误,我用maven为3.0.5。
另外,父项目需要install到本地,否则war型子项目会编译错误,我用maven为3.0.5。
4 楼
kyfxbl
2013-07-26
示例工程不能发,产品不是开源的
但是这几个简化的工程已经足够示意了,可以自己照着试一下
但是这几个简化的工程已经足够示意了,可以自己照着试一下
3 楼
sendreams
2013-07-26
写的很好,最好能把示例工程一起发出来,以便学习。
2 楼
endual
2013-07-23
Maven A工程里面用到Maven B工程, Maven C工程里面用到Maven A工程。
能不能详细的帮我们写篇文章 关于 Maven 工程的管理spring mvc 和spring data jpa
能不能详细的帮我们写篇文章 关于 Maven 工程的管理spring mvc 和spring data jpa
1 楼
zbz
2013-04-23
讲得不是很清楚,可以发源码给我具体看看吗?
发表评论
-
显式指定maven插件的版本号
2013-04-18 13:21 1984maven构建行为不符合预期的一个非常常见的原因是:没有指定p ... -
maven的2个参数
2012-10-08 20:24 2381一、指定pom文件路径 mvn -f filePath 如 ... -
关于svn和maven结合使用的讨论
2012-09-26 22:30 2476目前项目组在开发一个项目,由多个子模块构成,构建工具是mave ... -
maven中的聚合与继承
2012-09-26 21:25 2960maven中的聚合和继承是2个不同的概念,虽然经常在一个父模块 ... -
解决maven工程无法获取远程仓库上的构件
2012-09-25 12:43 13618工程结构: test-aggregator test-par ... -
处理循环依赖
2012-09-19 02:31 4301在多maven工程的项目里,如果工程间存在循环依赖,构建就会报 ... -
用eclipse的m2eclipse插件,设置maven项目的依赖关系
2012-09-17 15:22 11037在使用maven之前,对于 ... -
消除maven构建时的各种告警
2012-09-17 14:29 4622告警1号: [WARNING] Using platform ... -
用overlays合并多个war
2012-09-13 20:01 26218在一个大项目中拆分maven工程时,很有可能会把js、css、 ... -
用cargo插件部署war包,并支持debug
2012-09-13 11:23 7516在eclipse里创建的web工程,可以简单地发布到eclip ... -
用nexus搭建maven私服
2012-09-12 13:08 5703首先介绍一下背景,公 ... -
《maven实战》读书笔记(四)——聚合与继承
2012-09-11 00:18 19271、聚合的写法 <proje ... -
关于maven的一些知识整理
2012-09-09 20:04 20971、构件的路径 坐标是 ... -
《maven实战》读书笔记(三)——仓库
2012-08-24 23:01 14041、maven的仓库只有2类, ... -
《maven实战》读书笔记(二)——坐标与依赖
2012-08-24 21:45 1461坐标是maven的核心概念之一,另外几个核心概念是依赖、仓库、 ... -
m2e插件的一个BUG
2012-08-22 10:32 1299用m2e插件,在eclipse里编辑pom文件很方便,因为提供 ... -
消除maven的编码字符集告警
2012-08-21 18:58 1567警告信息: [WARNING] Using platform ... -
《maven实战》读书笔记(一)
2012-08-21 18:34 14211、在windows环境下,安装完maven之后,需要配置3个 ...
相关推荐
总结来说,"maven聚合实例"展示了如何利用Maven的聚合特性来管理多模块项目,以及如何在子项目之间进行依赖和接口调用。这样的实践使得大型项目变得有序且易于维护,同时充分利用了Maven的强大功能。
总结来说,这个"Maven聚合项目"是一个集成了聚合、继承、插件管理和私服使用的实例,展示了如何高效地管理和构建多模块的Java项目。通过这种方式,开发团队可以更有效地协同工作,保证项目的稳定性和一致性。
在Java开发中,Maven聚合项目(Aggregator Project)是一种管理多模块项目的方式,它允许开发者在一个父项目中集合并构建多个子项目。这样的结构有助于代码的组织和依赖管理,特别是当项目涉及到多个独立但相互关联...
Maven 项目对象模型 Maven搭建过程 web 模块加载另外一个web模块方法 Myeclipse Maven 忽略单元测试打包 一个多maven项目聚合的实例
Maven聚合(Aggregation)功能则允许我们将多个Maven项目组合成一个单一的构建单元。通过在父POM中使用`<modules>`标签,可以列出所有子模块,Maven在构建时会按顺序编译和打包每个子模块。这在处理大型多模块项目时...
例如,如果你有一个包含多个子模块的大型应用,如web服务、数据库访问层和业务逻辑层,你可以将它们配置为一个聚合项目,使得一次构建操作就可以完成所有模块的编译、测试和打包。 例如,在`pom.xml`中,我们可以...
最后,书中还涉及到了Maven的多模块项目管理,如何将一个大型项目拆分成多个子项目,并通过聚合项目进行整体管理。这种模块化的构建方式有助于提高代码的复用性和项目的可维护性。 总的来说,《Maven权威指南开发...
1. **Maven多模块项目**:Maven支持多模块项目结构,允许将大型项目拆分为多个独立的模块,每个模块都有自己的POM.xml文件,同时这些模块又可以聚合在一个顶层的父POM中。在这个实例中,"account-parent"可能是所有...
8. **Maven的高级特性**: 如聚合项目、多模块项目、远程仓库配置等。 9. **最佳实践**: 提供在实际开发中使用Maven的经验和建议。 通过这个“MAVEN2实例与PPT教程”,学习者将能够深入了解Maven2的工作原理,掌握...
本篇文章将详细讲解如何使用MyEclipse这一集成开发环境来构建多模块的Maven项目。 首先,我们需要配置Maven的环境。确保在系统环境变量中设置了`M2_HOME`和`MAVEN_HOME`,这两个变量分别指向Maven的安装路径。例如...
Maven3_05_maven的聚合和继承 Maven3_06_复习maven的基本内容 Maven3_07_nexus的介绍和安装 Maven3_08_nexus的配置 Maven3_09_发布项目到nexus中 Maven3_10_生命周期和插件简介 Maven3_11_插件基础 Maven3_12_插件的...
Spark算子实例maven版是基于Apache Spark框架的开发示例,主要针对的是使用Maven构建项目的开发者。Apache Spark是一个用于大规模数据处理的快速、通用且可扩展的开源框架,它提供了一种分布式、内存计算的编程模型...
Maven是Apache软件基金会开发的一个开源项目,它以XML文件格式定义项目,能够自动化构建、依赖管理和项目信息管理,极大地提高了开发效率。这本书中文版的出现,对于中文读者来说,无疑提供了更方便的学习资源。 ...
对于大型项目,Maven的聚合(aggregation)功能也很有用,它可以管理多个模块间的依赖关系,形成一个多模块的项目结构。这样,一个复杂的系统可以被拆分成多个独立的子项目,每个子项目都可以独立开发和测试,最后由...
在Java开发领域,Maven是一个不可或缺的构建工具,它极大地简化了项目管理和构建过程。《Maven应用实战》这本书由杨式文和孙会军编著,提供了丰富的实践案例和详尽的解析,帮助读者深入理解并掌握Maven的使用技巧。...
在"springboot+mybaties+maven聚合+eureka+ribbon访问"的场景中,首先,我们会创建一个Maven多模块项目,每个模块代表一个微服务,使用Spring Boot和MyBatis构建业务逻辑。接着,这些微服务会向Eureka注册,提供服务...
1. **聚合项目(Aggregation)**:一个POM可以作为多个子项目的父POM,方便管理多个相关联的项目。 2. **继承(Inheritance)**:多个POM可以继承自一个父POM,共享相同的配置。 3. **依赖范围(Dependency Scope...
第11章:用Maven管理项目版本/11.4 版本管理举例/11.4.9 实例完整源代码 第12章:编写自定义插件/12.1 自定义插件的步骤 第12章:编写自定义插件/12.2 注解说明/12.2.1 @Mojo:定义插件属性 第12章:编写自定义插件/...
5. **聚合与继承**:聚合允许在一个顶级POM中管理多个子项目,而继承则可以让一个POM继承另一个POM的配置。 #### Maven高级特性 1. **使用Nexus建立私服**:Nexus是一个开源的仓库管理系统,可以帮助企业搭建私有...