maven个人实战总结&FAQ

解决pom报错

使用maven经常会碰到这样或者那样的问题,解决的思路只有一个!弄清楚为什么报错,然后解决它,就是这样么简单。

简单的报错,直接找到对应的pom.xml,将鼠标移至对应的错误提示即可,但是对于复杂的,可以根据下面的思路进行解决。注意,如果一个项目报错,往往会引起其它依赖的项目报错,因此需要优先解决父模块、公共模块的报错,这是一个原则。

调出myeclipse的problems操作面板,windowàshow viewàProblems,OK,在这里会看出很多报错,可以根据项目名称进行筛选,找到pom.xml报错的描述。右键属性,可以查看其具体的异常信息,如果你没见过该异常,使用baidu、google解决它。


cannot resolve classpath entry

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报错问题。


maven打包后,excel、pdf等文件损坏

项目中使用了resources-plugin插件,并且指定了encoding是UTF-8编码,如果不将相关文件排除,则会导致重新编码后文件损坏。

<plugin>
	<artifactId>maven-resources-plugin</artifactId>
	<version>3.0.2</version>
	<configuration>
		<encoding>UTF-8</encoding>
		<!-- 解决文件损坏问题 -->
		<nonFilteredFileExtensions>
			<nonFilteredFileExtension>xls</nonFilteredFileExtension>
			<nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
			<nonFilteredFileExtension>doc</nonFilteredFileExtension>
			<nonFilteredFileExtension>docx</nonFilteredFileExtension>
			<nonFilteredFileExtension>pdf</nonFilteredFileExtension>
			<nonFilteredFileExtension>exe</nonFilteredFileExtension>
			<nonFilteredFileExtension>sh</nonFilteredFileExtension>
		</nonFilteredFileExtensions>
	</configuration>
</plugin>


maven命令创建工程

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


maven命令下载jar、源码

pom.xml中引入需要的jar包,执行mvn compile即可完成jar包下载,mvn dependency:sources完成源码包下载


搭建maven项目

这里以搭建常用的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


jenkins: invalid target release: 1.7

maven-compiler-plugin插件中使用了1.7jdk,结果jenkins执行打包任务的时候报错:

[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] Failure executing javac, but could not parse the error:
javac: invalid target release: 1.7
Usage: javac <options> <source files>
use -help for a list of possible options

于是把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服务器时间,jenkins则不会去更新svn代码,所以导致代码版本不一致,我们在jenkins里面的svn路径末尾加个@HEAD即可,强制更新代码。


jenkins更新maven版本问题

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还是读取旧的缓存配置。


导出maven依赖jar包

执行以下命令会在项目根目录创建lib目录,里面包含了依赖的jar包

mvn dependency:copy-dependencies -DoutputDirectory=lib -DincludeScope=compile


maven运行Main方法

添加exec插件,参考http://www.mojohaus.org/exec-maven-plugin/usage.html,常用的命令:mvn exec:exec -Dexec.executable="maven" [-Dexec.workingdir="/tmp"] -Dexec.args="-X myproject:dist"


install jar包

mvn install:install-file -DgroupId=com.lr -DartifactId=lrapi -Dversion=0.1 -Dpackaging=jar -Dfile=lrapi.jar


添加文件目录中的jar包

<dependency>
    <groupId>com.lr</groupId>
    <artifactId>lrapi</artifactId>
    <version>0.1</version>
    <scope>system</scope>
	<systemPath>${project.basedir}/lib/lrapi.jar</systemPath>
</dependency>


发布jar包至私服

我们可以使用maven release plugins插件为我们自动发布至私服,以及修改maven版本号,但是往往用于开发测试完成后发布版本用,但是我们在开发阶段,经常需要把jar包临时发布至私服

修改pom.xml,在project节点下面加入以下xml,为maven配置分发仓库

<distributionManagement>
	<repository>
		<id>nexus-releases</id>
		<name>Nexus Release Repository</name>
		<url>http://192.168.2.233:8081/nexus/content/repositories/releases/</url>
	</repository>
	<snapshotRepository>
		<id>nexus-snapshots</id>
		<name>Nexus Snapshot Repository</name>
		<url>http://192.168.2.233:8081/nexus/content/repositories/snapshots/</url>
	</snapshotRepository>
</distributionManagement>

然后在maven的setting.xml中增加权限配置,在servers节点下面增加以下xml,注意这个id要和pom.xml中保持一致:

<servers>
  <server>  
    <id>nexus-releases</id>
    <username>admin</username>
    <password>admin123456</password>
  </server>
  <server>
    <id>nexus-snapshots</id>
    <username>admin</username>
    <password>admin123456</password>
  </server>
</servers>

OK,只要执行mvn clean package deploy便可以将jar包发布至私服,如果我们还想将源码也发布至私服,请在pom.xml中添加source插件:

<!-- 用于deploy时上传源码至私服 -->
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-source-plugin</artifactId>
	<version>3.0.1</version>
	<configuration>
		<attach>true</attach>
	</configuration>
	<executions>
		<execution>
			<phase>compile</phase>
			<goals>
				<goal>jar</goal>
			</goals>
		</execution>
	</executions>
</plugin>


发布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。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-release-plugin</artifactId>
    <version>2.5.3</version>
    <configuration>
        <tagBase>http://172.16.9.106:9001/svn/ /payment-center/tags/</tagBase>
    </configuration>
</plugin>

在pom.xml中指定distributionManagement、scm,其中distributionManagement用于将jar包发布至私服,scm指定svn路径,便于release插件操作源代码修改版本号。注意:插件操作的是本地svn命令,必须安装svn客户端,要保证svn –verions命令是可以执行的。

<distributionManagement>
    <repository>
        <id>nexus-dwade-releases</id>
        <name>Nexus Release Repository</name>
        <url>http://192.168.10.40:9090/nexus/content/repositories/releases/</url>
    </repository>
    <snapshotRepository>
        <id>nexus-dwade-snapshots</id>
        <name>Nexus Snapshot Repository</name>
        <url>http://192.168.10.40:9090/nexus/content/repositories/snapshots/</url>
    </snapshotRepository>
</distributionManagement>
<scm>
    <connection>scm:svn:http://192.168.10.106:9001/svn/payment-center/trunk</connection>
    <developerConnection>scm:svn:http://192.168.10.106:9001/svn/ payment-center/trunk</developerConnection>
</scm>

配置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"


发布第三方jar包至私服

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错误

<server>
	<id>nexus-dwade-releases</id>
	<username>admin</username>
	<password>xxx</password>
</server>


MavenArchiver.getManifest Error

最近将项目中的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

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按钮,即可


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值