springboot 外部jar包打包运行

该博客介绍了如何通过Maven插件减少Spring Boot应用Jar包的大小。首先,使用`dependency:copy-dependencies`命令将第三方依赖移至单独目录。接着,修改pom.xml,配置`spring-boot-maven-plugin`只打包应用自身代码,排除静态资源和其他未测试内容,从而创建一个小型化的Jar包。

按传统方法打成一个Jar包,大小大概是60M:

主要是在Jar里的blog1.jar\BOOT-INF\lib\这个目录下,把所有依赖的第三方Jar全加进来了。

解决方法:

第1步:将第三方Jar单独存放,使用下面的命令,把依赖的包放到D:\temp\lib:

mvn dependency:copy-dependencies -DoutputDirectory=D:\temp\lib -DincludeScope=runtime

第2步:单独打包我们自己写的代码,修改pom.xml:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <mainClass>com.test.DemoApplication</mainClass>
        <layout>ZIP</layout>
        <includes>
            <include>
                <groupId>nothing</groupId>
                <artifactId>nothing</artifactId>
            </include>
        </includes>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

打出来的包,只有几百K,注意需要删除 static文件夹

未测试不打包其他

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <excludes>
                        <exclude>static/*</exclude>
                        <exclude>velocity_template/*</exclude>
                        <exclude>application.yml</exclude>
                    </excludes>
                </configuration>
            </plugin>

<think>我们正在解决一个Spring Boot项目打包运行非主类的问题。根据引用[3],我们可以使用Spring Boot的PropertiesLauncher来指定要运行的主类。具体步骤如下: 1. 在pom.xml中配置spring-boot-maven-plugin插件,指定PropertiesLauncher作为启动器(即layout为ZIP)。 2. 使用命令行运行jar时,通过`-Dloader.main`参数指定要运行的非主类的全限定名。 ### 具体步骤 #### 第一步:修改pom.xml配置 在pom.xml的spring-boot-maven-plugin插件配置中,添加layout属性为ZIP,这样打包时会含PropertiesLauncher。 ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!-- 使用PropertiesLauncher --> <layout>ZIP</layout> </configuration> </plugin> </plugins> </build> ``` #### 第二步:打包项目 使用Maven命令打包项目: ```bash mvn clean package ``` #### 第三步:运行非主类 假设我们要运行的类为`com.example.NonMainClass`,该类中有一个`main`方法。使用以下命令运行: ```bash java -cp your-application.jar -Dloader.main=com.example.NonMainClass org.springframework.boot.loader.PropertiesLauncher ``` ### 参数说明 - `-cp your-application.jar`:指定jar路径。 - `-Dloader.main=com.example.NonMainClass`:设置要运行的主类(即我们自定义的非主类)。 - `org.springframework.boot.loader.PropertiesLauncher`:使用Spring Boot的PropertiesLauncher来启动。 ### 注意事项 1. **非主类要求**:要运行的类必须有一个`public static void main(String[] args)`方法,否则无法启动[^3]。 2. **依赖问题**:如果非主类依赖Spring容器,需要确保Spring上下文正确初始化。例如,如果非主类中需要用到Spring Bean,可能需要先启动Spring容器。 3. **测试类运行**:如果只是想运行一个测试方法,可以考虑使用Spring Boot Test提供的测试工具,而不是通过这种方式运行。 ### 示例场景 假设我们有一个非主类`com.example.demo.TestApplication`,其内容如下: ```java package com.example.demo; public class TestApplication { public static void main(String[] args) { System.out.println("This is a non-main class."); } } ``` 运行命令为: ```bash java -cp demo-0.0.1-SNAPSHOT.jar -Dloader.main=com.example.demo.TestApplication org.springframework.boot.loader.PropertiesLauncher ``` ### 引用说明 - 引用[3]提供了通过命令行运行非主类的方法,使用`-Dloader.main`参数指定主类,并使用`org.springframework.boot.loader.PropertiesLauncher`作为启动器。 ### 相关问题 §§相关问题§§ 1. 如何在Spring Boot项目中运行多个主类? 2. 如何通过命令行参数传递到非主类的main方法? 3. 如何在非主类中启动Spring容器? 4. Spring Boot PropertiesLauncher 还有哪些其他用途?</think>在 Spring Boot 项目中打包JAR运行非主类的方法,可以通过以下步骤实现: ### 解决方案(基于引用[3]的实现) #### 1. 配置 Maven 插件(pom.xml) ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!-- 关键配置:启用 PropertiesLauncher --> <layout>ZIP</layout> <mainClass>org.springframework.boot.loader.PropertiesLauncher</mainClass> </configuration> </plugin> </plugins> </build> ``` #### 2. 打包应用程序 ```bash mvn clean package ``` #### 3. 运行非主类方法 ```bash java -cp target/your-app.jar -Dloader.main=com.yourpackage.NonMainClass org.springframework.boot.loader.PropertiesLauncher ``` ### 关键参数说明 | **参数** | **说明** | **示例** | |----------|----------|----------| | `-cp` | 指定 JAR 文件路径 | `-cp target/demo-app-0.0.1.jar` | | `-Dloader.main` | 指定要运行的非主类全限定名 | `-Dloader.main=com.example.util.DataProcessor` | | `PropertiesLauncher` | Spring Boot 的特殊启动器 | `org.springframework.boot.loader.PropertiesLauncher` | ### 完整示例场景 假设需要运行 `DataExportTask` 类中的 main 方法: 1. **目标类代码**: ```java package com.example.tasks; public class DataExportTask { public static void main(String[] args) { System.out.println("执行数据导出任务..."); // 业务逻辑代码 } } ``` 2. **运行命令**: ```bash java -cp target/demo-app-0.0.1.jar \ -Dloader.main=com.example.tasks.DataExportTask \ org.springframework.boot.loader.PropertiesLauncher ``` ### 注意事项 1. **类路径问题**: - 非主类必须位于主 JAR 内或依赖路径中 - 如需额外依赖,使用 `-Dloader.path=lib/` 指定外部库路径[^3] 2. **参数传递**: ```bash # 向非主类传递参数 java -cp app.jar -Dloader.main=com.example.JobRunner \ -Dexec.args="arg1 arg2" \ org.springframework.boot.loader.PropertiesLauncher ``` 3. **测试问题处理**: - 如引用[4]所示,确保测试不会因缺失资源而失败 - 在 `pom.xml` 中跳过测试: ```xml <properties> <skipTests>true</skipTests> </properties> ``` 4. **清单文件验证**: - 如引用[1]所述,验证 JAR 的 `MANIFEST.MF` 含: ``` Main-Class: org.springframework.boot.loader.PropertiesLauncher ``` > **提示**:此方法适用于运行定时任务、批处理作业或工具类,无需启动完整 Spring 应用上下文[^3]。 ### 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值