当前位置: 首页 > article >正文

maven给springboot项目打成jar包 maven springboot打包配置

基于maven的spring boot 打包分离依赖及配置文件
使用springCloud或springboot的过程中,发布到生产环境的网速受限,如果每次将60,70M甚至更大的jar包上传,速度太慢了,采取jar包和配置文件分离的方式可以极大的压缩jar包大小,至于依赖的jar包则只需要上传一次,后期增加了jar包则将jar包加入到jar包文件夹内就可以了。配置文件也是一样,每次修改了才需要修改服务器文件,如果只是单纯的代码更新,我们直接打包上传源码jar包就可以了。直接在maven 的pom.xml<build>块配置。

1.设置两个自定义属性

<properties>
		<output.dependence.file.path>lib/</output.dependence.file.path>
		<output.resource.file.path>resources/</output.resource.file.path>
	</properties>

2.引入各种maven插件进行打包

<build>
		<!--最终打包名-->
		<finalName>${project.artifactId}-${project.version}-${timestamp}</finalName>

		<!--打包加GMT+8时间插件(默认是UTC时间少8小时)-->
		<plugins>
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>buildnumber-maven-plugin</artifactId>
				<version>1.4</version>
				<configuration>
					<timestampFormat>yyyyMMddHHmmss</timestampFormat>
				</configuration>
				<executions>
					<execution>
						<goals>
							<goal>create-timestamp</goal>
						</goals>
					</execution>
				</executions>
				<inherited>false</inherited>
			</plugin>

			<!--移除配置文件将其不打包进jar包中,并可以将打包后的jar包输出到指定路径 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				<configuration>
					 <!-- 剔除配置文件或目录:注意从编译结果目录开始算目录结构excludes\includes 是根据编译后的classes这个路径计算的-->
					<excludes>
					     <!-- 剔除指定后缀配置文件 -->
						<exclude>*.properties</exclude>
						<exclude>*.yml</exclude>
						<exclude>*/*.properties</exclude>
						<exclude>*/*.yml</exclude>
						<!-- 剔除指定目录 -->
						<exclude>/static/**</exclude>
                        <exclude>/templates/**</exclude>
                        <exclude>/mapper/**</exclude>
					</excludes>
					<archive>
						<manifest>
							<addClasspath>true</addClasspath>
							<!-- MANIFEST.MF 中 Class-Path 各个依赖加入前缀 -->
							<!--lib文件夹内容,需要 maven-dependency-plugin插件补充 (依赖包剥离位置)-->
							<classpathPrefix>${output.dependence.file.path}</classpathPrefix>
							<!-- jar包不包含唯一版本标识 -->
							<useUniqueVersions>false</useUniqueVersions>
							<!--指定入口类 -->
							<mainClass>com.egos.main.EgosQaApplication</mainClass>
						</manifest>
						<manifestEntries>
							<!--MANIFEST.MF 中 Class-Path 加入自定义路径,多个路径用空格隔开 -->
							<!--此处resources文件夹的内容,需要maven-resources-plugin插件补充上 (配置文件剥离位置)-->
							<Class-Path>./${output.resource.file.path}</Class-Path>
						</manifestEntries>
					</archive>
					<!--输出目录-->
					<outputDirectory>${project.build.directory}</outputDirectory>
				</configuration>
			</plugin>

			<!-- 将依赖包导出到指定文件夹 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-dependency-plugin</artifactId>
				<executions>
					<execution>
						<id>copy-dependencies</id>
						<phase>package</phase>
						<goals>
							<goal>copy-dependencies</goal>
						</goals>
						<configuration>
						<!--依赖包的输出路径-->	
						   <outputDirectory>${project.build.directory}/${output.dependence.file.path}</outputDirectory>
						</configuration>
					</execution>
				</executions>
			</plugin>

			<!-- 将需要复制的文件复制到指定路径(例:将配置文件提取到指定路径) -->
			<plugin>
				<artifactId>maven-resources-plugin</artifactId>
				<executions>
					<!-- 复制配置文件 -->
					<execution>
						<id>copy-resources</id>
						<phase>package</phase>
						<goals>
							<goal>copy-resources</goal>
						</goals>
						<configuration>
							<!-- 复制哪些目录下的哪些文件到指定目录 -->
							<resources>
								<resource>
									<directory>src/main/resources</directory>
									<!-- 不配置excludes\includes默认就是复制指定目录的所有文件 -->
									<includes>
										<include>*.properties</include>
										<include>*.yml</include>
										<include>*/*.properties</include>
										<include>*/*.properties</include>
									</includes>
								</resource>
							</resources>
							<outputDirectory>${project.build.directory}/${output.resource.file.path}</outputDirectory>
						</configuration>
					</execution>
				</executions>
			</plugin>

			<!-- spring-boot-maven-plugin可以不使用,可当做一般jar包来运行,可统一包内文件结构- -->
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<!--重写包含依赖,包含不存在的依赖,jar里没有pom里的依赖 -->
					<includes>
						<include>
							<groupId>null</groupId>
							<artifactId>null</artifactId>
						</include>
					</includes>
					<outputDirectory>${project.build.directory}</outputDirectory>
				</configuration>
				<executions>
					<execution>
						<goals>
							<goal>repackage</goal>
						</goals>
						<configuration>
							<!--配置jar包特殊标识 配置后,保留原文件,生成新文件 *-run.jar -->
							<!--配置jar包特殊标识 不配置,原文件命名为 *.jar.original,生成新文件 *.jar -->
							<!--<classifier>run</classifier> -->
						</configuration>
					</execution>
				</executions>
			</plugin>


			<!--maven打包时,跳过测试-->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-plugin</artifactId>
				<configuration>
					<skip>true</skip>
				</configuration>
			</plugin>


			<!-- 指定多个源代码目录、多个资源文件目录 -->
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>build-helper-maven-plugin</artifactId>
				<version>1.8</version>
				<executions>
					<execution>
						<id>add-source</id>
						<phase>generate-sources</phase>
						<goals>
							<goal>add-source</goal>
						</goals>
						<configuration>
							<sources>
								<source>src/main/java</source>
								<source>src/main/library</source>
							</sources>
						</configuration>
					</execution>
				</executions>
			</plugin>

			<!-- 编译插件 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
		</plugins>
	</build>

打包后效果

3.把lib和 resources打包成压缩包上传到springBoot项目所在的服务器并且和springBoot项目位于同级目录

4.nohup java -jar xxx.jar --server.port=端口 &启动项目

5.如果springBoot项目启动报Failed to scan [file:xxxx.jar] from classloader hierarchy,此错误并不会影响到项目的正常运行
原因: 由于springboot项目自带tomcat插件,冲突导致解决方案:检查pom.xml文件找到以下内容,删除掉。再次启动就不会有警告了

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.tomcat.embed</groupId>
			<artifactId>tomcat-embed-jasper</artifactId>
			<scope>provided</scope>
		</dependency>

maven-compiler-plugin插件描述
maven是个项目管理工具,如果我们不告诉它我们的代码要使用什么样的jdk版本编译的话,它就会用maven-compiler-plugin默认的jdk版本来进行处理,这样就容易出现版本不匹配的问题,以至于可能导致编译不通过的问题。例如代码中要是使用上了jdk1.7的新特性,但是maven在编译的时候使用的是jdk1.6的版本,那这一段代码是完全不可能编译成.class文件的。为了处理这一种情况的出现,在构建maven项目的时候,我习惯性第一步就是配置maven-compiler-plugin插件。

maven的默认编译使用的jdk版本貌似很低,使用maven-compiler-plugin插件可以指定项目源码的jdk版本,编译后的jdk版本,以及编码

<plugin>                                                                                                                                      
    <!-- 指定maven编译的jdk版本,如果不指定,maven3默认用jdk 1.5 maven2默认用jdk1.3 -->                                                                           
    <groupId>org.apache.maven.plugins</groupId>                                                                                               
    <artifactId>maven-compiler-plugin</artifactId>                                                                                            
    <version>3.1</version>                                                                                                                    
    <configuration>                                                                                                                           
        <!-- 一般而言,target与source是保持一致的,但是,有时候为了让程序能在其他版本的jdk中运行(对于低版本目标jdk,源代码中不能使用低版本jdk中不支持的语法),会存在target不同于source的情况 -->                    
        <source>1.8</source> <!-- 源代码使用的JDK版本 -->                                                                                             
        <target>1.8</target> <!-- 需要生成的目标class文件的编译版本 -->                                                                                     
        <encoding>UTF-8</encoding><!-- 字符集编码 -->
        <skipTests>true</skipTests><!-- 跳过测试 -->                                                                             
        <verbose>true</verbose>
        <showWarnings>true</showWarnings>                                                                                                               
        <fork>true</fork><!-- 要使compilerVersion标签生效,还需要将fork设为true,用于明确表示编译版本配置的可用 -->                                                        
        <executable><!-- path-to-javac --></executable><!-- 使用指定的javac命令,例如:<executable>${JAVA_1_4_HOME}/bin/javac</executable> -->           
        <compilerVersion>1.3</compilerVersion><!-- 指定插件将使用的编译器的版本 -->                                                                         
        <meminitial>128m</meminitial><!-- 编译器使用的初始内存 -->                                                                                      
        <maxmem>512m</maxmem><!-- 编译器使用的最大内存 -->                                                                                              
        <compilerArgument>-verbose -bootclasspath ${java.home}\lib\rt.jar</compilerArgument><!-- 这个选项用来传递编译器自身不包含但是却支持的参数选项 -->               
    </configuration>                                                                                                                          
</plugin>

如果jdk1.8版本的项目不使用maven-compiler-plugin指定编译版本maven会报出编译错误


-----------------------------------
maven给springboot项目打成jar包 maven springboot打包配置
https://blog.51cto.com/u_16213575/10523385


http://www.kler.cn/a/325986.html

相关文章:

  • 基于Spring Boot+Unipp的博物馆预约小程序(协同过滤算法、二维码识别)【原创】
  • 浅谈数据仓库的架构及其演变
  • Javascript高级—函数柯西化
  • 结构化需求分析与设计
  • 校园二手交易网站毕业设计基于SpringBootSSM框架
  • 游戏引擎学习第13天
  • 深入解析 NoSQL 数据库的分类与特点
  • Qt5和Qt6获取屏幕的宽高,有区别
  • CSS宽度和高度
  • C++的6种构造函数
  • 8月面试总结
  • sql注入工具升级:自动化时间盲注、布尔盲注
  • IT基础监控范围和对象
  • Excel 获取某列不为空的值【INDEX函数 | SMALL函数或 LARGE函数 | ROW函数 | ISBLANK 函数】
  • Linux编译与调试
  • 四非人的保研之路,2024(2025届)四非计算机的保研经验分享(西南交通、苏大nlp、西电、北邮、山软、山计、电科、厦大等)
  • docker管理
  • qt使用QDomDocument读写xml文件
  • 10分钟制作一个简易的word模版
  • 在 React 项目中渲染 Markdown 文件
  • 【深圳大学】大学物理实验2 光栅光谱仪 预习参考
  • 国产RISC-V蓝牙MCU推荐
  • 【mysql相关总结】
  • 个人文章合集 - 前端相关
  • docker 部署 WEB IDE
  • 用 Go 和 Redis 构建一个简单的任务管理系统