`

【飞天奔月出品】使用Maven打all-in-one的包(带tests 和 sources)(多方案实现对比)

阅读更多

1.痛点

feilong-spring 项目子项目很多

使用 Maven依赖的话,要写很多代码

<project>

    ....
    <properties>
        <version.feilong-platform>1.9.6</version.feilong-platform>
        ....
    </properties>

    ....
    <repositories>
        <repository>
            <id>feilong-repository</id>
            <url>https://raw.github.com/venusdrogon/feilong-platform/repository</url>
        </repository>
    </repositories>

    ....
    <dependencies>
        ....
        <dependency>
            <groupId>com.feilong.platform.spring</groupId>
            <artifactId>feilong-spring-core</artifactId>
            <version>${version.feilong-platform}</version>
        </dependency>
        <dependency>
            <groupId>com.feilong.platform.spring</groupId>
            <artifactId>feilong-spring-aop</artifactId>
            <version>${version.feilong-platform}</version>
        </dependency>
        <dependency>
            <groupId>com.feilong.platform.spring</groupId>
            <artifactId>feilong-spring-context</artifactId>
            <version>${version.feilong-platform}</version>
        </dependency>
        <dependency>
            <groupId>com.feilong.platform.spring</groupId>
            <artifactId>feilong-spring-jdbc</artifactId>
            <version>${version.feilong-platform}</version>
        </dependency>
        <dependency>
            <groupId>com.feilong.platform.spring</groupId>
            <artifactId>feilong-spring-web</artifactId>
            <version>${version.feilong-platform}</version>
        </dependency>
        ....
    </dependencies>

    ....

</project>

能否做个 all-in-one 的jar(such as quartz-all,netty-all) ,只需要依赖这一个jar 即可?

2.解决方案

2.1 方案1:将所有的项目合并成一个项目

调整项目结构,类似于 feilong taglib issues1 ,但是 feilong-spring 不适合 ,文件太杂,维护起来很困难

image

2.2 方案2:使用 maven-antrun-plugin 插件

在我百思不得其解的时候,想起"咦,别人是怎么做的?",此时 github 开源的力量是无穷的,我查阅了quartz-all

他使用了 maven-antrun-plugin 插件, 我借鉴并修改成以下一版 pom.xml

<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>
    <parent>
        <groupId>com.feilong.platform.spring</groupId>
        <artifactId>parent</artifactId>
        <version>1.10.0-SNAPSHOT</version>
    </parent>

    <artifactId>feilong-spring-all</artifactId>
    <packaging>jar</packaging>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <id>packing-all</id>
                        <phase>process-sources</phase>
                        <configuration>
                            <tasks>
                                <copy todir="${project.build.directory}/classes">
                                    <fileset dir="${basedir}/../feilong-spring-aop/target/classes" />
                                    <fileset dir="${basedir}/../feilong-spring-context/target/classes" />
                                    <fileset dir="${basedir}/../feilong-spring-core/target/classes" />
                                    <fileset dir="${basedir}/../feilong-spring-jdbc/target/classes" />
                                    <fileset dir="${basedir}/../feilong-spring-mobile/target/classes" />
                                    <fileset dir="${basedir}/../feilong-spring-web/target/classes" />
                                </copy>
                            </tasks>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

2.2.1 依赖结果

随便找个项目,依赖下测试

<dependencies>
    ...
    <dependency>
        <groupId>com.feilong.platform.spring</groupId>
        <artifactId>feilong-spring-all</artifactId>
        <version>1.10.0-SNAPSHOT</version>
    </dependency>
    ...
</dependencies>

显示:

image

2.2.2 缺点:

没有source 以及 test 包

image

不利于查看javadoc 以及学习

2.3 方案3: 使用 maven-assembly-plugin插件

那么我们继续寻找其他方案, 咦,发现 shiro-all 在仓库中有 pom.xml

image

他是怎么做到的呢?

查看下他的源码 , 可以看到他使用了 maven-assembly-plugin 插件

pom.xml

<plugins>
    <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <executions>
            <execution>
                <id>make-bundles</id>
                <goals>
                    <goal>single</goal>
                </goals>
                <phase>package</phase>
                <!---->
                <configuration>
                    <descriptors>
                        <descriptor>src/main/assembly/assembly.xml</descriptor>
                    </descriptors>

                    <!-- We _do_ want the assembly output to be the actual artifact produced for this Maven module. -->
                    <!-- not append assembly id in release file name -->
                    <appendAssemblyId>false</appendAssemblyId>
                </configuration>
            </execution>
        </executions>
    </plugin>
</plugins>

assembly.xml

<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">

    <id>jar</id>

    <formats>
        <format>jar</format>
    </formats>

    <includeBaseDirectory>false</includeBaseDirectory>

    <dependencySets>
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <useProjectArtifact>false</useProjectArtifact>
            <unpack>true</unpack>
            <useTransitiveDependencies>false</useTransitiveDependencies>
        </dependencySet>
    </dependencySets>

</assembly>

2.3.1 缺点:

依赖 feilong-spring-all jar, 项目还会自动依赖 feilong-spring-all 所依赖的jar

image

image

shiro-all 1.4.0-RC2 写法也一样不行

image

重复依赖很明显

2.4 方案4: 使用 maven-shade-plugin 插件

shiro-all 1.3.2 支持 sources image

并且依赖之后,没有明显的重复依赖 :thumbsup: (This is what i want what i really really want)

image

shiro-all 1.3.2 系列使用的maven-shade-plugin 插件

image

2.4.1 feilong-spring-all 配置

feilong-spring-all pom.xml 配置如下

<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>

    <parent>
        <groupId>com.feilong.platform.spring</groupId>
        <artifactId>parent</artifactId>
        <version>1.10.0-SNAPSHOT</version>
    </parent>

    <artifactId>feilong-spring-all</artifactId>
    <packaging>jar</packaging>

    <properties>
        <v.maven-shade-plugin>2.4.3</v.maven-shade-plugin>
    </properties>

    <dependencies>

        <dependency>
            <groupId>com.feilong.platform.spring</groupId>
            <artifactId>feilong-spring-aop</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>com.feilong.platform.spring</groupId>
            <artifactId>feilong-spring-context</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>com.feilong.platform.spring</groupId>
            <artifactId>feilong-spring-core</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>com.feilong.platform.spring</groupId>
            <artifactId>feilong-spring-jdbc</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>com.feilong.platform.spring</groupId>
            <artifactId>feilong-spring-mobile</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>com.feilong.platform.spring</groupId>
            <artifactId>feilong-spring-web</artifactId>
            <version>${project.version}</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>${v.maven-shade-plugin}</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <!-- With version 2.2 of the maven-shade-plugin, they added a "shadeTestJar" option (see MSHADE-158): http://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html#shadeTestJar -->
                            <shadeTestJar>true</shadeTestJar>
                            <!-- When true, it will attempt to create a sources jar as well -->
                            <createSourcesJar>true</createSourcesJar>

                            <artifactSet>
                                <includes>
                                    <include>${project.groupId}:*:*</include>
                                </includes>
                            </artifactSet>

                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

配置方式中增加了两个属性参数:

2.4.2 feilong-spring-all deploy之后的情况

参见 https://github.com/venusdrogon/feilong-platform/tree/repository/com/feilong/platform/spring/feilong-spring-all/1.10.0-SNAPSHOT

image

可以看到 pom.xml ,jar,sources jar,tests jar 一应齐全,棒棒哒 :clap:

2.4.3 feilong-spring-all 被依赖情况

很完美,做到了只依赖feilong-spring-all,并且不再依赖 feilong-spring-all 自身依赖的jar

搞定,收工~~

3.参考

----完

分享到:
评论

相关推荐

    【飞天奔月出品】windows版nginx 快速操控神器(启动start,关闭stop,重启restart) 批处理

    标题中的“【飞天奔月出品】windows版nginx 快速操控神器(启动start,关闭stop,重启restart) 批处理”指的是一个专为Windows操作系统设计的Nginx管理工具,它通过批处理脚本实现了Nginx服务的便捷启动、停止和重启...

    兔子奔月吃月饼游戏源码-HTML-代码

    CSS3的新特性,如渐变、阴影、过渡和动画,可以实现游戏中的视觉特效,比如兔子跳跃、月饼旋转等动态效果。 再者,JavaScript是实现网页动态行为的关键,它赋予网页交互性。在这个案例中,JavaScript可能会包含游戏...

    HTML5小游戏【火贱兔奔月-425款经典优秀H5小游戏合集】游戏源码分享下载 - hjby.zip

    游戏源码分享下载 --- hjby.zipHTML5小游戏【火贱兔奔月--425款经典优秀H5小游戏合集】游戏源码分享下载 --- hjby.zipHTML5小游戏【火贱兔奔月--425款经典优秀H5小游戏合集】游戏源码分享下载 --- hjby.zipHTML5小...

    HTML5奔月游戏

    在这个例子中,文件名"jquery-game"可能意味着游戏的实现依赖于jQuery,这是一个广泛使用的JavaScript库,提供了便利的API用于操作DOM、处理事件和执行动画效果。 总的来说,"HTML5奔月游戏"展示了HTML5在游戏开发...

    小游戏源码-火贱兔奔月.rar

    "rar"格式是一种常见的压缩文件格式,用于存储多个相关文件在一个包内,便于传输和保存。 【标签】"源码" 表示这个资源的核心价值在于其代码内容。源码是程序的原始编写形式,可以被程序员修改、调试和扩展。对于...

    火箭兔奔月HTML5游戏源码

    `&lt;audio&gt;`和`&lt;video&gt;`标签则方便了音频和视频的嵌入,为游戏增加了音效和背景音乐。此外,`Web Storage`和`IndexedDB`允许游戏数据本地存储,即使在离线状态下也能继续游戏进度。 在火箭兔奔月这个游戏源码中,我们...

    HTML5实现兔子中秋奔月吃月饼游戏源码.zip

    文件“使用须知.txt”可能是提供关于如何运行和修改游戏的说明,包括如何在本地环境部署、如何查看和编辑源代码,以及可能的注意事项和版权信息。而“132692081374528955”这个文件名看起来像是一个随机生成的数字或...

    鲁迅《奔月》作品分析.pdf

    《奔月》是鲁迅先生的一篇短篇小说,收录于其《故事新编》之中,通过对传统神话的再创作,鲁迅以戏拟的手法揭示了深刻的社会与人性问题。这篇作品通过对后羿这一昔日英雄形象的塑造,反映出鲁迅对时代变迁下英雄命运...

    H5游戏源码 奔月游戏.zip

    《H5游戏源码解析:奔月游戏》 在当今数字化时代,HTML5(简称H5)技术以其跨平台、轻量级、易部署的特点,成为制作网页游戏的热门选择。"奔月游戏"作为一款H5游戏,其源码为我们提供了一窥H5游戏开发的窗口。本文...

    长娥奔月模板下载TIF

    【长娥奔月模板下载TIF】是一个与网页设计相关的资源,主要提供了一种以"长娥奔月"为主题的网页模版。这个模版可能是为了庆祝中国传统节日,如中秋节,或者用于讲述中国古老的神话故事。"长娥奔月"是中国文化中的...

    奔月生物:2021年半年度报告.PDF

    奔月生物:2021年半年度报告.PDF

    Photoshop合成奔月女孩梦幻艺术照片效果.doc

    这篇文档介绍了如何使用Adobe Photoshop软件创作一张奔月女孩的梦幻艺术照片效果。以下是详细步骤: 1. **新建文件与导入素材**: - 首先创建一个新文件,大小与素材1相同,命名为"奔月女孩"。 - 然后打开素材1,...

    H5小游戏源码 火贱兔奔月.zip

    通过深入研究这些源代码,学习者可以了解H5游戏开发的基本流程,如使用canvas画布进行绘图,利用requestAnimationFrame实现平滑动画,运用事件监听器响应用户操作,以及如何组织和优化代码以提高性能。同时,还可以...

    HTML5兔子奔月吃月饼游戏源码.zip

    游戏中的“兔子奔月”可能涉及到物理模拟,例如重力和速度的计算,使得兔子的动作更加真实。而“吃月饼”的交互设计则可能运用到碰撞检测算法,当兔子与月饼的位置满足特定条件时,触发得分增加或者月饼消失的事件。...

    HTML5兔子奔月吃月饼游戏源码.rar

    在这个游戏中,JavaScript用于处理用户输入,控制兔子的移动、跳跃,以及检测月饼的位置和碰撞,实现游戏逻辑。同时,JavaScript还可以用来实现分数计算和计时器功能,使游戏更具有挑战性。 CSS(层叠样式表)在...

    奔月生物:2021年半年度报告.rar

    【标题】:“奔月生物:2021年半年度报告.rar”是一个压缩文件,其中包含了一份关于奔月生物科技公司在2021年上半年业务运营、财务状况和业绩表现的详细报告。这类报告通常由上市公司发布,以供投资者、分析师和其他...

    HTML5奔月游戏 源码.zip

    在奔月游戏中,可能使用canvas来绘制角色、背景、轨迹等元素,并通过定时更新画面来实现动画效果。 2. **Web Audio API**:HTML5提供了Web Audio API,用于处理和播放音频。游戏往往需要背景音乐和音效,这个API...

    HTML5兔子奔月吃月饼游戏源码

    此外,JavaScript还可以实现计时器功能,确保游戏的帧率和时间管理。 3. **Web Audio API**: 音效是游戏体验的重要组成部分。HTML5的Web Audio API提供了一种在网页中播放和处理音频的方法。游戏可能包含各种音效,...

Global site tag (gtag.js) - Google Analytics