普通项目转换成maven项目(eclipse版本)
【这是开篇废话】
现在手头上有很多项目还是以前的老项目,属于很普通的那种java web项目,但是现在公司要求将所有的项目更新转换成maven项目,根据公司发出来的教程网页来转弄了两三天还是没弄出来,而且还得动用到idea这款软件。于是我自己尝试用eclipse进行转换,踩了很多坑,最终还是让我自己研究了出来,于是有了这篇文章。
【这里是前言】
- 文章内会详细说明每一步操作的流程-
- 在进行每一步操作的时候,可能会遇到一些坑,我会在相应的流程里标注出来-
【这里是所用到的工具】
1. Eclipse Version Oxygen.2 Release (4.7.2)
2. Maven Version 3.3.9
3. Java JDK Version 1.7.0_51
注:转换所用工具版本不影响实际效果
【这里开始正文】
1. 准备好需要转换的项目。
2. 新建maven项目。
3. 拷贝项目内容。
4. 重建jar包依赖。
5. 重建项目间互相的依赖。
6. 添加编译参数,检查修复项目错误。
7. 编译,打包出war文件。
8. 检查转换完成后的项目是否正常运行。
1.准备好需要转换的项目。
准备转换之前先测试好项目是否正常运行,以方便转换完成后进行测试,在这我就选择xxxx的微信项目作为演示项目。
2.新建maven项目。
再新建maven项目之前,首先要了解一下maven项目的结构,一般的maven项目结构是这样的:
|--- program-parent |-- pom.xml (pom) | |-- program-model | |-- pom.xml (jar) |-- program-api | |-- pom.xml (jar) |-- program-web | |-- pom.xml (jar) |-- web-app | |-- pom.xml (war)
所以转换的关键就是将非maven项目,通过program-parent项目将web项目和相关的模块聚合在一起。那么现在开始转换,首先新建一个maven项目xyyy-parent,选择maven-archetype-archetype:
建立完父项目之后,首先新建我们的web项目,作为我们刚刚新建的parent项目的子模块。在项目空白处右键–>New–>Maven Module,在弹出的选项卡中,Parent Project选择刚新建的到xyyy-parent项目,点击next;选择maven-archetype-webapp,然后下一步点击Finish,web项目新建完之后,我们打开web项目的pom文件,将
<packaging>jar</packaging>
修改为:
<packaging>war</packaging>
(注意:此处有坑)此时可能会报出如下错误:
Project build error: 'packaging' with value 'jar' is invalid. Aggregator projects require 'pom' as packaging.
此时我们打开parent项目中的pom文件,将文件中的
<packaging>jar</packaging>
改为:
<packaging>pom</packaging>
然后再次选择到parent项目即可。
继续新建其他的几个依赖项目,在项目空白处右键–>New–>Maven Module,操作和web项目的新建一致,只是这里的Archetype选择maven-archetype-archetype即可。
这几个项目新建好之后,我们查看parent项目中的pom文件,发现pom文件中多了这么一段内容:
<modules>
<module>xyyy-wechat</module>
<module>xyyy-wechat-model</module>
<module>xyyy-wechat-api</module>
<module>xyyy-wechat-web</module>
</modules>
这就说明我们刚新建的子项目作为父项目的模块已成功添加到了相应的pom文件中了。整个项目完成重建之后的结构如下,如果相应的src/main/java或者src/main/resources缺失的话,自己新建资源文件夹即可:
3.拷贝项目内容。
将旧项目的内容原封不动的拷贝至刚刚新建的maven项目中,注意,java的代码要拷贝至maven项目中的src/main/java下,xml和properties配置文件要拷贝至src/main/resources目录下,WebContent的内容拷贝到webapp目录下。拷贝完成后效果如下:
看到了一堆红叉不用管,我们接下来就是要处理这一堆红色的报错。
4.重建jar包依赖
新建完maven项目并把代码拷贝过去之后,项目左下角会出现红色的x,这是因为找不到引用的class类,也就是jar包缺失所导致的。现在我们开始重建旧项目的jar包依赖,把以前lib目录中有的jar包依赖全都添加到parent项目的pom文件里面(注意,只需要添加到parent项目中即可),具体操作我就不多废话,pom.xml文件里面如何添加依赖大家都知道。在pom文件中添加好依赖之后检查一下Maven Dependency里面的jar包和旧项目lib文件夹里的jar包是否有缺失,没缺失即可,此步骤完成(有缺失的话后期自己再往pom文件里加就行了)。
* 5. 重建项目间互相的依赖。*
添加完jar包的依赖之后,web项目里一般是不会再出现报错了,但是其他的项目仍然有可能报错的,这是项目之间还没有关联起来。我们直接将各个项目之间的关联修复,首先查看之前项目之间的关联,可以在旧项目上右键–>Properties–>Java Build Path–>Project选项卡查看项目所关联的其他项目,例如我整理的api项目是需要依赖model项目的,如图:
那么我们就需要将该项目的model子项目作为api子项目的依赖,添加到api项目的pom.xml文件中,代码如下:
<dependency>
<groupId>com.ucmed</groupId>
<artifactId>xyyy-wechat-model</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
其他的项目也是如此操作,将各个子项目直接的互相依赖建立起来,此操作完成。
6. 添加编译参数,检查修复项目错误。
上述操作全部完成后,会发现项目中的JRE System Library的版本是J2SE-1.5,并不是我们的电脑上安装的jdk版本,jdk1.5的版本会导致一个问题,项目中实现了接口的类,方法上面加上@Override会提示报错,这是jdk版本所导致,jdk1.6以上的版本就不会有此类问题。因为我需要编译出jdk1.7的版本,因此需要在每个项目的pom.xml文件中加上如下代码:
<!-- 编译等级和版本号 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
这段代码声明的是编译的源jdk和目标jdk版本,还有maven编译插件的版本号,我用的3.7.0是最新的版本,如果想用其他版本的可以自己去maven仓库找;
然后确认自己的servlet-api版本和web.xml文件声明的web-app版本是否一致,此处我的servlet-api版本用的是3.0.1,web-app版本是3.0,两者都为3.0。
这几步完成后在maven项目右键–>Maven–>Update Project更新一下maven的项目配置。update操作完成后,就会发现JRE System Library的版本变成了我们声明的1.7,并且在web项目右键–>Properties–>Project Facets,在右侧看到Dynamic Web Moudle版本为3.0,与之前的servlet和web-app的版本保持一致就没问题了。
此时有个坑,就是可能会出现找不到servlet相关类的问题。注意,其实大部分情况下并不是servlet的jar包缺失导致的,而是没有添加tomcat的运行环境,那么我们把环境加上再看看报不报错,在web项目右键–>Properties–>Java Build Path–>Libraries,点击右侧的Add Library,选择Server Runtime,点击next,然后选择你电脑上安装的Tomcat,点击Finish,然后点击Apply,此时eclipse会自动帮你重建项目,重建完成之后就不会再报servlet相关的类找不到的错误了。
此时基本上maven项目的转换就完成了,记得操作完之后在parent项目右键–>Maven–>Update Project更新一下,勾选上Offline和Force Update of Snapshots/Releases, 一般来说走到这一步都不会再有什么错误了。然后就是之后的编译与测试阶段。
7. 编译,打包出war文件。
这一步相对来说比较简单,在parent项目(注意!是parent项目不是web项目!)的pom文件上右键–>Run As–>选择第二个Maven build,在弹出来的对话框中Goals栏输入clean install -X命令,然后点击Run,maven就会开始帮你编译项目,因为加了-X指令,所以会输出debug日志,更便于我们查看编译的进程以及相应的问题所在。(如果clean install -X提示命令不对的话,就输入mvn clean install -X再试试,因为我的是新版本eclipse,所以自动帮我添加了mvn,老版本我没尝试过)
然后就是熟悉的console界面输出日志了,等着编译,一般来说不会有问题,如果有问题那就看输出的日志然后百度去填好这个坑吧….出现下面这个界面则为编译成功了。
8. 检查转换完成后的项目是否正常运行。
好了,到此转换的操作就全部完成了,并且打出了war包,我们来试试项目是否能够正常运行,我们找到打出来的war包,展开parent项目–>xyyy-wehat—>target下面有个xyyy-wechat.war的文件,这就是我们项目的war包了,复制出来。
然后改名为ROOT.war,丢到tomcat里面去运行,这一步不说了,然后输入127.0.0.1:8080,试试项目有没有正常运行起来。
ok,一切正常,项目正常跑了起来,转换完成,此教程到此完成,期间是真的遇到了很多的坑,还是需要自己研究才爬出来,但是大致的思路就是这样子了。弄了大概一个星期的转换,转成功了也是挺开心的。
9.一些坑和相应的解决方案
这里放一些我遇到的坑和相应的解决方案还有我参考的一些文章,我就放到这里了,如果你们也遇到了和我一样的问题,可以参考下我放出来的网址:
1.maven结构:
http://juvenshun.iteye.com/blog/305865
2.Could not find artifact:
http://blog.csdn.net/evan_leung/article/details/50658947
3.jre版本以及web.xml文件:
http://blog.csdn.net/peng_hong_fu/article/details/53584104
4.Maven异常:Could not find artifact
http://blog.csdn.net/evan_leung/article/details/50658947
5.编译时遇到xxxx not found,但是实际有依赖:
clean项目或者移除依赖再添加