Maven jdeb插件打包生成两个deb包,如何屏蔽默认输出的包?
问题原因
你配置的jdeb插件执行两次的核心原因是:
- 你将项目的
<packaging>设置为deb后,jdeb扩展会自动注册一个id为default-jdeb的执行绑定到package生命周期阶段,走默认配置生成deb包 - 你额外新增了一个jdeb执行,没有覆盖默认的执行逻辑,所以两次执行分别生成了默认包和自定义包
另外执行mvn jdeb:jdeb仅生成默认包,是因为命令行直接调用插件goal时,默认读取插件全局配置,不会读取execution内的配置,且你当前的插件配置放在pluginManagement节点下,当前模块不会直接生效。
解决方法
按照如下步骤修改你的pom即可:
- 将自定义的jdeb execution的id改为
default-jdeb,覆盖默认的执行逻辑,避免重复执行 - 把jdeb插件从
pluginManagement节点下移到build -> plugins节点下,让当前模块直接读取配置 - 如果需要
mvn jdeb:jdeb命令也使用你的自定义配置,可将configuration节点提到plugin全局级别,不要放在execution内部
修改后的完整pom示例
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>debtest</groupId> <artifactId>debtestpackage</artifactId> <version>100</version> <packaging>deb</packaging> <name>debtestpackage</name> <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties> <build> <extensions> <extension> <groupId>org.vafer</groupId> <artifactId>jdeb</artifactId> <version>1.9</version> </extension> </extensions> <plugins> <plugin> <groupId>org.vafer</groupId> <artifactId>jdeb</artifactId> <version>1.9</version> <!-- 全局配置,命令行调用也会生效 --> <configuration> <deb>${project.basedir}/target/debtest_${project.version}.deb</deb> <type>deb</type> <controlDir>${project.basedir}/src/deb/control</controlDir> <dataSet> <data> <src>${project.basedir}/../debtest/target/debtest-${project.version}.jar</src> <type>file</type> <mapper> <type>perm</type> <prefix>/opt/debtest</prefix> </mapper> </data> </dataSet> </configuration> <executions> <execution> <!-- id改为default-jdeb覆盖默认执行 --> <id>default-jdeb</id> <phase>package</phase> <goals> <goal>jdeb</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
修改后执行mvn clean package只会生成你自定义的debtest_100.deb,执行mvn jdeb:jdeb也会生成相同的自定义包。
内容的提问来源于stack exchange,提问作者Bahati Mbaya
相关产品推荐
相关产品推荐

