目录
1.3 Could not resolve dependencies
3 maven web项目Cannot detect Web Project version. Please specify version of Web Project through...的错误
5 使用mvn archtype;generate出现BUILD ERROR
7 maven多项目打包报错---子模块相互依赖打包时所遇到的问题:依赖的程序包找不到 package xxx does not exist
1 maven项目版本问题
1.1 新建项目编译版本
当我们使用的是myeclipse的版本是2013的时候,会发现 新建maven项目时,complile level最高只能选择1.6,即使你配置的jdk环境很高,但还是显示不出来,在建成以后的pom.xml文件里面有以下插件:
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
我就直接把<source>标签里面的改成了1.8,保存以后项目名字那里就会报错,但是下面的文件没有一个报错的,这时候右键单击项目名,选择maven4myeclipse下面的updateproject 把整个项目更新一下就不再报错了
1.2 更新maven依赖时项目默j2SE1.5版本
1.2.1 修改pom.xml文件
只需要在maven项目的pom.xml中将编译器的版本指定为1.8即可
代码如下:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
这样每次更新依赖 j2SE的依赖库都会变成1.8版本
如下如所示:
这样的话以后更新就不会,变为J2se1.5了
1.2.2 修改settings.xml
另外一种方法,是修改settings.xml文件在<profiles>节点添加如下代码:
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
1.3 Could not resolve dependencies
先看报错:
Failed to execute goal on project maven_crud_service:
Could not resolve dependencies for project cn.zzsxt:maven_crud_service:jar:0.0.1-SNAPSHOT:
Failed to read artifact descriptor for cn.zzsxt:maven_crud_dao:jar:0.0.1-SNAPSHOT:
Could not find artifact cn.zzsxt:maven_crud_parent:pom:0.0.1-SNAPSHOT -> [Help 1]
就这一句话但是怎么也找不出来所以然,原来是版本不兼容问题,我用的是myclipse2013版本的,但是我用的maven是3.5版本的,这个maven3.5版本的需要jdk是最少1.7的,但是myeclipse2013的jdk默认一般是1.4的,最高可选是1.6的,必须要在配置完的pom.xml文件里面更改一下:
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
这样的话,myeclipse2013也会跟着改为1.7,但是我的jdk配置的是1.8就直接改成了1.8,结果保存之后就自己变为了1.4,也就是说2013的myeclipse最多支持到1.7,不过勉强可以支持到maven3.5了,对了版本更换以后一定要更新一下可以避免报错
2 war项目无pom.xml报错
用maven建立web项目时,选择了war的package包装,完全建立完成后pom.xml就会报错,还是在文件头那里,说是版本不符合的因素,先插入以下插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<version>3.0</version>
</configuration>
</plugin>
完成以后,文件头那里还是会报错,这时候要做的和上面一样,也是必须要更新一下项目工程,就可以完美解决了
3 maven web项目Cannot detect Web Project version. Please specify version of Web Project through...的错误
没有用骨架模板,创建maven web工程后会出现如下的错误,在pom.xml文件头部 有以下的错误
Cannot detect Web Project version. Please specify version of Web Project through <version> configuration property of war plugin. E.g.: <plugin> <artifactId>maven-war-plugin</artifactId> <configuration> <version>3.0</version> </configuration> </plugin>
解决方法如下:
在pom.xml文件中加入:
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<version>3.0</version>
</configuration>
</plugin>
</plugins>
<finalName>webserver</finalName>
</build>
注意:加入的maven-compiler-plugin可以让编译的水平不会是J2SE1.5的水平,加入的maven-war-plugin可以去生成index.jsp和web.xml文件(这是没用骨架模板的情况)
4 直接报找不到对应的jar错误
mvn调试信息:比如:mvn -X -e clean compile
- -e:打印错误信息 。
- -X:代表debug模式 。
原来setting配置:
<mirrors>
<mirror>
<id>Nexus</id>
<url>http://192.168.4.11/content/groups/public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
这个是有问题的,可以用-X -e看到如下信息:
[DEBUG] Repositories (dependencies): [Nexus (http://192.168.4.11/content/groups/
public/, releases)]
[DEBUG] Repositories (plugins) : [Nexus (http://192.168.4.11/content/groups/
public/, releases)]
明显public只对release有效,对snapshot无效。解决办法只能需要定义mirrortype指定对snapshot有效。
更改为:
<mirrors>
<mirror>
<id>Nexus</id>
<url>http://192.168.4.11/content/groups/public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
<mirror>
<id>Nexus2</id>
<url>http://192.168.4.11/content/groups/public/</url>
<mirrorOf>public-snapshots</mirrorOf> // 对snapshots有效
</mirror>
</mirrors>
<profiles> //定义public-snapshots profile
<profile>
<id>public-snapshots</id>
<repositories>
<repository>
<id>public-snapshots</id>
<url>http://public-snapshots</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>public-snapshots</id>
<url>http://public-snapshots</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>public-snapshots</activeProfile>
</activeProfiles> //使profile生效
再看debug输出:
[DEBUG] Repositories (dependencies): [Nexus (http://192.168.4.11/content/groups/
public/, snapshots), central (http://repo1.maven.org/maven2, releases)]
[DEBUG] Repositories (plugins) : [Nexus (http://192.168.4.11/content/groups/
public/, snapshots), central (http://repo1.maven.org/maven2, releases)]
注意:maven会自动从仓库中检查模块A的快照版本的最新版本,当发现有更新时便进行下载。默认情况下,maven每天检查一次更新(由仓库配置的updatePolicy控制),用户也可以使用命令-U参数强制让maven检查更新,如maven clean install -U。
5 使用mvn archtype;generate出现BUILD ERROR
5.1 引入问题
我们常常会使用mvn archetype:generate来创建一个项目的骨架,这本身是Maven一个非常有趣的功能,你甚至可以定义自己的项目骨架
GMT +8:00运行mvn archetype:generate,得到的是一堆出错信息:
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Internal error in the plugin manager executing goal 'org.apache.maven.plugins:maven-archetype-plugin:2.0-alpha-5-SNAPSHOT:generate': Unable to
load the mojo 'org.apache.maven.plugins:maven-archetype-plugin:2.0-alpha-5-SNAPSHOT:generate' in the plugin 'org.apache.maven.plugins:maven-archetype
plugin'. A required class is missing: org/codehaus/plexus/util/xml/XmlStreamReader
org.codehaus.plexus.util.xml.XmlStreamReader
[INFO] ------------------------------------------------------------------------
[INFO] For more information, run Maven with the -e switch
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 12 seconds
[INFO] Finished at: Mon Oct 12 00:00:15 CST 2009
[INFO] Final Memory: 8M/15M
[INFO] ------------------------------------------------------------------------
一条标准得不能再标准的命令,得到的结果却是一对看不懂的出错信息,实在令人沮丧。其实出错的原因很简单,maven-archetype-plugin没有被认为是Maven的核心插件,也就没有在超级POM中为其设定版本,于是,我们运行archetype命令的时候,maven就去中央仓库下载最新的SNAPSHOT,而恰恰这个SNAPSHOT是有问题的,是完全无法工作的,于是我们看到了上面的结果。
5.2 解决问题
5.2.1 指定版本号
解决方案很简单,就是有点烦,我们需要在运行archetype命令的时候指定其版本,命令如下:
mvn org.apache.maven.plugins:maven-archetype-plugin:2.0-alpha-4:generate
指定groupId, artifactId, version,2.0-alpha-4是目前的最新版本,试试吧,现在archetype又能正常工作了,他会提示你一大堆可选的archetype类型,个人还是最喜欢默认的15: internal -> maven-archetype-quickstart () ,在需要一个简单的Maven项目进行测试的时候,非常有用。
5.2.2 修改settings.xml文件
打开maven的settings.xml文件
找到有效的插件仓库的配置位置,在标签下面加上
<snapshots>
<enabled>false</enabled>
</snapshots>
的配置,这样在下载插件的时候就不会下载快照版本了
6 Maven中OutOfMemory错误
6.1 报错
当Maven项目很大,或者运行诸如 mvn site 这样的命令的时候,maven运行需要很大的内存,在默认配置下,就可能遇到java的堆溢出。如:
[INFO] Building jar: /home/dl9pf/svn/mindquarry/mindquarry-jcr/mindquarry-jcr-changes/target/mindquarry-migration-with-dependencies.jar
[INFO] ------------------------------------------------------------------------
[ERROR] FATAL ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Java heap space
[INFO] ------------------------------------------------------------------------
[INFO] Trace
java.lang.OutOfMemoryError: Java heap space
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:99)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:518)
...
at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7 minutes 14 seconds
[INFO] Finished at: Wed Sep 05 07:44:55 CEST 2007
[INFO] Final Memory: 37M/63M
[INFO] ------------------------------------------------------------------------
6.2 解决的方法是调整java的堆大小的值。
6.2.1 Windows环境中
找到文件%M2_HOME%\bin\mvn ,这就是启动Maven的脚本文件,在该文件中你能看到有一行注释为:
@REM set MAVEN_OPTS=-Xdebug -Xnoagent -Djava.compiler=NONE...
它的意思是可以设置一些Maven参数,我们就在注释下面加入一行:
set MAVEN_OPTS= -Xms128m -Xmx512m
之后,当运行Maven命令如 mvn -version 的时候,会看到如下的输出:
E:\test>mvn -version
E:\test>set MAVEN_OPTS= -Xms128m -Xmx512m
Maven version: 2.0.9
Java version: 1.6.0_07
OS name: "windows 2003" version: "5.2" arch: "x86" Family: "windows"
我们看到,配置的Maven选项生效了,OutOfMemoryError也能得以相应的解决
6.2.2 Linux环境中
也可以通过设置环境变量解决该问题, 如,编辑文件 /etc/profile 如下
MAVEN_OPTS=-Xmx512m
export JAVA_HOME MAVEN_HOME MAVEN_OPTS JAVA_BIN PATH CLASSPATH
6.2.3 eclipse
类似以上的方法都会失效,所幸m2eclipse提供了配置点。步骤如下:
项目上右击 -> Run As -> Run Configurations -> Maven Build 上右击 -> New
这时会看到一个maven运行配置对话框,这里面其它的配置我不多解释了,为了解决内存溢出的问题,我们可以选择第二个TAB: JRE,然后在VM arguments中输入配置如:-Xms128m -Xmx512m
6.2.4 MAVEN_OPTS设定为环境变量
win7下设置方法如下:
右键我的电脑,选择属性
选择 高级系统设置
在 高级 tab页下,点击环境变量按钮
创建一个用户变量,变量名是MAVEN_OPTS 值为 -Xmx1024m (or more)
7 maven多项目打包报错---子模块相互依赖打包时所遇到的问题:依赖的程序包找不到 package xxx does not exist
在springboot项目多模块已成开发大势所趋,抽出一个parent父工程,子模块基础模块(包含一些公用的实体类和工具类等),以及其他子模块(Module A、 Module B …)。Module A 以及Module B工程都需要依赖子模块工程。
问题:
在对Module A进行打包时,出现问题:Module A中所依赖的子模块工程的util程序包不存在。即使能打包成功,用java -jar启动jar包也会报Class Not Found,依赖的子模块工程的类找不到
解决方案:
官方告诉我们,你如果不想移代码,好吧,我这样来给你解决,给你打两个jar包,一个用来直接执行,一个用来依赖。于是,你需要指定一个属性classifier,这个属性为可执行jar包的名字后缀。比如我设置<classifier>exec</classifier>,原项目名为Vehicle-business。那么会得到两个jar:Vehicle-business.jar和Vehicle-bussiness-exec.jar
解决子模块工程的pom.xml的maven配置如下:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
</plugins>
</build>
原因分析: spring-boot-maven-plugin打包出来的jar是不可依赖的
我们现在整合后的maven项目有一个parent工程,打包类型为pom,下面多个spring-boot工程作为它的module,分别为子模块和moduleA,moduleB。假如moduleA依赖于子模块。如果你在子模块中使用了spring-boot-maven-plugin的默认配置build,或者在parent工程中使用spring-boot-maven-plugin的默认配置build。那么在clean package的时候会发现moduleA找不到子模块中的类。原因就是默认打包出来的jar是不可依赖的