maven打可执行jar包:配置文件外置,依赖和配置文件打在外面

需求说明

开发工具:
Intellij IDEA
需求:
1. 通过java -jar demo.jar命令可以直接执行
2. 打thin包,依赖jar包与代码分开,依赖包放在lib同级目录下
3. 配置文件外置,配置文件放在config同级目录下,demo.jar中不包含配置文件
4. 指定jar包编译级别为jdk1.8
5. 不把maven相关配置打入jar包中
6. 把配置文件放在config目录下的同时不影响调试(IDEA调试的时候默认是从target目录下读取配置文件的)

maven配置

pom.xml具体配置(仅build相关配置):

<build>
	<!--   所在打的jar包的名字     -->
	<finalName>demo</finalName>
	<sourceDirectory>src/main/java</sourceDirectory>
	<testSourceDirectory>src/test/java</testSourceDirectory>
	<outputDirectory>target</outputDirectory>
	<!-- 控制resources资源文件的拷贝, -->
	<!-- 这里需要配置两个resource -->
	<!-- 一个resource控制把配置文件放在target目录下用于调试 -->
	<!-- 一个resource控制把配置文件放在target/config目录下用于部署生产环境 -->
	<resources>
		<!-- 配置文件复制到target目录下,不然开发调试的时候会报错 -->
		<resource>
			<!-- 资源文件的路径,不配置的话默认位于src/main/resources/目录下,  -->
			<directory>src/main/resources</directory>
			<!-- 是否对资源文件进行过滤 -->
			<filtering>true</filtering>
			<!-- 这里没有配置targetPath,默认复制到outputDirectory目录下  -->
		</resource>
		<!-- 配置文件放在target/config目录下 -->
		<resource>
			<directory>src/main/resources</directory>
			<targetPath>${project.build.directory}/config</targetPath>
		</resource>
	</resources>

	<!-- maven 构建配置 -->
	<plugins>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-jar-plugin</artifactId>
			<version>3.1.0</version>
			<configuration>
				<archive>
					<addMavenDescriptor>false</addMavenDescriptor>
					<!-- 清单文件 -->
					<!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 -->
					<manifest>
						<mainClass>com.yamu.bigdata.product.probe.sample.Main</mainClass>
						<addClasspath>true</addClasspath>
						<classpathPrefix>lib/</classpathPrefix>
					</manifest>
					<!-- 配置文件外置,需要把配置文件目录加入到classpath -->
					<manifestEntries>
						<Class-Path>config/</Class-Path>
					</manifestEntries>
				</archive>
				<!-- 指定需要把哪些文件打入到jar包中,  -->
				<!-- ** 代表jar包根目录 -->
				<!-- **/com/ 代表jar包根目录下仅包含com目录(我所有的程序都在com包下), 当然打好之后还会包含生成的manifest目录 -->
				<!-- 注意com后面的/一定不要省去,不然maven会认为这是一个文件名 -->
				<!-- includes或者excludes一定要指定,不然会把target下所有的文件都打进去 -->
				<includes>
					<include>**/com/</include>
				</includes>
				<excludes>
					<exclude>**/mappings/</exclude>
				</excludes>
			</configuration>
		</plugin>
		<!-- 拷贝依赖的jar包到lib目录 -->
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-dependency-plugin</artifactId>
			<version>3.1.0</version>
			<executions>
				<execution>
					<id>copy</id>
					<phase>package</phase>
					<goals>
						<goal>copy-dependencies</goal>
					</goals>
					<configuration>
						<!-- 拷贝依赖的jar包到lib目录 -->
						<outputDirectory>
							${project.build.directory}/lib
						</outputDirectory>
					</configuration>
				</execution>
			</executions>
		</plugin>
		<!-- 解决资源文件的编码问题 -->
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-resources-plugin</artifactId>
			<version>3.1.0</version>
			<configuration>
				<encoding>UTF-8</encoding>
			</configuration>
		</plugin>
		<!-- 打包source文件为jar文件 -->
		<plugin>
			<artifactId>maven-source-plugin</artifactId>
			<version>3.1.0</version>
			<configuration>
				<attach>true</attach>
			</configuration>
			<executions>
				<execution>
					<phase>compile</phase>
					<goals>
						<goal>jar</goal>
					</goals>
				</execution>
			</executions>
		</plugin>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<configuration>
				<!-- 指定jdk编译级别为jdk1.8 -->
				<source>8</source>
				<target>8</target>
				<!--  跳过单元测试-->
				<skip>true</skip>
			</configuration>
		</plugin>
		
		<!-- maven-surefire-plugin 用于配置执行JUnit单元测试,这里无所谓 -->
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-surefire-plugin</artifactId>
			<version>3.0.0-M1</version>
			<configuration>
				<!-- 跳过单元测试-->
				<skip>true</skip>
			</configuration>
		</plugin>
	</plugins>
</build>

结果验证

maven打包
打包后的结果
jar包内部

最后我们可以看下jar包里面的manifest文件:META-INF/MANIFEST.MF
1. 所有的lib目录下的依赖jar包都加入到了classpath
2. config目录下的配置文件也加入到了classpath
3. 主程序的入口也指定了
MANIFEST.MF

  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
spring-boot-maven-plugin 是一个 Maven 插件,它可以将 Spring Boot 应用程序打包成可执行JAR 文件,同也可以将应用程序的依赖打包成内置的 JAR 文件。这个插件还有一个很棒的功能,就是它可以将应用程序的配置文件打包JAR 包之,这样在应用程序升级,可以直接替换现有的 JAR 文件而不需要担心会覆盖配置文件。 在默认的情况下,Spring Boot 将 application.properties 或者 application.yml 文件打包JAR 包的根目录下,这种默认的方式并不是最好的,因为在应用程序升级配置文件会被一起打包进去,这样会产生一些困扰,比如你需要手动备份这些配置文件。 为了解决这个问题,spring-boot-maven-plugin 插件提供了一个很好的解决方案,就是将配置文件打包JAR 包之,具体的做法是在 pom.xml 文件中添加如下配置: ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <classifier>exec</classifier> </configuration> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> <configuration> <classifier>exec</classifier> <compress>false</compress> <shutdown>graceful</shutdown> <finalName>${project.artifactId}-${project.version}-exec</finalName> </configuration> </execution> </executions> </plugin> </plugins> </build> ``` 这个配置中添加了一个 classifier 属性,它会创建一个带有 exec 后缀的 JAR 包,该 JAR 包除了包含应用程序的类文件依赖项,还会包含配置文件和其他静态资源文件。在 pom.xml 文件中加入以上配置,并在应用程序的根目录下创建一个名为 config 的目录,将配置文件放置在该目录中,然后重新编译和打包应用程序,你将会得到一个新的 JAR 文件,该文件会在根目录下生成一个名为 config 的文件夹,其中包含你的配置文件。这样就实现了将配置文件打包JAR 包之的目的。 总结一下,spring-boot-maven-plugin 插件提供了一个将应用程序的配置文件打包JAR 包之的方式,只需要在 pom.xml 文件配置一个 classifier 属性即可实现。这样可以避免在应用程序升级面临配置文件被覆盖的问题,也便于组织和管理配置文件
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值