使用maven经常会碰到这样或者那样的问题,解决的思路只有一个!弄清楚为什么报错,然后解决它,就是这样么简单。
简单的报错,直接找到对应的pom.xml,将鼠标移至对应的错误提示即可,但是对于复杂的,可以根据下面的思路进行解决。注意,如果一个项目报错,往往会引起其它依赖的项目报错,因此需要优先解决父模块、公共模块的报错,这是一个原则。
调出myeclipse的problems操作面板,windowàshow viewàProblems,OK,在这里会看出很多报错,可以根据项目名称进行筛选,找到pom.xml报错的描述。右键属性,可以查看其具体的异常信息,如果你没见过该异常,使用baidu、google解决它。
Failedto execute goalorg.mybatis.generator:mybatis-generator-maven-plugin:1.3.2:generate(default-cli) on project ecosp-console-dao: Execution default-cli of goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.2:generatefailed: Cannot resolve classpath entry:F:\JavaWorkspace\sitech\ecosp\ecosp-console\ecosp-console-dao\src\main\webapp
出现该问题,应该是maven不能识别webapp目录,所以报错,有可能是其它的maven插件指定webapp为classpath,最简单有效的办法是在当前工程下面新建webapp目录,如若不需要该目录,在插件运行成功之后将其删除即可。
在本人的项目工程中,发现父模块中指定了resources,注释红色框中即可解决mybatis-generator报错问题。
项目中使用了resources-plugin插件,并且指定了encoding是UTF-8编码,如果不将相关文件排除,则会导致重新编码后文件损坏。
maven-resources-plugin
3.0.2
UTF-8
xls
xlsx
doc
docx
pdf
exe
sh
cmd进入某个目录,然后执行以下命令:
mvn archetype:generate -DgroupId=net.dwade -DartifactId=mall –Dversion=1.0.0-SNAPSHOT -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp-DarchetypeCatalog=internal -DinteractiveMode=false
其中-D archetypeArtifactId=maven-archetype-webapp指定maven工程的骨架,-DarchetypeCatalog=internal指定不要从远程下载catalog,不然容易卡在那。
创建普通的java工程如下:
mvn archetype:generate -DgroupId=net.dwade -DartifactId=ecig-mall-service –Dversion=1.0.0-SNAPSHOT -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeCatalog=internal -DinteractiveMode=false
在pom.xml中引入需要的jar包,执行mvn compile即可完成jar包下载,mvn dependency:sources完成源码包下载
这里以搭建常用的web、service、dao模块为例:
1)、创建父模块:脚本参考普通java工程maven命令,然后在pom.xml中将packaging改为pom即可。
2)、进入父模块根目录,分别创建web、service、dao、common的工程,其中web模块使用maven-archetype-webapp,其余使用maven-archetype-quickstart。创建OK之后,会在父模块中添加moduls节点,在子模块中添加parent节点。
3)、对部分目录进行调整,更符合项目的实际需求,可能要新建resources、filters目录等
4)、在Myeclipse中导入maven工程,注意从父模块导入,在build path里面进行相关的配置即可。
部分目录结构图如下所示:
批量修改pom版本号
有时候需要对多个模块修改版本号,可以使用mvn versions:set -DnewVersion=1.0.0将原有版本号进行修改,修改成功后,原有pom文件会被备份为pom.xml.versionsBackup,删除即可。
另外,Release插件也可以帮助我们发布并且修改版本号,但是这个只能修改为正式版。
mvn dependency:tree
在maven-compiler-plugin插件中使用了1.7的jdk,结果jenkins执行打包任务的时候报错:
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] Failure executing javac, but could not parse the error:
javac: invalid target release: 1.7
Usage: javac
于是把maven的运行环境、 jenkins的tomcat运行环境改成jdk1.7_79,再执行jenkins任务还是同样的错误。但是单独使用mvn clean install –Pproducttest –Dmaven.test.skip=true是SUCCESS的,基本上可以排除maven的影响。
后面同事提醒我jenkins的系统设置里面有jdk的管理,打开一看果然只有1.6的,修改成1.7的怕影响到原有jenkins任务,于是尝试着新增JDK,然后再执行jenkins任务,便出现了久违的SUCCESS提示。原来是jenkins是根据系统的jdk设置去执行编译作业的。
这是因为本地时间和服务器时间有差异导致的,如果服务器时间慢于jenkins服务器时间,jenkins则不会去更新svn代码,所以导致代码版本不一致,我们在jenkins里面的svn路径末尾加个@HEAD即可,强制更新代码。
ERROR: No such settings file D:\Java\apache-maven-3.2.1\conf\settings.xml exists
Please verify that your alternate settings file is specified properly and exists in the workspace.
SSH: Current build result is [FAILURE], not going to run.
Finished: FAILURE
maven升级之后,将原有的maven安装目录删除了,重启执行jenkins任务发现以上报错。但是jenkins的系统设置已经将maven安装目录设置好了,但是依旧报错。在网络上搜索了良久,也没有相应的解决办法。纠其原因,因为jenkins任务是之前就建立好的,会不会已经设置好了maven目录呢。打开任务对应的目录,果然发现了该问题。在${JENKINS_HOME}/jobs/xxx/config.xml中发现settings、globalSettings节点还是旧的配置。将其更改后,重新启动jenkins即可,不重启的话jenkins还是读取旧的缓存配置。
执行以下命令会在项目根目录创建lib目录,里面包含了依赖的jar包
mvn dependency:copy-dependencies -DoutputDirectory=lib -DincludeScope=compile
添加exec插件,参考http://www.mojohaus.org/exec-maven-plugin/usage.html,常用的命令:mvn exec:exec -Dexec.executable="maven" [-Dexec.workingdir="/tmp"] -Dexec.args="-X myproject:dist"
mvn install:install-file -DgroupId=com.lr -DartifactId=lrapi -Dversion=0.1 -Dpackaging=jar -Dfile=lrapi.jar
com.lr
lrapi
0.1
system
${project.basedir}/lib/lrapi.jar
我们可以使用maven release plugins插件为我们自动发布至私服,以及修改maven版本号,但是往往用于开发测试完成后发布版本用,但是我们在开发阶段,经常需要把jar包临时发布至私服
修改pom.xml,在project节点下面加入以下xml,为maven配置分发仓库
nexus-releases
Nexus Release Repository
http://192.168.2.233:8081/nexus/content/repositories/releases/
nexus-snapshots
Nexus Snapshot Repository
http://192.168.2.233:8081/nexus/content/repositories/snapshots/
然后在maven的setting.xml中增加权限配置,在servers节点下面增加以下xml,注意这个id要和pom.xml中保持一致:
nexus-releases
admin
admin123456
nexus-snapshots
admin
admin123456
OK,只要执行mvn clean package deploy便可以将jar包发布至私服,如果我们还想将源码也发布至私服,请在pom.xml中添加source插件:
org.apache.maven.plugins
maven-source-plugin
3.0.1
true
compile
jar
发布RELEASE版本
官方文档:http://maven.apache.org/maven-release/maven-release-plugin/examples/prepare-release.html
如果我们手动发布版本的话,需要做以下事情,非常繁锁,利用mavn release插件可以非常方便的完成以下繁锁的工作
首先在pom.xml中添加release插件,其中tagBase指定tags目录,用于存放release版本的svn路径,比如1.0.0。
org.apache.maven.plugins
maven-release-plugin
2.5.3
http://172.16.9.106:9001/svn/ /payment-center/tags/
在pom.xml中指定distributionManagement、scm,其中distributionManagement用于将jar包发布至私服,scm指定svn路径,便于release插件操作源代码修改版本号。注意:插件操作的是本地svn命令,必须安装svn客户端,要保证svn –verions命令是可以执行的。
nexus-dwade-releases
Nexus Release Repository
http://192.168.10.40:9090/nexus/content/repositories/releases/
nexus-dwade-snapshots
Nexus Snapshot Repository
http://192.168.10.40:9090/nexus/content/repositories/snapshots/
scm:svn:http://192.168.10.106:9001/svn/payment-center/trunk
scm:svn:http://192.168.10.106:9001/svn/ payment-center/trunk
配置OK之后,执行以下命令,其中-DautoVersionSubmodules是指定为多模块工程,这样maven就不会询问我们每一个子模块的版本号了
mvn release:prepare -DautoVersionSubmodules=true
执行过程中,你会遇到这样的提示:
What is the release version for "Unnamed - org.myorg:myapp:jar:1.0-SNAPSHOT"? (org.myorg:myapp) 1.0: :
——发布的版本号是什么,是否1.0,如果是的话直接回车,否则输入你的release版本号
What is SCM release tag or label for "Unnamed - org.myorg:myapp:jar:1.0-SNAPSHOT"? (org.myorg:myapp) myapp-1.0: :
——在release版本中,是否使用myapp-1.0作为svn目录,完成后会在tags目录中多出一个myapp-1.0的目录
What is the new development version for "Unnamed - org.myorg:myapp:jar:1.0-SNAPSHOT"? (org.myorg:myapp) 1.1-SNAPSHOT: :
新的版本号是什么?1.1-SNAPSHOT吗?我们可以指定版本号,比如2.0.0-SNAPSHOT
届时,插件为我们完成maven版本号的更改,以及为svn的代码在tags下面打了一个分支,接下来,我们需要将其发布到nexus仓库中,生成javadoc是非常耗时的,如果非必要可以跳过doc
mvn release:perform –Darguments="-Dmaven.javadoc.skip=true"
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:9090/nexus-2.2-01/content/repositories/thirdparty/ -DrepositoryId=nexus-dwade-releases
其中repositoryId是setting.xml中指定的server的id,需要一一对应,否则无法授权成功,返回401错误
nexus-dwade-releases
admin
xxx
最近将项目中的maven-war-plugins由2.6升级到3.1.0,myeclipse在pom.xml中报错:
org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.MavenProject, org.apache.maven.archiver.MavenArchiveConfiguration)
google之后说是maven4eclipse插件的bug,需要要将maven4eclipse升级到0.17.2版本,下面是链接。
https://otto.takari.io/content/sites/m2e.extras/m2eclipse-mavenarchiver/0.17.2/N/LATEST/
但是这一招在myecilpse中是行不通的,因为不能更新该插件。OK,既然是这个版本有问题,那么更新jar包应该是可以解决的。在myeclipse的安装目录中找到plugins目录,搜索mavenarchiver,果然这个版本比较老,是0.17.0.xxx。在上面的链接中下载0.17.2的jar包,将原有的jar删除替换即可。
升级插件之后,报错消失,但是后续发现myeclipse不能识别web工程了,经过几番折腾,不得不妥协降低maven-war-plugins插件的版本号
Plugin execution not covered by lifecycle configuration: org.apache.maven.plugins:maven-compiler-plugin:3.5.1
这表示m2e在其执行maven的生命周期管理时没有定义该插件,所以提示出错,其实m2e对此是提供了扩展机制的,我们可以通过如下操作来消除这个出错提示:
1. 进入Window—>Preferences—>Maven,进入Lifecycle Mapping设置项,如下图:
从上图可以看出m2e管理maven生命周期的文件名是lifecycle-mapping-metadata.xml,以及该文件的存放路径
2. 下一步我们就要去相应路径修改lifecycle-mapping-metadata.xml文件,但会发现这个文件在上图中提示的位置并不存在,那么此时就以到eclipse的安装目录下的plugins下的org.eclipse.m2e.lifecyclemapping.defaults_xxxxxx.jar文件中找到该文件(如下图),将其copy至Lifecycle Mapping设置项中的路径,然后执行Reload workspace lifecycle mappings metadata按钮,即可