标签: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项目,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
解决的办法是重构这两个工程,使其单向依赖或者互不依赖,这个工作量必然很大;第二个办法是合并为一个工程。但是其实你也可以不理会这个错误,有这个问题是不影响编译发布的,只要你能容忍这个红色感叹号的存在。
只要符合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
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>
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->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插件错误提示有时候有些延时,明明没有错误却提示错误,重启一下也许就好了。
A工程依赖B工程,把B工程修改了,也发布到nexus上,但A工程在主机上编译报错。但是在本机一切良好。(可能是发布了jar却忘记了提交代码导致)
解决方法:到nexus里查看,B工程的jar确实是更新了。然后到主机的.m2
目录看,jar没有更新!问题就是出在这里。把改目录下全部删掉(包括jar/pom/sha1等),然后回到A工程目录mvn install即可。
转载请标明出处:
本文出自:【ouyida3的博客】
2015.8.3
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:maven
原文地址:http://blog.csdn.net/ouyida3/article/details/47254411