Maven报错记录

本文是使用Maven时的报错记录以及原因分析。

Failed to execute goal org.apache.maven.plugins maven-compiler-plugin 3.7.0 compile

报错如下:

1
Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile (default-compile) on project xxxxx: Fatal error compiling

报错原因分析

项目发布时,由于pom.xml文件中缺少maven-compiler-plugin插件的依赖或者没有填加<source><target>属性导致。

maven是个项目管理工具,如果我们不告诉它我们的代码要使用什么样的jdk版本编译的话,它就会用maven-compiler-plugin默认的jdk版本来进行处理,这样就容易出现版本不匹配,以至于可能导致编译不通过的问题。maven的默认编译使用的jdk版本貌似很低。

解决办法

我们使用maven-compiler-plugin插件可以指定项目源码的jdk版本,编译后的jdk版本,以及编码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<plugin>                                                                         
<!-- 指定maven编译的jdk版本,如果不指定,maven3默认用jdk 1.5 maven2默认用jdk1.3 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<!-- 一般而言,target与source是保持一致的,但是,有时候为了让程序能在其他版本的jdk中运行(对于低版本目标jdk,源代码中不能使用低版本jdk中不支持的语法),会存在target不同于source的情况 -->
<source>1.8</source> <!-- 源代码使用的JDK版本 -->
<target>1.8</target> <!-- 需要生成的目标class文件的编译版本 -->
<encoding>UTF-8</encoding><!-- 字符集编码 -->
<skipTests>true</skipTests><!-- 跳过测试 -->
<verbose>true</verbose>
<showWarnings>true</showWarnings>
<fork>true</fork><!-- 要使compilerVersion标签生效,还需要将fork设为true,用于明确表示编译版
本配置的可用 -->
<executable><!-- path-to-javac --></executable><!-- 使用指定的javac命令,例如:<executable>${JAVA_1_4_HOME}/bin/javac</executable> -->
<compilerVersion>1.3</compilerVersion><!-- 指定插件将使用的编译器的版本 -->
<meminitial>128m</meminitial><!-- 编译器使用的初始内存 -->
<maxmem>512m</maxmem><!-- 编译器使用的最大内存 -->
<compilerArgument>-verbose -bootclasspath ${java.home}\lib\rt.jar</compilerArgument><!-- 这个选项用来传递编译器自身不包含但是却支持的参数选项 -->
</configuration>
</plugin>

Failed to execute goal org.apache.maven.plugins maven-resources-plugin 2.6 resource

今天在使用maven打包时正常操作却报出错误:

1
Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:2.6:resource......

这个错误出现的原因如下:

我们都知道在打包之后会在项目的target目录下生成我们打的jar包或者war包zip包,mvn clean后会把target目录删除。

而这个错误的原因就是我在打包完成之后,使用压缩软件WinRAR查看target里面war包内容忘记了关闭。在对项目进行修改之后又成功执行了clean,虽然mvn把target目录删除了,但是WinRAR没有关闭,还占用着那个目录,然后再执行package命令的时候就报了这个错,意思就是那个目录被占用拒绝访问

这时候只要把WinRAR关闭,手动删除target目录,或者重新执行clean package命令就好了。

插件不生效问题

问题

今天在使用maven打包的时候发现配置的插件没有生效。

原因分析

我的pom.xml中构建相关配置类似这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<build>
<finalName>iot-kafkamsg</finalName>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>cn.wxyidea.KafkaMsgDemo</mainClass>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>

这里要注意pluginManagement标签:

  • pluginManagement是一种在项目的多个模块中共享相同插件配置的方法,配置可以被其它模块继承的插件信息,即是对插件的声明,在pluginManagement中配置plugins,执行maven命令时,不会被maven加载
  • pluginManagement中声明的插件可以被当前pom或子pom中引用,比如你在项目的父pom中使用pluginManagement声明插件,那么在子pom中可以继承该插件,只需要在plugins节点中配置groupId和artifactId就可以完成插件的引用。

我们也可以通过看maven运行命令时的日志发现这个问题:一般写着default的就是Maven默认的插件

参考


----------- 本文结束啦感谢您阅读 -----------

赞赏一杯咖啡

欢迎关注我的其它发布渠道