maven插件调试方法

前言

以IntelliJ IDEA为例,通常我们调试maven项目时,都是直接点击调试按钮即可。但maven编写的插件就不同了,由于插件需要打包成Jar加载到项目中,所以如果我们需要在编写插件源码时调试的话,就不能直接点击调试按钮了(因为没有Main类),那么该怎么办呢?

解决方案一(直接在插件项目中调试)

假设及正在编写的maven插件拥有如下坐标:

<groupId>myPluginGroupId</groupId>
<artifactId>myPluginArtifactId</artifactId>
<version>myPluginVersion</version>

再假设你想将这个插件用在某个项目中,而项目中的pom.xml是这样定义这个插件的:

<plugin>
    <groupId>myPluginGroupId</groupId>
    <artifactId>myPluginArtifactId</artifactId>
    <version>myPluginVersion</version>
      <executions>
               <execution>
                     <id>myPluginGoal</id>
                     <phase>compile</phase>
                     <goals>
                          <goal>myPluginGoal</goal>
                     </goals>
               </execution>
          </executions>
</plugin>

其中,myPluginGoal 即为你要调试的目标。

那么可以在Terminal中输入命令:

mvnDebug myPluginGroupId:myPluginArtifactId:myPluginVersion:myPluginGoal

然后,程序会自动分配8000 Listen端口。此时,在myPluginGoal对应的程序中打上断点,再点击调试按钮,就可以调试啦!

解决方案二(目标项目和插件项目联调)

这样的调试方式其实是服务器客户端的方式,目标项目是服务器,插件项目是客户端;只不过服务器和客户端都在我们本地电脑上。

首先在在目标项目中,增加Maven运行配置

进入配置后,先进入Parameters中,配置Command line:

注意其中的jm目标可能是detect、delete、insert、update,根据实际情况选择,也就是“解决方案一”中的myPluginGoal。除此,要把groupId 、artifactId、版本号改成自己插件的对应值。

注:如果插件已经在目标项目的 pom 中定义,可以只写 jm:detect ,后面的 -DgroupId 等参数可以不写。

其中 -D 是 maven 命令,可以在终端输入 mvn -h 查看其作用:设置属性。类似例子可参见 https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html

再进入Runner, 不勾选“Use project settings”,配置VM Options:

其中的端口号可以改成其他的。

然后配置maven插件项目

增加Remote配置,并将其中的端口号改成和目标项目端口号相同的值即可。

现在可以开始调试啦

首先点击目标项目的运行按钮,启动Listening...,再到插件项目中打好断点、点击调试按钮,即可开始调试。

后记

调试的方法有多种,本文中的方法比较简单,如有特殊需求可查询其他方法。

参考资料

《Maven实战》第17章介绍了编写maven插件的方法

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏magicsoar

mac下使用marsedit写博客

在Windows习惯了使用Windows live write写好博客,然后发布上去,到了mac下,发现了一个很好的替代品  MarseEdit 下载安装后,打...

3079
来自专栏禁心尽力

下载安装ActiveMQ(消息队列)

安装步骤: 第一步、安装jdk环境,因为ActiveMQ是使用java语言编写。 第二步、将下载好的activemq压缩包上传至Linux系统,进行解压。 第三...

2275
来自专栏linux驱动个人学习

Linux下的进程类别(内核线程、轻量级进程和用户进程)--Linux进程的管理与调度(四)

虽然我们在区分Linux进程类别, 但是我还是想说Linux下只有一种类型的进程,那就是task_struct,当然我也想说linux其实也没有线程的概念, 只...

2162
来自专栏闵开慧

hadoop数据库操作解析及注意事项

1 从mysql读数据到hdfs:     mapreduce读数据库数据到hdfs使用map读取,连接数和map数对应,读的时候会锁表读取全量数据,此时,其它...

5567
来自专栏Python专栏

176条DevOps人员常用的linux命令速查表,收藏了慢慢看

1162
来自专栏WindCoder

Eclipse创建AIDL文件

在学习Android的Service时,需要用到个AIDL文件,Eclipse中Android Tools并没有Create Aidl preprocess f...

1731
来自专栏lgp20151222

Tomcat出现validateJarFile-jar not loaded问题

validateJarFile(...\WEB-INF\lib\servlet-api.jar)-jar not loaded. See Servlet Spe...

1481
来自专栏散尽浮华

php安装扩展模块后,重启不生效的原因及解决办法

在lnmp运维环境中,我们经常会碰到有些php依赖的扩展模块没有安装,这就需要后续添加这些扩展模块。在扩展被安装配置后,往往会发现php-fpm服务重启后,这些...

5503
来自专栏DT乱“码”

gitHub基本命令

一.要提交文件到github 必须配置本地配置文件 .git文件夹的 config ? 在config文件末尾加上 [user]     name=XXX ...

3736
来自专栏F_Alex

Linux安装mysql(Redhat6.5+MySQL5.7)(转载+原创补漏)

2034

扫码关注云+社区

领取腾讯云代金券