关于maven的常见异常处理

目录

1 maven项目版本问题

1.1 新建项目编译版本

1.2 更新maven依赖时项目默j2SE1.5版本

1.2.1 修改pom.xml文件

1.2.2 修改settings.xml

1.3 Could not resolve dependencies

2 war项目无pom.xml报错

3 maven web项目Cannot detect Web Project version. Please specify version of Web Project through...的错误

4 直接报找不到对应的jar错误

5 使用mvn archtype;generate出现BUILD ERROR

5.1 引入问题

5.2 解决问题

5.2.1 指定版本号

5.2.2 修改settings.xml文件

6 Maven中OutOfMemory错误

6.1 报错

6.2 解决的方法是调整java的堆大小的值。

6.2.1 Windows环境中

6.2.2 Linux环境中

6.2.3 eclipse

6.2.4 MAVEN_OPTS设定为环境变量

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)

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是不可依赖的
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值