码迷,mamicode.com
首页 > 其他好文 > 详细

maven的常用技巧

时间:2015-08-03 14:41:08      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:maven

可先阅读

可先阅读我之前写的一些maven文章。(也可不阅读)

新建maven工程

老项目转maven工程

maven的一些问题解决

maven私服搭建

maven依赖项目

对于大项目,一般会拆分为几个小工程,然后进行引用。这时候,被引用的工程version,最好设置为snapshot。这样每次发布,引用的工程都会自动更新,而不需每次升级版本号!这点,我觉得maven确实设计的很好。
被引用jar工程:

    <groupId>com.baidu</groupId>
    <artifactId>framework</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

引用它的war工程:

<dependency>
    <groupId>com.baidu</groupId>
    <artifactId>framework</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

maven项目相互依赖

如果有两个maven项目,A引用了B,B也引用了A,eclipse会显示感叹号。
技术分享
eclipse的Problems窗口会显示:

Description Resource Path Location Type
A cycle was detected in the build path of project ‘framework’. The cycle consists of projects {framework, component, app} framework Build path Build Path Problem
Description Resource Path Location Type
The project cannot be built until build path errors are resolved framework Unknown Java Problem

maven是不允许工程间相互依赖的,详细见:http://hck.iteye.com/blog/1728329
解决的办法是重构这两个工程,使其单向依赖或者互不依赖,这个工作量必然很大;第二个办法是合并为一个工程。但是其实你也可以不理会这个错误,有这个问题是不影响编译发布的,只要你能容忍这个红色感叹号的存在。

指定webapp目录

只要符合JavaEE的web工程,必然有一个包含WEB-INF的目录,这个目录你可以叫webapp,也可以叫webapps,我的项目是叫web,放在和src平行的路径。
但是maven并不知道啊,所以这样编译时是会报错的。

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.1.1:war (default-war) on project zplat: Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode) -> [Help 1]

解决的办法是在pom.xml中加上:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <webResources>
                    <resource>
                        <directory>web</directory>
                    </resource>
                </webResources>
            </configuration>
        </plugin>
    </plugins>
</build>

web是WEB-INF/web.xml所在的目录,如果放在main/java/webapp这个maven默认的路径下就不用配置这个了。
比如我公司的另一个项目cube就是放在默认的webapp下:C:\code\cube\cube_rm\src\main\webapp\WEB-INF
参考:http://www.cnblogs.com/zhouyalei/p/3357145.html

eclipse中jar自动拷贝到WEB-INF/lib下的方法

maven都是编译到target目录的,这个很适合发布,但不合适开发。用eclipse开发时,最快的开发方式是eclipse自动编译生成class,把tomcat设置为热部署,这样一改完代码后可立即生效调试(假设不考虑单元测试的情况下)。
这样问题就来了,某个jar有变动了(特别是有依赖的工程),编译是没问题的(因为引用的就.m2中的新jar),但是运行就有问题了(因为WEB-INF下没更新jar)。难道每次都要手动拷贝到lib下?不需要。配置一下pom,然后通过eclipse的mvn install,会自动拷贝。

<build>
  <outputDirectory>${basedir}/web/WEB-INF/classes</outputDirectory>  
    <pluginManagement>
        <plugins>
            <!-- Ignore/Execute plugin execution -->
            <plugin>
                <groupId>org.eclipse.m2e</groupId>
                <artifactId>lifecycle-mapping</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <lifecycleMappingMetadata>
                        <pluginExecutions>
                            <!-- copy-dependency plugin -->
                            <pluginExecution>
                                <pluginExecutionFilter>
                                    <groupId>org.apache.maven.plugins</groupId>
                                    <artifactId>maven-dependency-plugin</artifactId>
                                    <versionRange>[1.0.0,)</versionRange>
                                    <goals>
                                        <goal>copy-dependencies</goal>
                                    </goals>
                                </pluginExecutionFilter>
                                <action>
                                    <ignore />
                                </action>
                            </pluginExecution>
                        </pluginExecutions>
                    </lifecycleMappingMetadata>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.1</version>
            <executions>
                <execution>
                    <id>copy</id>
                    <phase>install</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${basedir}/web/WEB-INF/lib</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

jar包的查找技巧

java.lang.ClassNotFoundException: org.apache.oro.text.regex.Perl5Compiler
通过缺少类的报错信息可以查找到缺少jar包jakarta-oro-2.0.8.jar,但是怎么知道这个jar的pom配置呢?
第一个办法是通过eclipse的插件,打开pom.xml,点击dependence来找,这个方法很好用,但有个缺点是经常会找不到,因为你不一定知道groupid应该填什么。
第二个办法是到这个jar的官网,现在,大多数的都会给出配置的。如果没有官网,百度google一下也应该能找到。
第三个办法,如果都找不到,只能自己上传这个jar到私服nexus了。

<dependency>
    <groupId>oro</groupId>
    <artifactId>oro</artifactId>
    <version>2.0.8</version>
    <scope>runtime</scope>
</dependency>

这个我就是在百度一搜就搜到的。原来我用jakarta-oro来搜索怎么都搜不到(原来叫oro)。

eclipse中的maven项目显示红叉

技术分享
项目中显示错误,需要看具体的错误信息:eclipse->Problems
可能是maven的错,也可能不是。下面是我的项目,刚好是maven的错误信息:

Description Resource Path Location Type
Project configuration is not up-to-date with pom.xml. Run Maven4MyEclipse->Update Project or use Quick Fix. app line 1 Maven Configuration Problem

解决方法很简单:按照提示,鼠标右键-> Maven4MyEclipse->Update Project 默认选项
点击确定就解决了。

另一个错误:

Description Resource Path Location Type
Resource is out of sync with the file system: ‘/component/pom.xml’. (org.apache.maven.plugins:maven-jar-plugin:2.3.2:jar:default-jar:package) pom.xml /component line 8 Maven Build Problem

解决方法:重新打开pom后,突然好了。
eclipse的maven插件错误提示有时候有些延时,明明没有错误却提示错误,重启一下也许就好了。

依赖的工程改动后maven编译报错

A工程依赖B工程,把B工程修改了,也发布到nexus上,但A工程在主机上编译报错。但是在本机一切良好。(可能是发布了jar却忘记了提交代码导致)
解决方法:到nexus里查看,B工程的jar确实是更新了。然后到主机的.m2目录看,jar没有更新!问题就是出在这里。把改目录下全部删掉(包括jar/pom/sha1等),然后回到A工程目录mvn install即可。

转载请标明出处:
本文出自:【ouyida3的博客
2015.8.3

版权声明:本文为博主原创文章,未经博主允许不得转载。

maven的常用技巧

标签:maven

原文地址:http://blog.csdn.net/ouyida3/article/details/47254411

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!