Hytale之我见 专注hytale服务器技术

正确的maven打jar包方式

2019-11-02
hytaleme

本文介绍了maven打jar包的三种方式,包括jar,assembly,shade三种,主要区别在于对依赖的处理方式,在使用maven开发spigot或hytale插件时也可以参考。

本文假设你已经了解java与maven

方式一:jar方式

这是maven默认的打包方式,使用maven-jar-plugin插件进行打包。 运行package后,就可以在target目录看到一个叫xxx.jar的jar包。

方式二:assembly方式

使用maven-assembly-plugin插件进行打包,这种方式会将所有依赖的类都提取出来放到一起,适合依赖不多的使用场景。 但如果一个项目依赖很多,一个依赖被引用了多次,并且是不同版本的,那可能会产生冲突,因为对于一个依赖最终只会包含一个版本。

使用方式很简单,在build.plugins里加入以下插件配置,在package阶段即可执行目标single,打包出包含依赖的jar包:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
</plugin>

运行package后,在打包出一个默认的xxx.jar外,还会有一个xxx-jar-with-dependencies.jar文件, 这就是包含依赖的jar包,可以看一下文件大小,通常会比前面不包含依赖的那个大很多。

如果你将包含依赖的jar包解压,可以看到类似下图的目录结构,可以看到所有依赖都提取出来了放在一起(就像它们都是你写的一样):

assembly打包结果

方式三:shade方式

使用maven-shade-plugin插件进行打包。

如果你的插件添加了某个依赖,但是spigot的服务端或另一个插件也引用了某个依赖的不同版本,而那个版本对某个方法的定义不同,那在调用那个方法时,总有一边会报错。 防止这种冲突的一种方法就是:使用maven的shade插件将依赖打包进来并修改依赖的包名

使用方式很简单,在build.plugins里加入以下插件配置,在package阶段即可执行目标shade,打包出包含依赖改名后的jar包:

<plugin>
    <artifactId>maven-shade-plugin</artifactId>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <createDependencyReducedPom>false</createDependencyReducedPom>
                <relocations>
                    <relocation>
                        <pattern>com.from</pattern>
                        <shadedPattern>com.to</shadedPattern>
                    </relocation>
                </relocations>
            </configuration>
        </execution>
    </executions>
</plugin>

运行package后,会打包出一个包含依赖改名后的xxx.jar包。

缺点:会增加要加载的类的数量。

总结

如果你在使用maven开发spigot或hytale插件,并且插件包含依赖,那正确的开发姿势应该是将依赖打包进来并修改包名。 否则,如果你不修改包名,其他人开发的某个插件也这样,而且包含了相同依赖的不同版本,那两个插件就可能产生冲突(这取决于那个依赖不同版本的兼容程度)。


上一篇 git学习教程

下一篇 lua学习教程

目录