一、程序为什么要打包
程序打包的主要目的是将项目的源代码、依赖库和其他资源打包成一个可执行的文件或者部署包,方便程序的发布和部署。以下是一些打包程序的重要理由:
-
方便部署和分发:打包后的程序可以作为一个独立的实体,方便复制和部署到不同的环境中,包括开发、测试和生产环境。打包后的程序通常包含了所有需要的依赖和配置,并且已经做好了预处理(如编译、压缩、优化等),减少了部署和配置的复杂性。
-
保护源代码:打包后的程序通常会将源代码进行编译和打包,以二进制形式进行发布。这样可以保护源代码的安全性,防止他人对源代码的篡改。
-
管理依赖关系:在打包过程中,Maven 或其他构建工具可以自动将项目所需的依赖库打包到最终的可执行文件中。这样可以简化项目的依赖管理,减少对外部库和组件的依赖,提高了项目的独立性和可移植性。
二,使用maven打包java程序
maven内置很多插件,可以非常方便打包。
2.1使用maven-resources-plugin管理资源
maven-resources-plugin插件负责复制过滤资源文件到制定目录。程序项目的配置可分为两种,一种是静态配置,用于程序内部,即使重复部署也无需改动,比如log4j,定时任务配置quartz等。另外一种是动态配置,用于运维部署动态调整的。
2.1.1maven处理静态资源
maven对于静态资源,一般无需额外处理。我们可以把静态资源放置在maven项目的src/main/resources目录。程序打包的时候就会默认处理。
2.1.2maven处理动态资源
对于动态资源,我们一般会在程序源代码的同级目录新增一个文件夹,例如叫做config,用来放置所有的动态资源。典型的动态有数据库配置jdbc,socket配置等等。如果同样一份代码,需要在很多机器部署,例如,游戏服务器往往有好几千个游戏区,每个游戏区的代码都是一样的,只是动态资源不一样。运维在部署的时候,只需要修改动态配置。还可以使用诸如ansible之类自动化运维工具,做到一键部署全部服务器。
例如jforgame,把动态资源放置在config文件,如下所示:
maven-resources-plugin插件配置,把config配置全部拷贝到jar包输出目录。
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<!-- 配置文件要跟jar包在同一个目录 -->
<id>copy-config</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/configs</outputDirectory>
<resources>
<resource>
<directory>configs/</directory>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
2.2使用maven-dependency-plugin复制依赖
程序在部署的时候一般采用“瘦客户端”模式,可执行包内部只包含业务代码,不包含第三方依赖。这样可以减小目标包的体积(第三方依赖一般不变,只在初次部署使用),加快启动速度。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-jars</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/libs</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
2.3使用maven-jar-plugin打可执行包
前面两个插件都是处理资源的,这个插件才是真正将代码进行打包的,我们先来通过配置进行说明。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<archive>
<manifestEntries>
<Class-Path>configs/</Class-Path>
</manifestEntries>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>libs/</classpathPrefix>
<mainClass>jforgame.demo.ServerStartup</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<mainClass>作用:申明jar包启动类
<Class-Path>作用:把自定义的config动态配置文件夹添加到MANIFEST.MF的Class-Path标签。
<addClasspath>+<classpathPrefix>作用:把maven-dependency-plugin引入的libs下所有第三方依赖统一添加到MANIFEST.MF的Class-Path标签。相关配置放在MANIFEST.MF文件(用rar程序打开目标包)。