Maven 插件之shade 使用

背景

maven shade 插件,基本开发过程中很少使用过,但是,在之前公司负责过 ES 网关和数据同步系统的时候,仔细研究过。在现在的公司,负责网关元数据开发(之前也开发网关),也是用了这个shade 插件。

此 shade 插件有何用处

maven 插件列表:http://maven.apache.org/plugins/index.html
shade 插件使用:http://maven.apache.org/plugins/maven-shade-plugin/
将当前项目所有的依赖都打包成一个巨大的 jar,此jar 和 spring boot 打出来的 jar 略有不同。

如何使用

在 maven 3.2.4 版本之后,可以使用此命令来执行 shade 操作。
 mvn clean -Dmaven.test.skip=true  -Dspring-boot.repackage.skip=true package source:jar shade:shade 

效果

image.png

image.png

但是,有时候,我们想在代码层面来控制,怎么办呢?

添加依赖

 <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-model-builder</artifactId>
            <version>3.6.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-model</artifactId>
            <version>3.6.0</version>
        </dependency>

代码实现

 public void addPluginToPublishModulePom(String publishModulePomPath) {
        try {
            FileInputStream fis = new FileInputStream(new File(publishModulePomPath));
            MavenXpp3Reader reader = new MavenXpp3Reader();
            Model model = reader.read(fis);

            Build build = model.getBuild();
            if (build == null) {
                build = new Build();
                model.setBuild(build);
            }

            List<Plugin> pluginList = model.getBuild().getPlugins();

            boolean existsMavenSourcePlugin = false;
            boolean existsMavenShadePlugin = false;

            if (CollectionUtils.isNotEmpty(pluginList)) {
                for (Plugin plugin : pluginList) {
                    if (StringUtils.equalsIgnoreCase("maven-source-plugin", plugin.getArtifactId())) {
                        existsMavenSourcePlugin = true;
                    }
                    if (StringUtils.equalsIgnoreCase("maven-shade-plugin", plugin.getArtifactId())) {
                        existsMavenShadePlugin = true;
                    }
                }
            }

            if (!existsMavenShadePlugin) {
                addMavenShadePlugin(model);
            }
            if (!existsMavenSourcePlugin) {
                addMavenSourcePlugin(model);
            }

            File outputPomPath = new File(publishModulePomPath);
            DefaultModelWriter defaultModelWriter = new DefaultModelWriter();
            defaultModelWriter.write(outputPomPath, new HashMap<>(), model);

        } catch (Exception e) {
            log.error("addPluginToPublishModulePom exception ,publishModulePomPath:{} ,e:{}", publishModulePomPath, e);
        }
    }


    private void addMavenSourcePlugin(Model model) {
        PluginExecution pluginExecution = new PluginExecution();
        pluginExecution.setGoals(Lists.newArrayList("jar-no-fork"));
        pluginExecution.setId("attach-sources");
        pluginExecution.setPhase("verify");

        Plugin mavenSourcePlugin = new Plugin();
        mavenSourcePlugin.setArtifactId("maven-source-plugin");
        mavenSourcePlugin.setVersion("3.0.1");
        mavenSourcePlugin.setExecutions(Lists.newArrayList(pluginExecution));
        model.getBuild().getPlugins().add(mavenSourcePlugin);
    }

    private void addMavenShadePlugin(Model model) {
        PluginExecution pluginExecution = new PluginExecution();
        pluginExecution.setGoals(Lists.newArrayList("shade"));
        pluginExecution.setPhase("package");

        Plugin mavenShadePlugin = new Plugin();
        mavenShadePlugin.setArtifactId("maven-shade-plugin");
        mavenShadePlugin.setGroupId("org.apache.maven.plugins");
        mavenShadePlugin.setVersion("3.1.1");
        mavenShadePlugin.setExecutions(Lists.newArrayList(pluginExecution));

        final Xpp3Dom mavenPluginConfiguration = new Xpp3Dom("configuration");
        final Xpp3Dom artifactSet = new Xpp3Dom("artifactSet");
        mavenPluginConfiguration.addChild(artifactSet);

        final Xpp3Dom includes = new Xpp3Dom("includes");
        artifactSet.addChild(includes);

        String packagePrefixString = ConfigService.getAppConfig().getProperty("maven.shade.plugin", "[]");

        List<String> packagePrefixList = JSON.parseArray(packagePrefixString, String.class);

       // 做一些过滤,减少包的大小
        if (CollectionUtils.isNotEmpty(packagePrefixList)) {
            packagePrefixList.stream().forEach(packagePrefix -> {
                final Xpp3Dom packagePrefixDom = new Xpp3Dom("include");
                packagePrefixDom.setValue(packagePrefix + ".*:*");

                includes.addChild(packagePrefixDom);
            });
        }

        mavenShadePlugin.setConfiguration(mavenPluginConfiguration);
        model.getBuild().getPlugins().add(mavenShadePlugin);
    }

最终效果

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 说明:打包maven结构项目的工程,不能像打包javaweb工程一样,直接通过配置新的Java Applicati...
    Xiangdong_She阅读 2,900评论 0 4
  • Maven 插件 参考资料: http://maven.apache.org/components/plugins...
    点点渔火阅读 3,098评论 0 0
  • 大家好,我是IT修真院郑州分院第6期的学员,一枚正直纯洁善良的JAVA程序员今天给大家分享一下,Maven常用打包...
    一筒君阅读 2,362评论 0 0
  • Maven这个词可以翻译为“知识的积累”,也可以翻译为“专家”或“内行”。作为Apache组织中的一个颇为成功的开...
    刚子来简书啦阅读 196评论 0 0
  • 一. 自带核心插件 https://maven.apache.org/plugins/ 二. 第三方插件 1.ma...
    Saxon_323e阅读 591评论 0 1