您的位置:首页 > 编程语言 > Java开发

使用maven构建Spring工程的一些重点

2014-02-28 15:31 459 查看
有人喜欢把一个下载的spring3.1和struts1.3下载包里的的lib目录下所有的jar不管三七二十一全部copy到工程的WEB-INF\lib目录下,有提示需要覆盖他也就选个“ALL”。

我曾看到过一个工程,没几个JSP,CLASS,工程达287mb之大,其中286mb为jar文件,彼彼皆是log4j-1.3.8.jar,log4j-1.4.2.jar这样的重复的jar文件的存在。

有了junit3.8竟然还发觉工程里有junit4.x的包。。。晕啊。

MAVEN模式:

而使用maven构建工程时就不太会有这样的事情发生了,大家初学者可以把maven看成是一个“自动取包机”。怎么解释呢,举个例子来说:

你要装载a.jar,但a.jar依赖b.jar,而b.jar又依赖c.jar和d.jar,如果只是2,3级的依赖关系构建者可以记得住,但如果这个依赖关系达6级,7级以上时那么按照传统的构建模式当你发觉一个目录里有abcdefghijk这些个jar文件时,你一般为了避免出错总是一古脑的把所有的jar文件copy进工程,对吧?

但实际这些个jar文件里只有a.jar,b.jar, c.jar才是你需要的。

而maven干这个是它的特长,当你告诉maven你要下载a.jar文件时,它会发觉a.jar依赖于其它的jar文件,它就会把你指定的jar文件与相关的依赖文件全部拿下来,不会多拿(90%情况下)。

就好比你要拿org.springframework.web.struts-3.0.0.RELEASE.jar这个文件,但其实它还需要用到asm,collection, bean-util等,那么你只要告诉maven我要拿org.springframework.web.struts-3.0.0.RELEASE.jar这个文件,其它的依赖的相关的jar包会自动“下载”到你的工程中去.所以当我拿 maven重新去构建那个286mb的工程时,工程所有的功能一点不影响,靠着maven对jar包的自动依赖整个工程从286mb缩成了21mb,哈哈哈哈。。。。。。搞毛啊原来的那帮人在!

理解maven

请把以下几个概念记住就行了:

1) maven是通过布署在internet上的maven仓库(开源免费)去拿你需要的jar包,因此建议你因该是在一个宽带连网的环境下工作;

2) maven不是万能,有时会多拿包,当然这种情况很少但它会自动帮你把有依赖关系的包全拿到本地来的;

3) 由于maven是通过internet去拿 你需要的jar包的,因此你的工程发布可以不用再把几十mb的jar文件连同你的工程一起发布了,而只需要把一份“jar包使用清单”伴随着你的工程一起发布就可以了。当别人拿着你的maven工程时,它只要也装有maven也能连入internet环境,它就可以在布署时自动把工程需要用到的jar包取下来然后布署入j2ee服务器的。

4) 如果你所在的环境比如说一些公司不让员工上网或者让上网但不让下载的,那么这时你就需要建立自己的本地maven库,即maven私服. 把所有的jar包通过正式的手段搞到后在你所在的环境的局域网内建立一台maven服务器,把这些通过下载收集到的jar布署到你的“私服”上去,再把工程的maven连接仓库的url指向你本地的这台私服就行了。

修改settings文件

<repositories>
<repository>
<id>Ibiblio</id>
<name>Ibiblio</name>
<url>http://www.ibiblio.org/maven/</url>
</repository>
<repository>
<id>PlanetMirror</id>
<name>Planet Mirror</name>
<url>http://public.planetmirror.com/pub/maven/</url>
</repository>
</repositories>

因为maven默认的internet仓库里的文件不全,所以笔者为大家提供两个目前大家用得最多的maven的internet仓库,由其是这个lbiblio的,基本所有的开源的框架的jar文件都有提供.

继续看下去,看到proxies这段,把它放开来,改成如下内容(如果你所在的环境是通过proxy上网的),要不然请保证这段proxies为被注释.

<proxies>
<proxy>
<id>optional</id>
<active>true</active>
<protocol>http</protocol>
<username>username</username>
<password>password</password>
<host>proxy.mycompany.com</host>
<port>8088</port>
<nonProxyHosts>local.net|some.host.com</nonProxyHosts>
</proxy>
</proxies>

如果你通过的proxy需要用户名密码的话不要忘了把用户名密码也设上,如果没有用户名密码,请保持<username>为username,<password>为password。

解决包冲突,前面说了,Maven在绝大多数情况下会保证你的依赖关系没有问题,都会帮你下到本地的,但是这次我们就碰到了一个问题。

用MavenPOM Editor打开我们的pom.xml文件,切换到:DependencyHierarchy视图



我们可以看到为了满足spring-struts这个插件的应用(Spring+ Struts时用的),Maven多给我们拿 一个struts包,因此导致我们的工程中有两个struts核心包,一个是1.2.9,一个是1.3.10,由于struts1.3与struts1.2命名空间的不同,因此才产生了刚才那个狗P错误。



右键单击struts:1.2.9[compile],选ExcludeMaven Artifact后确定并保存pom.xml文件,这步操作相当于我们在原有的pom.xml文件中增加了这样的一段描述:

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-struts</artifactId>
<version>3.1.0.RELEASE</version>
<exclusions>
<exclusion>
<artifactId>struts</artifactId>
<groupId>struts</groupId>
</exclusion>
</exclusions>
</dependency>

如何让Maven构建的工程在eclipse里跑起来

但是,这个工程无法在eclipse所内嵌的tomcat里运行起来,这不便于我们的调试。一般我们开发人员都喜欢直接在eclipse里点一下server的运行,然后在eclipse里启动起我们的web工程,这样出了错也便于我们调试,而不用每次改一个jsp或者一个java就重新构建,对吧。



在eclipse里新增一个jdk的runtime



我们在这边设置的jdk把它的JREhome给定位到了JAVA_HOME\jre目录下了,而不像上面的JDK1.6我们的JREhome是定位到JAVA_HOME这一层目录的,为什么?因为在使用jasypt时,eclipse wtp有一个bug就是在eclipse内运行tomcat时,有时会认不出PBEWITHMD5ANDDES这个加密算法,它会抛一个secret key notavailable的Exception,而你如果把你工程的JDK编译环境定位到了JAVA_HOME\jre目录下,它就能认得出,这是一个BUG,在eclipse的官方论坛中已经有提。

在eclipse里设置tomcat



设完后你的工程会在server这个tab下多出一个Tomcat的项。



将alpha_mvn转变成可在eclipse里运行的工程

右键你的工程,选project fact,你会看到一个convert的超链接,点这个超链接。



勾选Dynamic Web Module与Java两项

打开工程所在的eclipse workspace目录下的.settings目录如:C:\eclipsespace\alpha_mvn\.settings,看到一个叫“org.eclipse.wst.common.project.facet.core.xml”的文件如:



用纯文本编辑工具打开它,把:

installedfacet="jst.web" version从3.0或者其它版本,改成 2.5如下:

<installed facet="jst.web" version="2.5"/>

回到eclipse里刷新工程,这时你的工程应该会多出一个目录,WebContent,如下结构:



等等,等等。。。先别急着给我拷东西。

右键单击工程,选properties,在Java Build Path里选Order and Export这个Tab。

然后把Maven Dependencies给勾选上,按确定。



再右键单击工程选



看着这个mapping关系,自己用Add按钮照图来增加吧

记住:在AddMaven Dependencies时要选JavaBuild Path Entries。



其它的都用Folder来add,完全按照这个mapping 关系来做。

做完后,右键单击server,选”Add andRemove…”



在弹出对话框中把alpha_mvn通过Add>按钮增加到右边的Configured框中,Finish后



你会发觉原来的servers下的Tomcat已经挂载了我们的工程,点右上角绿色的启动按钮,切换到Console窗口看输出。



输出无误

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Maven