java Springboot maven项目打包成可执行jar包

本文介绍了如何在Springboot项目中打包成可执行jar文件,并利用Quartz定时任务在启动时自动执行指定方法。首先,配置了Springboot项目的基本依赖,包括数据库连接和Mybatis。然后,通过实现ApplicationRunner接口尝试在启动时执行方法,但由于生产环境数据库的限制,此方法未成功。最终,选择了使用Quartz定时任务来达到目的,详细配置了Quartz的相关xml文件,并在启动时立即执行一次任务。项目打包后,通过cmd使用`mvn clean package`命令生成jar文件,测试验证了功能的正确性。

Springboot 如何打包成可执行jar文件,并在jar文件启动时自动执行指定方法

创建一个maven项目准备工作。

首先得配置好jdk与maven的环境。
下载路径为
JDK,下载地址:(http://www.oracle.com/technetwork/java/javase/downloads/index.html)
Maven 下载地址:(http://maven.apache.org/download.cgi)
具体配置流程可以参考:(https://www.runoob.com/maven/maven-setup.html)

添加依赖

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
    
		<dependency>
      		<groupId>org.springframework</groupId>
   			 <artifactId>spring-context-support</artifactId>
    		 <version>4.3.5.RELEASE</version>
		</dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>
        <dependency>
              <groupId>mysql</groupId>
              <artifactId>mysql-connector-java</artifactId>
          </dependency>
          
        <dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.1.1</version>
		</dependency>
        <dependency>
    		<groupId>org.apache.poi</groupId>
    		<artifactId>poi</artifactId>
   			 <version>3.15</version>
		</dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
       
   	 </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

添加启动页

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

注意:@springBootApplication最好放在最外层避免启动时有遗漏的bean没有被注入spring容器中
@SpringBootApplication = (默认属性)@Configuration + @EnableAutoConfiguration + @ComponentScan。

添加service与dao层

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.example.dao.TaskBatMapper;
import com.example.entity.PortalPipelineVOImpl;


@Service
public class TaskBatServiceImpl {
	@Autowired
	TaskBatMapper restmapper;
	public List<PortalPipelineVOImpl> find(){
		return restmapper.find();
	}
}
dao层的mapper接口
import java.util.List;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import com.example.entity.PortalPipelineVOImpl;

@Mapper
public interface TaskBatMapper {
	@Select("select pipeline_id,project_description from portal_pipeline")
	public List<PortalPipelineVOImpl> find();
}

实体类


public class PortalPipelineVOImpl {
	
	private	String id;
	
	private	String pipelineId;

	private String projectDescription;

	public	String getId(){
		return id;
	
	public	void setId(String id){
		this.id = id;
	}
	public	String getPipelineId(){
		return pipelineId;
	}
	
	public	void setPipelineId(String pipelineId){
		this.pipelineId = pipelineId;
	}
	public	String getProjectDescription(){
		return projectDescription;
	}
	
	public	void setProjectDescription(String projectDescription){
		this.projectDescription = projectDescription;
	}

配置文件需要配置数据源

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.max-idle=10
spring.datasource.max-wait=10000
spring.datasource.min-idle=5
spring.datasource.initial-size=5

由于我这边的实体类与数据库存放字段不同多了_,所以需要配置驼峰

mybatis.configuration.mapUnderscoreToCamelCase=true
mapper.mappers=com.example.dao.TaskBatMapper
mapper.identity=MYSQL

这样配置完成后大致上的流程就可以跑通了.

接下来就是进入业务了

因为客户需求需要我这边写一个maven项目并打包成一个可执行的jar文件,再配合.bat文件提供给客户,然后客户可以通过.bat文件拿到指定数据库表中的数据并经过java逻辑编辑成的excel或者csv文件。
本来说点击一次启动一次项目,就可以在启动时执行特定的方法生成excel/csv文件,当时就想到有两种方法,一种是方法重写ApplicationRunner接口的run方法,一种是使用quratz定时任务。

ApplicationRunner方式
ApplicationRunner接口的执行时机为容器启动完成的时候,是在项目完成前启动。像我这个需求就不适应了,因为我这需求需要访问数据库并进行操作,在maven install中得先编译一次再打包,但是我这边本地数据库与生产数据库不同,并且我这边是连接不上生产数据库,使用本地数据库是没问题的但是切换成生产数据库就不行了,使用命令 mvn clean package也没用也逃避不了得先执行实现接口的run方法,就会出现这样的问题。
在这里插入图片描述当然你可以先用自己本地的数据库打包出jar文件,然后通过其他方式修改配置文件中数据源的信息,理论上好像是行得通,但是我这边没有具体的操作,有兴趣的小伙伴可以试试。

quartz方式
定时任务是在项目启动后才运行
先添加定时任务的依赖

 <dependency>
         <groupId>org.quartz-scheduler</groupId>
         <artifactId>quartz</artifactId>
         <version>2.2.1</version>
		</dependency>
		<dependency>
         <groupId>org.quartz-scheduler</groupId>
         <artifactId>quartz-jobs</artifactId>
         <version>2.2.1</version>
         </dependency>

由于这边不太熟悉定时任务注解,所以这边还是打算用一个xml文件配置相关信息。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:cache="http://www.springframework.org/schema/cache"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd 
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/cache
        http://www.springframework.org/schema/cache/spring-cache.xsd">
    <!-- 定时器工作调度的bean class后指定匹配的定时任务类-->
    <bean id="quartDemo" class="com.example.action.QuartzDemo" />
    <!-- job的配置开始 -->
    <bean id="quartDemoDetail"
        class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject">
            <ref bean="quartDemo" />
        </property>
        <property name="targetMethod">
            <value>work</value>
        </property>
    </bean>
    <!-- 调度的配置开始 -->
    <bean id="crontestJobTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail">
            <ref bean="quartDemoDetail" />
        </property>
        <property name="cronExpression">
            <value>0 0 14 * *  ?</value>
        </property>
    </bean>
  
    <!-- 启动触发器的配置开始 -->
    <bean name="startQuertz" lazy-init="false" autowire="no"
        class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="crontestJobTrigger" />
            </list>
        </property>
    </bean>
</beans>

添加configClass类进行加载xml文件。

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;

@Configuration
@ImportResource(locations={"classpath:applicationContext-quartz.xml"})
public class ConfigClass {

}

需要在项目启动时就加载一次配置

  <!-- 配置项目启动后任务就执行一次 -->  
    <bean id="rsh_simpleTrigger1" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">  
        <property name="jobDetail" ref="quartDemoDetail" />  
        <property name="startDelay" value="500" />  
        <property name="repeatInterval" value="0" />  
        <property name="repeatCount" value="0" />  
    </bean>
     <!-- 启动触发器的配置开始 -->
    <bean name="startQuertz" lazy-init="false" autowire="no"
        class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
            <!--新增 start-->
             	<ref bean="rsh_simpleTrigger1" />
             <!--end-->
                <ref bean="crontestJobTrigger" />
            </list>
        </property>
    </bean>

如果说只需要执行一次的话并不需要周期性的执行可以将配置文件中id为crontestJobTrigger的bean与下面触发器绑定的bean删除即可。
具体逻辑我就不贴代码出来了,跑一下的结果,是没有没问题的。
在这里插入图片描述
然后打包,我一开始发现我的eclipse 项目 右键run as中没有maven package,但是有maven clean ,maven install,这就很离谱了,所以找到文件目录下,启动cmd 输入mvn clean package,运行结果。
在这里插入图片描述
发现也是没有问题的。
总算是大功告成了。

将jar包在普通机上进行测试,由于普通机上没有java 的开发环境所以不能直接使用java -jar jarfile.jar,得配合jdk一同使用,具体命令为 jdkpath\bin\java.exe -jar jarfile.jar启动。
最后贴下项目路径吧。

总结

第一次写博客,有很多不足的地方还是希望小伙伴们提出来一同探讨一同学习。
也感谢该博主的quartz分享 https://my.oschina.net/fwe/blog/1600349

<think>我们正在讨论如何将Spring Boot工程打包可执行jar。根据引用[1]和[5],Spring Boot默认打包方式就是生一个可执行的fat jar含所有依赖和内置Tomcat)。以下是如何实现: ### 方法一:使用Maven插件(推荐) 1. 在`pom.xml`中添加Spring Boot Maven插件: ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> ``` 2. 执行Maven打包命令: ```bash mvn clean package ``` 3. 生jar位于`target/`目录,文件名格式为`{project-name}-{version}.jar`,可直接运行: ```bash java -jar target/your-project.jar ``` ### 方法二:使用Gradle 1. 在`build.gradle`中应用插件: ```groovy plugins { id 'org.springframework.boot' version '3.2.0' } ``` 2. 执行打包: ```bash ./gradlew bootJar ``` 3. 生jar在`build/libs/`目录下。 ### 注意事项 1. **主类检测**:插件会自动检测带有`@SpringBootApplication`注解的主类[^1]。 2. **打包失败处理**:若提示"找不到主类",可手动指定主类: ```xml <configuration> <mainClass>com.example.YourMainClass</mainClass> </configuration> ``` ### 生可执行jar(供依赖使用) 若需同时生普通jar(作为库),参考引用[4]配置: ```xml <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <classifier>exec</classifier> <!-- 可执行jar添加exec后缀 --> </configuration> </plugin> ``` 此时将生两个jar: - `your-project.jar` → 普通jar(不含依赖) - `your-project-exec.jar` → 可执行jar --- ### 相关问题 1. Spring Boot可执行jar和普通war部署有何区别? 2. 如何排除Spring Boot内嵌Tomcat并使用外部Tomcat部署? 3. 多模块项目中如何正确配置Spring Boot打包插件? 4. 如何为Spring Boot可执行jar添加外部配置文件? 5. Spring Boot 3.x在打包机制上有哪些更新? [^1]: Spring Boot项目打包可执行jar的方法 [^4]: 同时生可执行jar和普通jar的方法 [^5]: Spring Boot Maven插件基本配置</think>### Spring Boot工程打包可执行JAR的方法 #### 一、基础配置(Maven项目) 1. **添加Spring Boot Maven插件**(关键步骤) 在`pom.xml`中添加以下配置: ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> ``` 这是生可执行JAR的核心插件[^5]。 2. **执行打包命令** ```bash mvn clean package ``` 生JAR位于`target/`目录下,文件名格式为`{project-name}-{version}.jar` 3. **运行JAR** ```bash java -jar target/your-project-0.0.1.jar ``` --- #### 二、特殊场景处理 1. **自定义主类**(当自动检测失败时) ```xml <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>com.example.YourApplication</mainClass> </configuration> </plugin> ``` 2. **同时生可执行JAR和普通JAR** ```xml <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <classifier>exec</classifier> </configuration> </plugin> ``` 将生两个文件: - `your-project.jar`(普通JAR) - `your-project-exec.jar`(可执行JAR)[^4] --- #### 三、Gradle项目配置 1. **添加插件** 在`build.gradle`中: ```groovy plugins { id 'org.springframework.boot' version '3.2.0' id 'io.spring.dependency-management' version '1.1.4' } ``` 2. **打包命令** ```bash ./gradlew bootJar ``` --- #### 四、验证打包结果 1. 检查MANIFEST.MF文件: ```bash unzip -p target/*.jar META-INF/MANIFEST.MF ``` 应含: ``` Main-Class: org.springframework.boot.loader.JarLauncher Start-Class: com.example.YourApplication ``` 2. 查看依赖是否含: ```bash jar tf target/*.jar | grep BOOT-INF/lib ``` --- ### 常见问题解决 | 问题现象 | 解决方案 | |---------|----------| | "没有主清单属性" | 确认是否添加了`spring-boot-maven-plugin` | | 依赖缺失 | 检查`mvn dependency:tree`是否有冲突 | | 启动时报ClassNotFound | 执行`mvn clean package`重新打包 | | 配置文件未加载 | 确保`application.properties`在`src/main/resources` | --- ### 相关问题 1. Spring Boot可执行JAR和普通WAR有何本质区别? 2. 如何为Spring Boot可执行JAR添加外部配置文件? 3. 多模块项目中如何正确配置Spring Boot打包插件? 4. Spring Boot 3.x在打包机制上有哪些重大更新? 5. 如何为可执行JAR添加JMX监控支持? [^1]: Spring Boot项目打包JAR的基本原理 [^4]: 同时生可执行JAR和普通JAR的方法 [^5]: Spring Boot Maven插件核心配置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值