Eclipse 构建Maven项目

来源:互联网 发布:淘宝拍卖车辆靠谱吗 编辑:程序博客网 时间:2024/05/17 23:54

最近在接手一个使用maven构建的Java Web项目,项目不大,但是分层非常细,项目分成五个小maven项目构建:core,domain,dao,biz,manager。在pop.xml中配置依赖关系。

接着给我产生的问题就来了:

1,web里面打开五个工程,每个工程里面都是maven的结构,感觉要寻找一个类挺累,左边树状导航栏基本上用不着了。

[html] view plain copy
  1. 项目结构  
  2. --core  
  3.   |--java(公共类)  
  4.   |--resources(公共配置文件,集成定时器其他公共包)  
  5. --domain  
  6.   |--java  
  7.      |--功能A实体BEAN  
  8.      |--功能B实体BEAN  
  9.      |--功能C实体BEAN  
  10. --dao  
  11.   |--java  
  12.      |--功能A数据操作  
  13.      |--功能B数据操作  
  14.      |--功能C数据操作  
  15. --biz  
  16.   |--java  
  17.      |--功能A业务  
  18.      |--功能B业务  
  19.      |--功能C业务  
  20. --manager  
  21.   |--java  
  22.      |--功能A请求  
  23.      |--功能B请求  
  24.      |--功能C请求  
  25.   |--resources  
  26.      |--配置文件A  
  27.      |--配置文件B  
  28.      |--配置文件C  
  29.   |--webapps  
  30.      |--页面A  
  31.      |--页面B  
  32.      |--页面C     

2,当部署manager项目时,会把biz,dao,domain,core都打包成一个标准的jar包,但在开发环境中,每次重新在Servers上Publishs项目,此时另外几个项目的jar包也会拷贝到lib里面,这样在调试时,代码会进入class文件,而不进入源码。


试想的解决方案:

1,因项目太乱,在开发中只保留manager项目,其他项目把src/main/Java和src/main/resources引入到manager的claaapath下,引入绝对路径,这样就可以关闭掉其他工程,使项目整洁。

2,按网上的方法,把manager项目改成Dynamic Web Module,配置好相关信息,把工程所有信息编译到src/main/webapp下面。


总结(两个月后):

今天本来是想给这篇文章添加一个使用命令的, 但是发现现在对maven已经截然不同,所以准备从头开始记录下,并结合目前的理解解答下之前自己的疑问。


一、前言

在大型项目中,版本管理和持续集成是关键,特别是在盛行敏捷开发的年代,每个月一个常规版本是必须的,平均起来质量好点的项目平均起来不要高于20天一个发型版本(紧急版本),maven的主要功能是管理构建每个版本的jar包、war包。项目架构越优模块化,就越能发扬版本迭代的优势。举个例子:以前我们做一个维护了七八年的大型mis系统(Management Information System),整个项目装到eclipse里面就一个工程,打开就巨卡,左边导航栏基本上是摆设,启动一下程序得花十分钟。所有的开发人员(大概50人)都在上面开发(七八个小组),每个月一个常规版本,我们成为常规分支,因为每个组的交付功能时间不同,所以不能走常规版本的小组便会申请一个分支。一般线上都会不少于8个分支,平均一周不到就发行一个分支版本(当时是用svn管理).

[html] view plain copy
  1. --主分支  
  2. --常规分支  
  3. --特殊分支1(teamA,teamB,teamC同时修改)  
  4. --特殊分支2  
  5. --特殊分支3  
  6. --特殊分支4  
  7. --XXX...  
举个例子,下一个版本是发布特殊分支1的,这个分支上可能主要是发布teamA的功能,但是teamB和teamC也趁机修复了两个漏洞或补了两个小功能。发布完成之后,该分支会合到所有可用的其他分支里面(这个应该好理解,如下次发布特殊分支2的代码,但是特殊分支2上没有teamA、teamB、teamC的代码啊)。此时就可能会造成teamB和tearmC的代码和其他分支有冲突,所以第二天你来上班更新代码后,突然发现代码里面好多冲突,咋一看,都不是自己改的~~,当时就傻眼的,只能等别人先解决了冲突再启动程序进行编码测试(一般小半天就没了)

如果换成maven的模块化管理,六七个小组分成不同的模块工程,每个小组只需要下载自己需要修改的模块和相应的依赖模块(公共包或者核心包)。每个团队在发布完成之后再把自己的代码上传到私服(一般用于管理整个公司所有的模块),这样如果其他小组不需要依赖你的jar包的功能,那都可以不用更新,如需要,则再更新下maven的版本即可。也完全不会有的代码冲突的问题。

上面这个问题使用svn+lvy也是可以实现的。本人只是大致了解。

一、使用

1,maven解压即可用,将maven/bin文件夹放入PATH环境变量下。

2,eclipse集成进去maven(大部分eclise都已经集成maven,如没有可百度一下)

3,meven下面源码, 一般我喜欢把源码也下载下来:eclipse--window--Preferences--Maven页面,勾选Download Artifact Sources

4,添加自己的maven:eclipse--window--Preferences--Maven--Installations页面,点击Add按钮,添加第二步下载maven

5,添加settings文件,这个步骤比较重要。eclipse--window--Preferences--Maven--UserSettings,添加maven/conf/settings.xml

6,设置settings.xml文件,该文件是整个maven的全局设置,可以说是所有使用该maven的pom.xml文件的父类(会应用到所有管理的项目中)

[html] view plain copy
  1. <!-- 本地仓库保存的路径,本地缓存 -->  
  2. <localRepository>D:\tomcatSSO\nexus-2.13.0-01-bundle\native-repo</localRepository>  
  3. <!-- 私服:一般每个公司都会建立一个自己的私有服务仓库(私服)用于存放管理第三方jar和自己项目的jar,该设置是配置私服的地址,分为SNAPSHOP(开发人员都可上传)和RELEASE(发行版本,版本经理会项目经理才有权限上传)-->  
  4. <servers>  
  5.   <server>  
  6.     <id>helloword-snapshots</id>  
  7.     <username>deployment</username>  
  8.     <password>deployment123</password>  
  9.   </server>  
  10.   <server>  
  11.     <id>helloword-release</id>  
  12.     <username>deployment</username>  
  13.     <password>deployment123</password>  
  14. </server>  
  15. </servers>  
  16. <!-- 控制所有的jar包都需要通过制定的镜像地址下载,便于统一管理 -->  
  17. <mirrors>  
  18.   <mirror>  
  19.   <id>mirrors-nexusId</id>  
  20.   <mirrorOf>*</mirrorOf>  
  21.   <name>Nexus Mirror.</name>  
  22.   <url>http://localhost:8081/nexus/content/groups/public/</url>  
  23.   </mirror>  
  24. </mirrors>  
  25. <!-- 配置profile,类是spring的profile,可根据不同的环境:dev,sit等配置不同的profile,配置完成之后将会从激活的profile中上传下载jar包 -->  
  26. <profiles>  
  27.   <profile>  
  28.   <id>nexusProfile</id>  
  29.   <repositories>  
  30.     <repository>  
  31.       <id>nexusId</id>  
  32.       <name>Repository for nexus</name>  
  33.       <url>http://localhost:8081/nexus/content/groups/public/</url>  
  34.       <releases>  
  35.         <enabled>true</enabled>  
  36.         <updatePolicy>never</updatePolicy>  
  37.         <checksumPolicy>warn</checksumPolicy>  
  38.       </releases>  
  39.       <snapshots>  
  40.         <enabled>true</enabled>  
  41.       </snapshots>  
  42.     </repository>  
  43.   </repositories>  
  44.   </profile>  
  45. </profiles>  
  46. <!-- 激活profile -->  
  47. <activeProfiles>  
  48.   <activeProfile>nexusProfile</activeProfile>  
  49. </activeProfiles>  
7,配置pom.xml,贴一个父子POM的常用依赖

[html] view plain copy
  1. <!-- 父类POM,主要是管理jar包版本,管理子模块,设置整个模块的JDK版本,打包依赖版本,私服上传设置 -->  
  2. <?xml version="1.0" encoding="UTF-8"?>  
  3. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  5.     <modelVersion>4.0.0</modelVersion>  
  6.     <groupId>com.tate</groupId>  
  7.     <artifactId>code-all</artifactId>  
  8.     <version>0.0.3-SNAPSHOT</version>  
  9.     <packaging>pom</packaging>  
  10.     <description>tate的代码集合</description>  
  11.   
  12.     <!-- 配置配置 -->  
  13.     <properties>  
  14.         <project.version>0.0.3-SNAPSHOT</project.version>  
  15.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
  16.         <dependency.junit.version>4.9</dependency.junit.version>  
  17.         <dependency.spring.version>4.1.6.RELEASE</dependency.spring.version>  
  18.     </properties>  
  19.   
  20.     <!-- 导入模块 -->  
  21.     <modules>  
  22.         <!-- 聚合是模块的位置 -->  
  23.         <module>code-helloword-test</module>  
  24.         <module>code-spring-restful</module>  
  25.         <module>code-model</module>  
  26.         <module>code-monitor</module>  
  27.         <module>code-dubbo</module>  
  28.         <module>code-core</module>  
  29.         <module>code-core-web</module>  
  30.         <module>code-model-module</module>  
  31.     </modules>  
  32.   
  33.     <!-- Management:可让子工程集成,此处定义包的version和scope,子项目引用即可 -->  
  34.     <dependencyManagement>  
  35.         <dependencies>  
  36.             <dependency>  
  37.                 <groupId>junit</groupId>  
  38.                 <artifactId>junit</artifactId>  
  39.                 <version>${dependency.junit.version}</version>  
  40.                 <scope>compile</scope>  
  41.             </dependency>  
  42.             <!-- spring -->  
  43.             <dependency>  
  44.                 <groupId>org.springframework</groupId>  
  45.                 <artifactId>spring-core</artifactId>  
  46.                 <version>${dependency.spring.version}</version>  
  47.             </dependency>  
  48.         </dependencies>  
  49.     </dependencyManagement>  
  50.   
  51.     <!-- mvn:clear deploy配置私有仓库定义 -->  
  52.     <distributionManagement>  
  53.         <snapshotRepository>  
  54.             <id>helloword-snapshots</id>  
  55.             <name>User project SNAPSHOTS</name>  
  56.             <url>http://localhost:8081/nexus/content/repositories/snapshots/</url>  
  57.         </snapshotRepository>  
  58.         <repository>  
  59.             <id>helloword-release</id>  
  60.             <name>User project RELEASE</name>  
  61.             <url>http://localhost:8081/nexus/content/repositories/releases/</url>  
  62.         </repository>  
  63.     </distributionManagement>  
  64.   
  65.     <!-- 连接的仓库地址,此处连接的是自己的私服地址 -->  
  66.     <repositories>  
  67.         <repository>  
  68.             <id>nexusId</id>  
  69.             <name>Repository for nexus</name>  
  70.             <url>http://localhost:8081/nexus/content/groups/public/</url>  
  71.             <snapshots>  
  72.                 <enabled>true</enabled>  
  73.             </snapshots>  
  74.         </repository>  
  75.     </repositories>  
  76.   
  77.     <!-- maven build插件使用 ,添加Management供子类使用 -->  
  78.     <build>  
  79.         <pluginManagement>  
  80.             <plugins>  
  81.                 <plugin>  
  82.                     <groupId>org.eclipse.jetty</groupId>  
  83.                     <artifactId>jetty-maven-plugin</artifactId>  
  84.                     <version>9.3.5.v20151012</version>  
  85.                 </plugin>  
  86.             </plugins>  
  87.         </pluginManagement>  
  88.   
  89.         <plugins>  
  90.             <!-- 全局编译插件,解决项目刷新之后JDK默认变成1.5 -->  
  91.             <plugin>  
  92.                 <groupId>org.apache.maven.plugins</groupId>  
  93.                 <artifactId>maven-compiler-plugin</artifactId>  
  94.                 <version>3.5.1</version>  
  95.                 <configuration>  
  96.                     <encoding>UTF-8</encoding>  
  97.                     <source>1.8</source>  
  98.                     <target>1.8</target>  
  99.                     <skip>false</skip>  
  100.                 </configuration>  
  101.             </plugin>  
  102.             <plugin>  
  103.                 <!-- 插件信息,deploy源码 -->  
  104.                 <groupId>org.apache.maven.plugins</groupId>  
  105.                 <artifactId>maven-source-plugin</artifactId>  
  106.                 <version>3.0.0</version>  
  107.                 <!-- 定义怎么样执行 -->  
  108.                 <executions>  
  109.                     <execution>  
  110.                         <!-- 绑定在哪个生命周期 -->  
  111.                         <phase>generate-sources</phase>  
  112.                         <!-- 绑定在命令的哪个参数 -->  
  113.                         <goals>  
  114.                             <goal>jar</goal>  
  115.                             <goal>test-jar</goal>  
  116.                         </goals>  
  117.                     </execution>  
  118.                     <execution>  
  119.                         <id>attach-sources</id>  
  120.                         <goals>  
  121.                             <goal>jar-no-fork</goal>  
  122.                         </goals>  
  123.                     </execution>  
  124.                 </executions>  
  125.             </plugin>  
  126.         </plugins>  
  127.     </build>  
  128. </project>  
[html] view plain copy
  1. <!-- 子类POM,引入需要的依赖,配置具体的打包运行信息 -->  
  2. <?xml version="1.0" encoding="UTF-8"?>  
  3. <project  
  4.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"  
  5.     xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  
  6.     <modelVersion>4.0.0</modelVersion>  
  7.     <parent>  
  8.         <groupId>com.tate</groupId>  
  9.         <artifactId>code-all</artifactId>  
  10.         <version>0.0.3-SNAPSHOT</version>  
  11.         <relativePath>../pom.xml</relativePath>  
  12.     </parent>  
  13.     <artifactId>code-spring-restful</artifactId>  
  14.     <packaging>war</packaging>  
  15.   
  16.     <dependencies>  
  17.         <dependency>  
  18.             <groupId>com.tate</groupId>  
  19.             <artifactId>code-core</artifactId>  
  20.             <version>${project.version}</version>  
  21.         </dependency>  
  22.         <dependency>  
  23.             <groupId>org.springframework</groupId>  
  24.             <artifactId>spring-core</artifactId>  
  25.         </dependency>  
  26.     </dependencies>  
  27.   
  28.     <build>  
  29.         <plugins>  
  30.             <!-- 全局编译插件 -->  
  31.             <plugin>  
  32.                 <groupId>org.apache.maven.plugins</groupId>  
  33.                 <artifactId>maven-compiler-plugin</artifactId>  
  34.             </plugin>  
  35.   
  36.             <plugin>  
  37.                 <groupId>org.eclipse.jetty</groupId>  
  38.                 <artifactId>jetty-maven-plugin</artifactId>  
  39.                 <configuration>  
  40.                     <webApp>  
  41.                         <contextPath>/spring-restful</contextPath>  
  42.                     </webApp>  
  43.                 </configuration>  
  44.             </plugin>  
  45.         </plugins>  
  46.     </build>  
  47. </project>  

一、备注

[html] view plain copy
  1. 1,运行参数:  
  2.     clean compile: 只编译  
  3.     clean test:执行测试  
  4.     clean package:打包  
  5.     clean install:上传到本地资源库  
  6.     clean deploy:上传到maven资源服务器  
  7.     详细的执行计划:  
  8.         validate  
  9.         generate-sources  
  10.         process-sources  
  11.         generate-resources  
  12.         process-resources     复制并处理资源文件,至目标目录,准备打包。  
  13.         compile     编译项目的源代码。  
  14.         process-classes  
  15.         generate-test-sources   
  16.         process-test-sources   
  17.         generate-test-resources  
  18.         process-test-resources     复制并处理资源文件,至目标测试目录。  
  19.         test-compile     编译测试源代码。  
  20.         process-test-classes  
  21.         test     使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。  
  22.         prepare-package  
  23.         package     接受编译好的代码,打包成可发布的格式,如 JAR 。  
  24.         pre-integration-test  
  25.         integration-test  
  26.         post-integration-test  
  27.         verify  
  28.         install     将包安装至本地仓库,以让其它项目依赖。  
  29.         deploy     将最终的包复制到远程的仓库,以让其它开发人员与项目共享。   
  30. 2,项目用maven管理一般是按照分模块或者分层来建立,分小的块来构建  
  31. 3,maven中利用spring-test包进行web项目的测试  
  32. 4,上传MAVEN不受管理的公共jar包到私服,如oracle驱动包:  
  33.        安装:  
  34.    mvn install:install-file -DgroupId=com.xy.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.4.0 -Dpackaging=jar -Dfile=E:\ojdbc14.jar  
  35.        部署:  
  36.    mvn deploy:deploy-file -DgroupId=com.xy.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.4.0 -Dpackaging=jar -Dfile=E:\ojdbc14.jar -Durl=http://localhost:8081/nexus/content/repositories/thirdparty/ -DrepositoryId=helloword-snapshots  

一、注意事项

1,如清除或者修改了一些maven的依赖,发现eclipse的视图页面并没有刷新,请先project--clean一下代码,在install一下最上层父类的pom文件。

2,如mvn命令报错了,可以在mvn 命令后面加上-X查看详细信息,如:clean -Djetty.port=9091 jetty:run -X

3,maven有一个很好的学习视频,花一两天时间好好看看,基本上就能理解一大半(至少在工作中应该就是同事跟你请假maven相关问题了),丢失了打包下载的地址,自己根据下面的文件名百度一下就可以找到了:

4,之前提到的问题一:更改目录结构:

[html] view plain copy
  1. 项目结构  
  2. --core  
  3.   |--java(公共类)  
  4.   |--resources(公共配置文件,集成定时器其他公共包)  
  5. --功能A  
  6.   |--java  
  7.      |--功能A实体BEAN  
  8.      |--功能A数据操作  
  9.      |--功能A业务  
  10.      |--功能A请求  
  11.   |--resources  
  12.      |--配置文件A  
  13. --功能B  
  14.   |--java  
  15.      |--功能B实体BEAN  
  16.      |--功能B数据操作  
  17.      |--功能B业务  
  18.      |--功能B请求  
  19.   |--resources  
  20.      |--配置文件B  
  21. --功能C  
  22.   |--java  
  23.      |--功能C实体BEAN  
  24.      |--功能C数据操作  
  25.      |--功能C业务  
  26.      |--功能C请求  
  27.   |--resources  
  28.      |--配置文件C  
  29. --页面(前后端分离)  
  30.   |--webapps  
  31.      |--页面A  
  32.      |--页面B  
  33.      |--页面C   

5,断点进不了源码问题:在pom点击邮件,RUN AS--resources添加源码项目即可


转自:http://blog.csdn.net/szzt_lingpeng/article/details/51068005

0 0
原创粉丝点击